1 /* Print i386 instructions for GDB, the GNU debugger. 2 Copyright (C) 1988-2019 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 41 #include <setjmp.h> 42 43 static int print_insn (bfd_vma, disassemble_info *); 44 static void dofloat (int); 45 static void OP_ST (int, int); 46 static void OP_STi (int, int); 47 static int putop (const char *, int); 48 static void oappend (const char *); 49 static void append_seg (void); 50 static void OP_indirE (int, int); 51 static void print_operand_value (char *, int, bfd_vma); 52 static void OP_E_register (int, int); 53 static void OP_E_memory (int, int); 54 static void print_displacement (char *, bfd_vma); 55 static void OP_E (int, int); 56 static void OP_G (int, int); 57 static bfd_vma get64 (void); 58 static bfd_signed_vma get32 (void); 59 static bfd_signed_vma get32s (void); 60 static int get16 (void); 61 static void set_op (bfd_vma, int); 62 static void OP_Skip_MODRM (int, int); 63 static void OP_REG (int, int); 64 static void OP_IMREG (int, int); 65 static void OP_I (int, int); 66 static void OP_I64 (int, int); 67 static void OP_sI (int, int); 68 static void OP_J (int, int); 69 static void OP_SEG (int, int); 70 static void OP_DIR (int, int); 71 static void OP_OFF (int, int); 72 static void OP_OFF64 (int, int); 73 static void ptr_reg (int, int); 74 static void OP_ESreg (int, int); 75 static void OP_DSreg (int, int); 76 static void OP_C (int, int); 77 static void OP_D (int, int); 78 static void OP_T (int, int); 79 static void OP_R (int, int); 80 static void OP_MMX (int, int); 81 static void OP_XMM (int, int); 82 static void OP_EM (int, int); 83 static void OP_EX (int, int); 84 static void OP_EMC (int,int); 85 static void OP_MXC (int,int); 86 static void OP_MS (int, int); 87 static void OP_XS (int, int); 88 static void OP_M (int, int); 89 static void OP_VEX (int, int); 90 static void OP_EX_Vex (int, int); 91 static void OP_EX_VexW (int, int); 92 static void OP_EX_VexImmW (int, int); 93 static void OP_XMM_Vex (int, int); 94 static void OP_XMM_VexW (int, int); 95 static void OP_Rounding (int, int); 96 static void OP_REG_VexI4 (int, int); 97 static void PCLMUL_Fixup (int, int); 98 static void VCMP_Fixup (int, int); 99 static void VPCMP_Fixup (int, int); 100 static void VPCOM_Fixup (int, int); 101 static void OP_0f07 (int, int); 102 static void OP_Monitor (int, int); 103 static void OP_Mwait (int, int); 104 static void OP_Mwaitx (int, int); 105 static void NOP_Fixup1 (int, int); 106 static void NOP_Fixup2 (int, int); 107 static void OP_3DNowSuffix (int, int); 108 static void CMP_Fixup (int, int); 109 static void BadOp (void); 110 static void REP_Fixup (int, int); 111 static void BND_Fixup (int, int); 112 static void NOTRACK_Fixup (int, int); 113 static void HLE_Fixup1 (int, int); 114 static void HLE_Fixup2 (int, int); 115 static void HLE_Fixup3 (int, int); 116 static void CMPXCHG8B_Fixup (int, int); 117 static void XMM_Fixup (int, int); 118 static void CRC32_Fixup (int, int); 119 static void FXSAVE_Fixup (int, int); 120 static void PCMPESTR_Fixup (int, int); 121 static void OP_LWPCB_E (int, int); 122 static void OP_LWP_E (int, int); 123 static void OP_Vex_2src_1 (int, int); 124 static void OP_Vex_2src_2 (int, int); 125 126 static void MOVBE_Fixup (int, int); 127 128 static void OP_Mask (int, int); 129 130 struct dis_private { 131 /* Points to first byte not fetched. */ 132 bfd_byte *max_fetched; 133 bfd_byte the_buffer[MAX_MNEM_SIZE]; 134 bfd_vma insn_start; 135 int orig_sizeflag; 136 OPCODES_SIGJMP_BUF bailout; 137 }; 138 139 enum address_mode 140 { 141 mode_16bit, 142 mode_32bit, 143 mode_64bit 144 }; 145 146 enum address_mode address_mode; 147 148 /* Flags for the prefixes for the current instruction. See below. */ 149 static int prefixes; 150 151 /* REX prefix the current instruction. See below. */ 152 static int rex; 153 /* Bits of REX we've already used. */ 154 static int rex_used; 155 /* REX bits in original REX prefix ignored. */ 156 static int rex_ignored; 157 /* Mark parts used in the REX prefix. When we are testing for 158 empty prefix (for 8bit register REX extension), just mask it 159 out. Otherwise test for REX bit is excuse for existence of REX 160 only in case value is nonzero. */ 161 #define USED_REX(value) \ 162 { \ 163 if (value) \ 164 { \ 165 if ((rex & value)) \ 166 rex_used |= (value) | REX_OPCODE; \ 167 } \ 168 else \ 169 rex_used |= REX_OPCODE; \ 170 } 171 172 /* Flags for prefixes which we somehow handled when printing the 173 current instruction. */ 174 static int used_prefixes; 175 176 /* Flags stored in PREFIXES. */ 177 #define PREFIX_REPZ 1 178 #define PREFIX_REPNZ 2 179 #define PREFIX_LOCK 4 180 #define PREFIX_CS 8 181 #define PREFIX_SS 0x10 182 #define PREFIX_DS 0x20 183 #define PREFIX_ES 0x40 184 #define PREFIX_FS 0x80 185 #define PREFIX_GS 0x100 186 #define PREFIX_DATA 0x200 187 #define PREFIX_ADDR 0x400 188 #define PREFIX_FWAIT 0x800 189 190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) 191 to ADDR (exclusive) are valid. Returns 1 for success, longjmps 192 on error. */ 193 #define FETCH_DATA(info, addr) \ 194 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \ 195 ? 1 : fetch_data ((info), (addr))) 196 197 static int 198 fetch_data (struct disassemble_info *info, bfd_byte *addr) 199 { 200 int status; 201 struct dis_private *priv = (struct dis_private *) info->private_data; 202 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); 203 204 if (addr <= priv->the_buffer + MAX_MNEM_SIZE) 205 status = (*info->read_memory_func) (start, 206 priv->max_fetched, 207 addr - priv->max_fetched, 208 info); 209 else 210 status = -1; 211 if (status != 0) 212 { 213 /* If we did manage to read at least one byte, then 214 print_insn_i386 will do something sensible. Otherwise, print 215 an error. We do that here because this is where we know 216 STATUS. */ 217 if (priv->max_fetched == priv->the_buffer) 218 (*info->memory_error_func) (status, start, info); 219 OPCODES_SIGLONGJMP (priv->bailout, 1); 220 } 221 else 222 priv->max_fetched = addr; 223 return 1; 224 } 225 226 /* Possible values for prefix requirement. */ 227 #define PREFIX_IGNORED_SHIFT 16 228 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT) 229 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT) 230 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT) 231 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT) 232 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT) 233 234 /* Opcode prefixes. */ 235 #define PREFIX_OPCODE (PREFIX_REPZ \ 236 | PREFIX_REPNZ \ 237 | PREFIX_DATA) 238 239 /* Prefixes ignored. */ 240 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \ 241 | PREFIX_IGNORED_REPNZ \ 242 | PREFIX_IGNORED_DATA) 243 244 #define XX { NULL, 0 } 245 #define Bad_Opcode NULL, { { NULL, 0 } }, 0 246 247 #define Eb { OP_E, b_mode } 248 #define Ebnd { OP_E, bnd_mode } 249 #define EbS { OP_E, b_swap_mode } 250 #define EbndS { OP_E, bnd_swap_mode } 251 #define Ev { OP_E, v_mode } 252 #define Eva { OP_E, va_mode } 253 #define Ev_bnd { OP_E, v_bnd_mode } 254 #define EvS { OP_E, v_swap_mode } 255 #define Ed { OP_E, d_mode } 256 #define Edq { OP_E, dq_mode } 257 #define Edqw { OP_E, dqw_mode } 258 #define Edqb { OP_E, dqb_mode } 259 #define Edb { OP_E, db_mode } 260 #define Edw { OP_E, dw_mode } 261 #define Edqd { OP_E, dqd_mode } 262 #define Edqa { OP_E, dqa_mode } 263 #define Eq { OP_E, q_mode } 264 #define indirEv { OP_indirE, indir_v_mode } 265 #define indirEp { OP_indirE, f_mode } 266 #define stackEv { OP_E, stack_v_mode } 267 #define Em { OP_E, m_mode } 268 #define Ew { OP_E, w_mode } 269 #define M { OP_M, 0 } /* lea, lgdt, etc. */ 270 #define Ma { OP_M, a_mode } 271 #define Mb { OP_M, b_mode } 272 #define Md { OP_M, d_mode } 273 #define Mo { OP_M, o_mode } 274 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */ 275 #define Mq { OP_M, q_mode } 276 #define Mv_bnd { OP_M, v_bndmk_mode } 277 #define Mx { OP_M, x_mode } 278 #define Mxmm { OP_M, xmm_mode } 279 #define Gb { OP_G, b_mode } 280 #define Gbnd { OP_G, bnd_mode } 281 #define Gv { OP_G, v_mode } 282 #define Gd { OP_G, d_mode } 283 #define Gdq { OP_G, dq_mode } 284 #define Gm { OP_G, m_mode } 285 #define Gva { OP_G, va_mode } 286 #define Gw { OP_G, w_mode } 287 #define Rd { OP_R, d_mode } 288 #define Rdq { OP_R, dq_mode } 289 #define Rm { OP_R, m_mode } 290 #define Ib { OP_I, b_mode } 291 #define sIb { OP_sI, b_mode } /* sign extened byte */ 292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */ 293 #define Iv { OP_I, v_mode } 294 #define sIv { OP_sI, v_mode } 295 #define Iq { OP_I, q_mode } 296 #define Iv64 { OP_I64, v_mode } 297 #define Iw { OP_I, w_mode } 298 #define I1 { OP_I, const_1_mode } 299 #define Jb { OP_J, b_mode } 300 #define Jv { OP_J, v_mode } 301 #define Cm { OP_C, m_mode } 302 #define Dm { OP_D, m_mode } 303 #define Td { OP_T, d_mode } 304 #define Skip_MODRM { OP_Skip_MODRM, 0 } 305 306 #define RMeAX { OP_REG, eAX_reg } 307 #define RMeBX { OP_REG, eBX_reg } 308 #define RMeCX { OP_REG, eCX_reg } 309 #define RMeDX { OP_REG, eDX_reg } 310 #define RMeSP { OP_REG, eSP_reg } 311 #define RMeBP { OP_REG, eBP_reg } 312 #define RMeSI { OP_REG, eSI_reg } 313 #define RMeDI { OP_REG, eDI_reg } 314 #define RMrAX { OP_REG, rAX_reg } 315 #define RMrBX { OP_REG, rBX_reg } 316 #define RMrCX { OP_REG, rCX_reg } 317 #define RMrDX { OP_REG, rDX_reg } 318 #define RMrSP { OP_REG, rSP_reg } 319 #define RMrBP { OP_REG, rBP_reg } 320 #define RMrSI { OP_REG, rSI_reg } 321 #define RMrDI { OP_REG, rDI_reg } 322 #define RMAL { OP_REG, al_reg } 323 #define RMCL { OP_REG, cl_reg } 324 #define RMDL { OP_REG, dl_reg } 325 #define RMBL { OP_REG, bl_reg } 326 #define RMAH { OP_REG, ah_reg } 327 #define RMCH { OP_REG, ch_reg } 328 #define RMDH { OP_REG, dh_reg } 329 #define RMBH { OP_REG, bh_reg } 330 #define RMAX { OP_REG, ax_reg } 331 #define RMDX { OP_REG, dx_reg } 332 333 #define eAX { OP_IMREG, eAX_reg } 334 #define eBX { OP_IMREG, eBX_reg } 335 #define eCX { OP_IMREG, eCX_reg } 336 #define eDX { OP_IMREG, eDX_reg } 337 #define eSP { OP_IMREG, eSP_reg } 338 #define eBP { OP_IMREG, eBP_reg } 339 #define eSI { OP_IMREG, eSI_reg } 340 #define eDI { OP_IMREG, eDI_reg } 341 #define AL { OP_IMREG, al_reg } 342 #define CL { OP_IMREG, cl_reg } 343 #define DL { OP_IMREG, dl_reg } 344 #define BL { OP_IMREG, bl_reg } 345 #define AH { OP_IMREG, ah_reg } 346 #define CH { OP_IMREG, ch_reg } 347 #define DH { OP_IMREG, dh_reg } 348 #define BH { OP_IMREG, bh_reg } 349 #define AX { OP_IMREG, ax_reg } 350 #define DX { OP_IMREG, dx_reg } 351 #define zAX { OP_IMREG, z_mode_ax_reg } 352 #define indirDX { OP_IMREG, indir_dx_reg } 353 354 #define Sw { OP_SEG, w_mode } 355 #define Sv { OP_SEG, v_mode } 356 #define Ap { OP_DIR, 0 } 357 #define Ob { OP_OFF64, b_mode } 358 #define Ov { OP_OFF64, v_mode } 359 #define Xb { OP_DSreg, eSI_reg } 360 #define Xv { OP_DSreg, eSI_reg } 361 #define Xz { OP_DSreg, eSI_reg } 362 #define Yb { OP_ESreg, eDI_reg } 363 #define Yv { OP_ESreg, eDI_reg } 364 #define DSBX { OP_DSreg, eBX_reg } 365 366 #define es { OP_REG, es_reg } 367 #define ss { OP_REG, ss_reg } 368 #define cs { OP_REG, cs_reg } 369 #define ds { OP_REG, ds_reg } 370 #define fs { OP_REG, fs_reg } 371 #define gs { OP_REG, gs_reg } 372 373 #define MX { OP_MMX, 0 } 374 #define XM { OP_XMM, 0 } 375 #define XMScalar { OP_XMM, scalar_mode } 376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode } 377 #define XMM { OP_XMM, xmm_mode } 378 #define XMxmmq { OP_XMM, xmmq_mode } 379 #define EM { OP_EM, v_mode } 380 #define EMS { OP_EM, v_swap_mode } 381 #define EMd { OP_EM, d_mode } 382 #define EMx { OP_EM, x_mode } 383 #define EXbScalar { OP_EX, b_scalar_mode } 384 #define EXw { OP_EX, w_mode } 385 #define EXwScalar { OP_EX, w_scalar_mode } 386 #define EXd { OP_EX, d_mode } 387 #define EXdScalar { OP_EX, d_scalar_mode } 388 #define EXdS { OP_EX, d_swap_mode } 389 #define EXdScalarS { OP_EX, d_scalar_swap_mode } 390 #define EXq { OP_EX, q_mode } 391 #define EXqScalar { OP_EX, q_scalar_mode } 392 #define EXqScalarS { OP_EX, q_scalar_swap_mode } 393 #define EXqS { OP_EX, q_swap_mode } 394 #define EXx { OP_EX, x_mode } 395 #define EXxS { OP_EX, x_swap_mode } 396 #define EXxmm { OP_EX, xmm_mode } 397 #define EXymm { OP_EX, ymm_mode } 398 #define EXxmmq { OP_EX, xmmq_mode } 399 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode } 400 #define EXxmm_mb { OP_EX, xmm_mb_mode } 401 #define EXxmm_mw { OP_EX, xmm_mw_mode } 402 #define EXxmm_md { OP_EX, xmm_md_mode } 403 #define EXxmm_mq { OP_EX, xmm_mq_mode } 404 #define EXxmm_mdq { OP_EX, xmm_mdq_mode } 405 #define EXxmmdw { OP_EX, xmmdw_mode } 406 #define EXxmmqd { OP_EX, xmmqd_mode } 407 #define EXymmq { OP_EX, ymmq_mode } 408 #define EXVexWdq { OP_EX, vex_w_dq_mode } 409 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode } 410 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode } 411 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode } 412 #define MS { OP_MS, v_mode } 413 #define XS { OP_XS, v_mode } 414 #define EMCq { OP_EMC, q_mode } 415 #define MXC { OP_MXC, 0 } 416 #define OPSUF { OP_3DNowSuffix, 0 } 417 #define CMP { CMP_Fixup, 0 } 418 #define XMM0 { XMM_Fixup, 0 } 419 #define FXSAVE { FXSAVE_Fixup, 0 } 420 #define Vex_2src_1 { OP_Vex_2src_1, 0 } 421 #define Vex_2src_2 { OP_Vex_2src_2, 0 } 422 423 #define Vex { OP_VEX, vex_mode } 424 #define VexScalar { OP_VEX, vex_scalar_mode } 425 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode } 426 #define Vex128 { OP_VEX, vex128_mode } 427 #define Vex256 { OP_VEX, vex256_mode } 428 #define VexGdq { OP_VEX, dq_mode } 429 #define EXdVex { OP_EX_Vex, d_mode } 430 #define EXdVexS { OP_EX_Vex, d_swap_mode } 431 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode } 432 #define EXqVex { OP_EX_Vex, q_mode } 433 #define EXqVexS { OP_EX_Vex, q_swap_mode } 434 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode } 435 #define EXVexW { OP_EX_VexW, x_mode } 436 #define EXdVexW { OP_EX_VexW, d_mode } 437 #define EXqVexW { OP_EX_VexW, q_mode } 438 #define EXVexImmW { OP_EX_VexImmW, x_mode } 439 #define XMVex { OP_XMM_Vex, 0 } 440 #define XMVexScalar { OP_XMM_Vex, scalar_mode } 441 #define XMVexW { OP_XMM_VexW, 0 } 442 #define XMVexI4 { OP_REG_VexI4, x_mode } 443 #define PCLMUL { PCLMUL_Fixup, 0 } 444 #define VCMP { VCMP_Fixup, 0 } 445 #define VPCMP { VPCMP_Fixup, 0 } 446 #define VPCOM { VPCOM_Fixup, 0 } 447 448 #define EXxEVexR { OP_Rounding, evex_rounding_mode } 449 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode } 450 #define EXxEVexS { OP_Rounding, evex_sae_mode } 451 452 #define XMask { OP_Mask, mask_mode } 453 #define MaskG { OP_G, mask_mode } 454 #define MaskE { OP_E, mask_mode } 455 #define MaskBDE { OP_E, mask_bd_mode } 456 #define MaskR { OP_R, mask_mode } 457 #define MaskVex { OP_VEX, mask_mode } 458 459 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode } 460 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode } 461 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode } 462 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode } 463 464 /* Used handle "rep" prefix for string instructions. */ 465 #define Xbr { REP_Fixup, eSI_reg } 466 #define Xvr { REP_Fixup, eSI_reg } 467 #define Ybr { REP_Fixup, eDI_reg } 468 #define Yvr { REP_Fixup, eDI_reg } 469 #define Yzr { REP_Fixup, eDI_reg } 470 #define indirDXr { REP_Fixup, indir_dx_reg } 471 #define ALr { REP_Fixup, al_reg } 472 #define eAXr { REP_Fixup, eAX_reg } 473 474 /* Used handle HLE prefix for lockable instructions. */ 475 #define Ebh1 { HLE_Fixup1, b_mode } 476 #define Evh1 { HLE_Fixup1, v_mode } 477 #define Ebh2 { HLE_Fixup2, b_mode } 478 #define Evh2 { HLE_Fixup2, v_mode } 479 #define Ebh3 { HLE_Fixup3, b_mode } 480 #define Evh3 { HLE_Fixup3, v_mode } 481 482 #define BND { BND_Fixup, 0 } 483 #define NOTRACK { NOTRACK_Fixup, 0 } 484 485 #define cond_jump_flag { NULL, cond_jump_mode } 486 #define loop_jcxz_flag { NULL, loop_jcxz_mode } 487 488 /* bits in sizeflag */ 489 #define SUFFIX_ALWAYS 4 490 #define AFLAG 2 491 #define DFLAG 1 492 493 enum 494 { 495 /* byte operand */ 496 b_mode = 1, 497 /* byte operand with operand swapped */ 498 b_swap_mode, 499 /* byte operand, sign extend like 'T' suffix */ 500 b_T_mode, 501 /* operand size depends on prefixes */ 502 v_mode, 503 /* operand size depends on prefixes with operand swapped */ 504 v_swap_mode, 505 /* operand size depends on address prefix */ 506 va_mode, 507 /* word operand */ 508 w_mode, 509 /* double word operand */ 510 d_mode, 511 /* double word operand with operand swapped */ 512 d_swap_mode, 513 /* quad word operand */ 514 q_mode, 515 /* quad word operand with operand swapped */ 516 q_swap_mode, 517 /* ten-byte operand */ 518 t_mode, 519 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with 520 broadcast enabled. */ 521 x_mode, 522 /* Similar to x_mode, but with different EVEX mem shifts. */ 523 evex_x_gscat_mode, 524 /* Similar to x_mode, but with disabled broadcast. */ 525 evex_x_nobcst_mode, 526 /* Similar to x_mode, but with operands swapped and disabled broadcast 527 in EVEX. */ 528 x_swap_mode, 529 /* 16-byte XMM operand */ 530 xmm_mode, 531 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword 532 memory operand (depending on vector length). Broadcast isn't 533 allowed. */ 534 xmmq_mode, 535 /* Same as xmmq_mode, but broadcast is allowed. */ 536 evex_half_bcst_xmmq_mode, 537 /* XMM register or byte memory operand */ 538 xmm_mb_mode, 539 /* XMM register or word memory operand */ 540 xmm_mw_mode, 541 /* XMM register or double word memory operand */ 542 xmm_md_mode, 543 /* XMM register or quad word memory operand */ 544 xmm_mq_mode, 545 /* XMM register or double/quad word memory operand, depending on 546 VEX.W. */ 547 xmm_mdq_mode, 548 /* 16-byte XMM, word, double word or quad word operand. */ 549 xmmdw_mode, 550 /* 16-byte XMM, double word, quad word operand or xmm word operand. */ 551 xmmqd_mode, 552 /* 32-byte YMM operand */ 553 ymm_mode, 554 /* quad word, ymmword or zmmword memory operand. */ 555 ymmq_mode, 556 /* 32-byte YMM or 16-byte word operand */ 557 ymmxmm_mode, 558 /* d_mode in 32bit, q_mode in 64bit mode. */ 559 m_mode, 560 /* pair of v_mode operands */ 561 a_mode, 562 cond_jump_mode, 563 loop_jcxz_mode, 564 v_bnd_mode, 565 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */ 566 v_bndmk_mode, 567 /* operand size depends on REX prefixes. */ 568 dq_mode, 569 /* registers like dq_mode, memory like w_mode. */ 570 dqw_mode, 571 /* bounds operand */ 572 bnd_mode, 573 /* bounds operand with operand swapped */ 574 bnd_swap_mode, 575 /* 4- or 6-byte pointer operand */ 576 f_mode, 577 const_1_mode, 578 /* v_mode for indirect branch opcodes. */ 579 indir_v_mode, 580 /* v_mode for stack-related opcodes. */ 581 stack_v_mode, 582 /* non-quad operand size depends on prefixes */ 583 z_mode, 584 /* 16-byte operand */ 585 o_mode, 586 /* registers like dq_mode, memory like b_mode. */ 587 dqb_mode, 588 /* registers like d_mode, memory like b_mode. */ 589 db_mode, 590 /* registers like d_mode, memory like w_mode. */ 591 dw_mode, 592 /* registers like dq_mode, memory like d_mode. */ 593 dqd_mode, 594 /* operand size depends on the W bit as well as address mode. */ 595 dqa_mode, 596 /* normal vex mode */ 597 vex_mode, 598 /* 128bit vex mode */ 599 vex128_mode, 600 /* 256bit vex mode */ 601 vex256_mode, 602 /* operand size depends on the VEX.W bit. */ 603 vex_w_dq_mode, 604 605 /* Similar to vex_w_dq_mode, with VSIB dword indices. */ 606 vex_vsib_d_w_dq_mode, 607 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */ 608 vex_vsib_d_w_d_mode, 609 /* Similar to vex_w_dq_mode, with VSIB qword indices. */ 610 vex_vsib_q_w_dq_mode, 611 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */ 612 vex_vsib_q_w_d_mode, 613 614 /* scalar, ignore vector length. */ 615 scalar_mode, 616 /* like b_mode, ignore vector length. */ 617 b_scalar_mode, 618 /* like w_mode, ignore vector length. */ 619 w_scalar_mode, 620 /* like d_mode, ignore vector length. */ 621 d_scalar_mode, 622 /* like d_swap_mode, ignore vector length. */ 623 d_scalar_swap_mode, 624 /* like q_mode, ignore vector length. */ 625 q_scalar_mode, 626 /* like q_swap_mode, ignore vector length. */ 627 q_scalar_swap_mode, 628 /* like vex_mode, ignore vector length. */ 629 vex_scalar_mode, 630 /* like vex_w_dq_mode, ignore vector length. */ 631 vex_scalar_w_dq_mode, 632 633 /* Static rounding. */ 634 evex_rounding_mode, 635 /* Static rounding, 64-bit mode only. */ 636 evex_rounding_64_mode, 637 /* Supress all exceptions. */ 638 evex_sae_mode, 639 640 /* Mask register operand. */ 641 mask_mode, 642 /* Mask register operand. */ 643 mask_bd_mode, 644 645 es_reg, 646 cs_reg, 647 ss_reg, 648 ds_reg, 649 fs_reg, 650 gs_reg, 651 652 eAX_reg, 653 eCX_reg, 654 eDX_reg, 655 eBX_reg, 656 eSP_reg, 657 eBP_reg, 658 eSI_reg, 659 eDI_reg, 660 661 al_reg, 662 cl_reg, 663 dl_reg, 664 bl_reg, 665 ah_reg, 666 ch_reg, 667 dh_reg, 668 bh_reg, 669 670 ax_reg, 671 cx_reg, 672 dx_reg, 673 bx_reg, 674 sp_reg, 675 bp_reg, 676 si_reg, 677 di_reg, 678 679 rAX_reg, 680 rCX_reg, 681 rDX_reg, 682 rBX_reg, 683 rSP_reg, 684 rBP_reg, 685 rSI_reg, 686 rDI_reg, 687 688 z_mode_ax_reg, 689 indir_dx_reg 690 }; 691 692 enum 693 { 694 FLOATCODE = 1, 695 USE_REG_TABLE, 696 USE_MOD_TABLE, 697 USE_RM_TABLE, 698 USE_PREFIX_TABLE, 699 USE_X86_64_TABLE, 700 USE_3BYTE_TABLE, 701 USE_XOP_8F_TABLE, 702 USE_VEX_C4_TABLE, 703 USE_VEX_C5_TABLE, 704 USE_VEX_LEN_TABLE, 705 USE_VEX_W_TABLE, 706 USE_EVEX_TABLE, 707 USE_EVEX_LEN_TABLE 708 }; 709 710 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0 711 712 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0 713 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P 714 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I)) 715 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I)) 716 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I)) 717 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I)) 718 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I)) 719 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I)) 720 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P) 721 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I)) 722 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I)) 723 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I)) 724 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I)) 725 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I)) 726 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I)) 727 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I)) 728 729 enum 730 { 731 REG_80 = 0, 732 REG_81, 733 REG_83, 734 REG_8F, 735 REG_C0, 736 REG_C1, 737 REG_C6, 738 REG_C7, 739 REG_D0, 740 REG_D1, 741 REG_D2, 742 REG_D3, 743 REG_F6, 744 REG_F7, 745 REG_FE, 746 REG_FF, 747 REG_0F00, 748 REG_0F01, 749 REG_0F0D, 750 REG_0F18, 751 REG_0F1C_MOD_0, 752 REG_0F1E_MOD_3, 753 REG_0F71, 754 REG_0F72, 755 REG_0F73, 756 REG_0FA6, 757 REG_0FA7, 758 REG_0FAE, 759 REG_0FBA, 760 REG_0FC7, 761 REG_VEX_0F71, 762 REG_VEX_0F72, 763 REG_VEX_0F73, 764 REG_VEX_0FAE, 765 REG_VEX_0F38F3, 766 REG_XOP_LWPCB, 767 REG_XOP_LWP, 768 REG_XOP_TBM_01, 769 REG_XOP_TBM_02, 770 771 REG_EVEX_0F71, 772 REG_EVEX_0F72, 773 REG_EVEX_0F73, 774 REG_EVEX_0F38C6, 775 REG_EVEX_0F38C7 776 }; 777 778 enum 779 { 780 MOD_8D = 0, 781 MOD_C6_REG_7, 782 MOD_C7_REG_7, 783 MOD_FF_REG_3, 784 MOD_FF_REG_5, 785 MOD_0F01_REG_0, 786 MOD_0F01_REG_1, 787 MOD_0F01_REG_2, 788 MOD_0F01_REG_3, 789 MOD_0F01_REG_5, 790 MOD_0F01_REG_7, 791 MOD_0F12_PREFIX_0, 792 MOD_0F13, 793 MOD_0F16_PREFIX_0, 794 MOD_0F17, 795 MOD_0F18_REG_0, 796 MOD_0F18_REG_1, 797 MOD_0F18_REG_2, 798 MOD_0F18_REG_3, 799 MOD_0F18_REG_4, 800 MOD_0F18_REG_5, 801 MOD_0F18_REG_6, 802 MOD_0F18_REG_7, 803 MOD_0F1A_PREFIX_0, 804 MOD_0F1B_PREFIX_0, 805 MOD_0F1B_PREFIX_1, 806 MOD_0F1C_PREFIX_0, 807 MOD_0F1E_PREFIX_1, 808 MOD_0F24, 809 MOD_0F26, 810 MOD_0F2B_PREFIX_0, 811 MOD_0F2B_PREFIX_1, 812 MOD_0F2B_PREFIX_2, 813 MOD_0F2B_PREFIX_3, 814 MOD_0F51, 815 MOD_0F71_REG_2, 816 MOD_0F71_REG_4, 817 MOD_0F71_REG_6, 818 MOD_0F72_REG_2, 819 MOD_0F72_REG_4, 820 MOD_0F72_REG_6, 821 MOD_0F73_REG_2, 822 MOD_0F73_REG_3, 823 MOD_0F73_REG_6, 824 MOD_0F73_REG_7, 825 MOD_0FAE_REG_0, 826 MOD_0FAE_REG_1, 827 MOD_0FAE_REG_2, 828 MOD_0FAE_REG_3, 829 MOD_0FAE_REG_4, 830 MOD_0FAE_REG_5, 831 MOD_0FAE_REG_6, 832 MOD_0FAE_REG_7, 833 MOD_0FB2, 834 MOD_0FB4, 835 MOD_0FB5, 836 MOD_0FC3, 837 MOD_0FC7_REG_3, 838 MOD_0FC7_REG_4, 839 MOD_0FC7_REG_5, 840 MOD_0FC7_REG_6, 841 MOD_0FC7_REG_7, 842 MOD_0FD7, 843 MOD_0FE7_PREFIX_2, 844 MOD_0FF0_PREFIX_3, 845 MOD_0F382A_PREFIX_2, 846 MOD_0F38F5_PREFIX_2, 847 MOD_0F38F6_PREFIX_0, 848 MOD_0F38F8_PREFIX_2, 849 MOD_0F38F9_PREFIX_0, 850 MOD_62_32BIT, 851 MOD_C4_32BIT, 852 MOD_C5_32BIT, 853 MOD_VEX_0F12_PREFIX_0, 854 MOD_VEX_0F13, 855 MOD_VEX_0F16_PREFIX_0, 856 MOD_VEX_0F17, 857 MOD_VEX_0F2B, 858 MOD_VEX_W_0_0F41_P_0_LEN_1, 859 MOD_VEX_W_1_0F41_P_0_LEN_1, 860 MOD_VEX_W_0_0F41_P_2_LEN_1, 861 MOD_VEX_W_1_0F41_P_2_LEN_1, 862 MOD_VEX_W_0_0F42_P_0_LEN_1, 863 MOD_VEX_W_1_0F42_P_0_LEN_1, 864 MOD_VEX_W_0_0F42_P_2_LEN_1, 865 MOD_VEX_W_1_0F42_P_2_LEN_1, 866 MOD_VEX_W_0_0F44_P_0_LEN_1, 867 MOD_VEX_W_1_0F44_P_0_LEN_1, 868 MOD_VEX_W_0_0F44_P_2_LEN_1, 869 MOD_VEX_W_1_0F44_P_2_LEN_1, 870 MOD_VEX_W_0_0F45_P_0_LEN_1, 871 MOD_VEX_W_1_0F45_P_0_LEN_1, 872 MOD_VEX_W_0_0F45_P_2_LEN_1, 873 MOD_VEX_W_1_0F45_P_2_LEN_1, 874 MOD_VEX_W_0_0F46_P_0_LEN_1, 875 MOD_VEX_W_1_0F46_P_0_LEN_1, 876 MOD_VEX_W_0_0F46_P_2_LEN_1, 877 MOD_VEX_W_1_0F46_P_2_LEN_1, 878 MOD_VEX_W_0_0F47_P_0_LEN_1, 879 MOD_VEX_W_1_0F47_P_0_LEN_1, 880 MOD_VEX_W_0_0F47_P_2_LEN_1, 881 MOD_VEX_W_1_0F47_P_2_LEN_1, 882 MOD_VEX_W_0_0F4A_P_0_LEN_1, 883 MOD_VEX_W_1_0F4A_P_0_LEN_1, 884 MOD_VEX_W_0_0F4A_P_2_LEN_1, 885 MOD_VEX_W_1_0F4A_P_2_LEN_1, 886 MOD_VEX_W_0_0F4B_P_0_LEN_1, 887 MOD_VEX_W_1_0F4B_P_0_LEN_1, 888 MOD_VEX_W_0_0F4B_P_2_LEN_1, 889 MOD_VEX_0F50, 890 MOD_VEX_0F71_REG_2, 891 MOD_VEX_0F71_REG_4, 892 MOD_VEX_0F71_REG_6, 893 MOD_VEX_0F72_REG_2, 894 MOD_VEX_0F72_REG_4, 895 MOD_VEX_0F72_REG_6, 896 MOD_VEX_0F73_REG_2, 897 MOD_VEX_0F73_REG_3, 898 MOD_VEX_0F73_REG_6, 899 MOD_VEX_0F73_REG_7, 900 MOD_VEX_W_0_0F91_P_0_LEN_0, 901 MOD_VEX_W_1_0F91_P_0_LEN_0, 902 MOD_VEX_W_0_0F91_P_2_LEN_0, 903 MOD_VEX_W_1_0F91_P_2_LEN_0, 904 MOD_VEX_W_0_0F92_P_0_LEN_0, 905 MOD_VEX_W_0_0F92_P_2_LEN_0, 906 MOD_VEX_0F92_P_3_LEN_0, 907 MOD_VEX_W_0_0F93_P_0_LEN_0, 908 MOD_VEX_W_0_0F93_P_2_LEN_0, 909 MOD_VEX_0F93_P_3_LEN_0, 910 MOD_VEX_W_0_0F98_P_0_LEN_0, 911 MOD_VEX_W_1_0F98_P_0_LEN_0, 912 MOD_VEX_W_0_0F98_P_2_LEN_0, 913 MOD_VEX_W_1_0F98_P_2_LEN_0, 914 MOD_VEX_W_0_0F99_P_0_LEN_0, 915 MOD_VEX_W_1_0F99_P_0_LEN_0, 916 MOD_VEX_W_0_0F99_P_2_LEN_0, 917 MOD_VEX_W_1_0F99_P_2_LEN_0, 918 MOD_VEX_0FAE_REG_2, 919 MOD_VEX_0FAE_REG_3, 920 MOD_VEX_0FD7_PREFIX_2, 921 MOD_VEX_0FE7_PREFIX_2, 922 MOD_VEX_0FF0_PREFIX_3, 923 MOD_VEX_0F381A_PREFIX_2, 924 MOD_VEX_0F382A_PREFIX_2, 925 MOD_VEX_0F382C_PREFIX_2, 926 MOD_VEX_0F382D_PREFIX_2, 927 MOD_VEX_0F382E_PREFIX_2, 928 MOD_VEX_0F382F_PREFIX_2, 929 MOD_VEX_0F385A_PREFIX_2, 930 MOD_VEX_0F388C_PREFIX_2, 931 MOD_VEX_0F388E_PREFIX_2, 932 MOD_VEX_W_0_0F3A30_P_2_LEN_0, 933 MOD_VEX_W_1_0F3A30_P_2_LEN_0, 934 MOD_VEX_W_0_0F3A31_P_2_LEN_0, 935 MOD_VEX_W_1_0F3A31_P_2_LEN_0, 936 MOD_VEX_W_0_0F3A32_P_2_LEN_0, 937 MOD_VEX_W_1_0F3A32_P_2_LEN_0, 938 MOD_VEX_W_0_0F3A33_P_2_LEN_0, 939 MOD_VEX_W_1_0F3A33_P_2_LEN_0, 940 941 MOD_EVEX_0F10_PREFIX_1, 942 MOD_EVEX_0F10_PREFIX_3, 943 MOD_EVEX_0F11_PREFIX_1, 944 MOD_EVEX_0F11_PREFIX_3, 945 MOD_EVEX_0F12_PREFIX_0, 946 MOD_EVEX_0F16_PREFIX_0, 947 MOD_EVEX_0F38C6_REG_1, 948 MOD_EVEX_0F38C6_REG_2, 949 MOD_EVEX_0F38C6_REG_5, 950 MOD_EVEX_0F38C6_REG_6, 951 MOD_EVEX_0F38C7_REG_1, 952 MOD_EVEX_0F38C7_REG_2, 953 MOD_EVEX_0F38C7_REG_5, 954 MOD_EVEX_0F38C7_REG_6 955 }; 956 957 enum 958 { 959 RM_C6_REG_7 = 0, 960 RM_C7_REG_7, 961 RM_0F01_REG_0, 962 RM_0F01_REG_1, 963 RM_0F01_REG_2, 964 RM_0F01_REG_3, 965 RM_0F01_REG_5, 966 RM_0F01_REG_7, 967 RM_0F1E_MOD_3_REG_7, 968 RM_0FAE_REG_6, 969 RM_0FAE_REG_7 970 }; 971 972 enum 973 { 974 PREFIX_90 = 0, 975 PREFIX_MOD_0_0F01_REG_5, 976 PREFIX_MOD_3_0F01_REG_5_RM_0, 977 PREFIX_MOD_3_0F01_REG_5_RM_2, 978 PREFIX_0F09, 979 PREFIX_0F10, 980 PREFIX_0F11, 981 PREFIX_0F12, 982 PREFIX_0F16, 983 PREFIX_0F1A, 984 PREFIX_0F1B, 985 PREFIX_0F1C, 986 PREFIX_0F1E, 987 PREFIX_0F2A, 988 PREFIX_0F2B, 989 PREFIX_0F2C, 990 PREFIX_0F2D, 991 PREFIX_0F2E, 992 PREFIX_0F2F, 993 PREFIX_0F51, 994 PREFIX_0F52, 995 PREFIX_0F53, 996 PREFIX_0F58, 997 PREFIX_0F59, 998 PREFIX_0F5A, 999 PREFIX_0F5B, 1000 PREFIX_0F5C, 1001 PREFIX_0F5D, 1002 PREFIX_0F5E, 1003 PREFIX_0F5F, 1004 PREFIX_0F60, 1005 PREFIX_0F61, 1006 PREFIX_0F62, 1007 PREFIX_0F6C, 1008 PREFIX_0F6D, 1009 PREFIX_0F6F, 1010 PREFIX_0F70, 1011 PREFIX_0F73_REG_3, 1012 PREFIX_0F73_REG_7, 1013 PREFIX_0F78, 1014 PREFIX_0F79, 1015 PREFIX_0F7C, 1016 PREFIX_0F7D, 1017 PREFIX_0F7E, 1018 PREFIX_0F7F, 1019 PREFIX_0FAE_REG_0, 1020 PREFIX_0FAE_REG_1, 1021 PREFIX_0FAE_REG_2, 1022 PREFIX_0FAE_REG_3, 1023 PREFIX_MOD_0_0FAE_REG_4, 1024 PREFIX_MOD_3_0FAE_REG_4, 1025 PREFIX_MOD_0_0FAE_REG_5, 1026 PREFIX_MOD_3_0FAE_REG_5, 1027 PREFIX_MOD_0_0FAE_REG_6, 1028 PREFIX_MOD_1_0FAE_REG_6, 1029 PREFIX_0FAE_REG_7, 1030 PREFIX_0FB8, 1031 PREFIX_0FBC, 1032 PREFIX_0FBD, 1033 PREFIX_0FC2, 1034 PREFIX_MOD_0_0FC3, 1035 PREFIX_MOD_0_0FC7_REG_6, 1036 PREFIX_MOD_3_0FC7_REG_6, 1037 PREFIX_MOD_3_0FC7_REG_7, 1038 PREFIX_0FD0, 1039 PREFIX_0FD6, 1040 PREFIX_0FE6, 1041 PREFIX_0FE7, 1042 PREFIX_0FF0, 1043 PREFIX_0FF7, 1044 PREFIX_0F3810, 1045 PREFIX_0F3814, 1046 PREFIX_0F3815, 1047 PREFIX_0F3817, 1048 PREFIX_0F3820, 1049 PREFIX_0F3821, 1050 PREFIX_0F3822, 1051 PREFIX_0F3823, 1052 PREFIX_0F3824, 1053 PREFIX_0F3825, 1054 PREFIX_0F3828, 1055 PREFIX_0F3829, 1056 PREFIX_0F382A, 1057 PREFIX_0F382B, 1058 PREFIX_0F3830, 1059 PREFIX_0F3831, 1060 PREFIX_0F3832, 1061 PREFIX_0F3833, 1062 PREFIX_0F3834, 1063 PREFIX_0F3835, 1064 PREFIX_0F3837, 1065 PREFIX_0F3838, 1066 PREFIX_0F3839, 1067 PREFIX_0F383A, 1068 PREFIX_0F383B, 1069 PREFIX_0F383C, 1070 PREFIX_0F383D, 1071 PREFIX_0F383E, 1072 PREFIX_0F383F, 1073 PREFIX_0F3840, 1074 PREFIX_0F3841, 1075 PREFIX_0F3880, 1076 PREFIX_0F3881, 1077 PREFIX_0F3882, 1078 PREFIX_0F38C8, 1079 PREFIX_0F38C9, 1080 PREFIX_0F38CA, 1081 PREFIX_0F38CB, 1082 PREFIX_0F38CC, 1083 PREFIX_0F38CD, 1084 PREFIX_0F38CF, 1085 PREFIX_0F38DB, 1086 PREFIX_0F38DC, 1087 PREFIX_0F38DD, 1088 PREFIX_0F38DE, 1089 PREFIX_0F38DF, 1090 PREFIX_0F38F0, 1091 PREFIX_0F38F1, 1092 PREFIX_0F38F5, 1093 PREFIX_0F38F6, 1094 PREFIX_0F38F8, 1095 PREFIX_0F38F9, 1096 PREFIX_0F3A08, 1097 PREFIX_0F3A09, 1098 PREFIX_0F3A0A, 1099 PREFIX_0F3A0B, 1100 PREFIX_0F3A0C, 1101 PREFIX_0F3A0D, 1102 PREFIX_0F3A0E, 1103 PREFIX_0F3A14, 1104 PREFIX_0F3A15, 1105 PREFIX_0F3A16, 1106 PREFIX_0F3A17, 1107 PREFIX_0F3A20, 1108 PREFIX_0F3A21, 1109 PREFIX_0F3A22, 1110 PREFIX_0F3A40, 1111 PREFIX_0F3A41, 1112 PREFIX_0F3A42, 1113 PREFIX_0F3A44, 1114 PREFIX_0F3A60, 1115 PREFIX_0F3A61, 1116 PREFIX_0F3A62, 1117 PREFIX_0F3A63, 1118 PREFIX_0F3ACC, 1119 PREFIX_0F3ACE, 1120 PREFIX_0F3ACF, 1121 PREFIX_0F3ADF, 1122 PREFIX_VEX_0F10, 1123 PREFIX_VEX_0F11, 1124 PREFIX_VEX_0F12, 1125 PREFIX_VEX_0F16, 1126 PREFIX_VEX_0F2A, 1127 PREFIX_VEX_0F2C, 1128 PREFIX_VEX_0F2D, 1129 PREFIX_VEX_0F2E, 1130 PREFIX_VEX_0F2F, 1131 PREFIX_VEX_0F41, 1132 PREFIX_VEX_0F42, 1133 PREFIX_VEX_0F44, 1134 PREFIX_VEX_0F45, 1135 PREFIX_VEX_0F46, 1136 PREFIX_VEX_0F47, 1137 PREFIX_VEX_0F4A, 1138 PREFIX_VEX_0F4B, 1139 PREFIX_VEX_0F51, 1140 PREFIX_VEX_0F52, 1141 PREFIX_VEX_0F53, 1142 PREFIX_VEX_0F58, 1143 PREFIX_VEX_0F59, 1144 PREFIX_VEX_0F5A, 1145 PREFIX_VEX_0F5B, 1146 PREFIX_VEX_0F5C, 1147 PREFIX_VEX_0F5D, 1148 PREFIX_VEX_0F5E, 1149 PREFIX_VEX_0F5F, 1150 PREFIX_VEX_0F60, 1151 PREFIX_VEX_0F61, 1152 PREFIX_VEX_0F62, 1153 PREFIX_VEX_0F63, 1154 PREFIX_VEX_0F64, 1155 PREFIX_VEX_0F65, 1156 PREFIX_VEX_0F66, 1157 PREFIX_VEX_0F67, 1158 PREFIX_VEX_0F68, 1159 PREFIX_VEX_0F69, 1160 PREFIX_VEX_0F6A, 1161 PREFIX_VEX_0F6B, 1162 PREFIX_VEX_0F6C, 1163 PREFIX_VEX_0F6D, 1164 PREFIX_VEX_0F6E, 1165 PREFIX_VEX_0F6F, 1166 PREFIX_VEX_0F70, 1167 PREFIX_VEX_0F71_REG_2, 1168 PREFIX_VEX_0F71_REG_4, 1169 PREFIX_VEX_0F71_REG_6, 1170 PREFIX_VEX_0F72_REG_2, 1171 PREFIX_VEX_0F72_REG_4, 1172 PREFIX_VEX_0F72_REG_6, 1173 PREFIX_VEX_0F73_REG_2, 1174 PREFIX_VEX_0F73_REG_3, 1175 PREFIX_VEX_0F73_REG_6, 1176 PREFIX_VEX_0F73_REG_7, 1177 PREFIX_VEX_0F74, 1178 PREFIX_VEX_0F75, 1179 PREFIX_VEX_0F76, 1180 PREFIX_VEX_0F77, 1181 PREFIX_VEX_0F7C, 1182 PREFIX_VEX_0F7D, 1183 PREFIX_VEX_0F7E, 1184 PREFIX_VEX_0F7F, 1185 PREFIX_VEX_0F90, 1186 PREFIX_VEX_0F91, 1187 PREFIX_VEX_0F92, 1188 PREFIX_VEX_0F93, 1189 PREFIX_VEX_0F98, 1190 PREFIX_VEX_0F99, 1191 PREFIX_VEX_0FC2, 1192 PREFIX_VEX_0FC4, 1193 PREFIX_VEX_0FC5, 1194 PREFIX_VEX_0FD0, 1195 PREFIX_VEX_0FD1, 1196 PREFIX_VEX_0FD2, 1197 PREFIX_VEX_0FD3, 1198 PREFIX_VEX_0FD4, 1199 PREFIX_VEX_0FD5, 1200 PREFIX_VEX_0FD6, 1201 PREFIX_VEX_0FD7, 1202 PREFIX_VEX_0FD8, 1203 PREFIX_VEX_0FD9, 1204 PREFIX_VEX_0FDA, 1205 PREFIX_VEX_0FDB, 1206 PREFIX_VEX_0FDC, 1207 PREFIX_VEX_0FDD, 1208 PREFIX_VEX_0FDE, 1209 PREFIX_VEX_0FDF, 1210 PREFIX_VEX_0FE0, 1211 PREFIX_VEX_0FE1, 1212 PREFIX_VEX_0FE2, 1213 PREFIX_VEX_0FE3, 1214 PREFIX_VEX_0FE4, 1215 PREFIX_VEX_0FE5, 1216 PREFIX_VEX_0FE6, 1217 PREFIX_VEX_0FE7, 1218 PREFIX_VEX_0FE8, 1219 PREFIX_VEX_0FE9, 1220 PREFIX_VEX_0FEA, 1221 PREFIX_VEX_0FEB, 1222 PREFIX_VEX_0FEC, 1223 PREFIX_VEX_0FED, 1224 PREFIX_VEX_0FEE, 1225 PREFIX_VEX_0FEF, 1226 PREFIX_VEX_0FF0, 1227 PREFIX_VEX_0FF1, 1228 PREFIX_VEX_0FF2, 1229 PREFIX_VEX_0FF3, 1230 PREFIX_VEX_0FF4, 1231 PREFIX_VEX_0FF5, 1232 PREFIX_VEX_0FF6, 1233 PREFIX_VEX_0FF7, 1234 PREFIX_VEX_0FF8, 1235 PREFIX_VEX_0FF9, 1236 PREFIX_VEX_0FFA, 1237 PREFIX_VEX_0FFB, 1238 PREFIX_VEX_0FFC, 1239 PREFIX_VEX_0FFD, 1240 PREFIX_VEX_0FFE, 1241 PREFIX_VEX_0F3800, 1242 PREFIX_VEX_0F3801, 1243 PREFIX_VEX_0F3802, 1244 PREFIX_VEX_0F3803, 1245 PREFIX_VEX_0F3804, 1246 PREFIX_VEX_0F3805, 1247 PREFIX_VEX_0F3806, 1248 PREFIX_VEX_0F3807, 1249 PREFIX_VEX_0F3808, 1250 PREFIX_VEX_0F3809, 1251 PREFIX_VEX_0F380A, 1252 PREFIX_VEX_0F380B, 1253 PREFIX_VEX_0F380C, 1254 PREFIX_VEX_0F380D, 1255 PREFIX_VEX_0F380E, 1256 PREFIX_VEX_0F380F, 1257 PREFIX_VEX_0F3813, 1258 PREFIX_VEX_0F3816, 1259 PREFIX_VEX_0F3817, 1260 PREFIX_VEX_0F3818, 1261 PREFIX_VEX_0F3819, 1262 PREFIX_VEX_0F381A, 1263 PREFIX_VEX_0F381C, 1264 PREFIX_VEX_0F381D, 1265 PREFIX_VEX_0F381E, 1266 PREFIX_VEX_0F3820, 1267 PREFIX_VEX_0F3821, 1268 PREFIX_VEX_0F3822, 1269 PREFIX_VEX_0F3823, 1270 PREFIX_VEX_0F3824, 1271 PREFIX_VEX_0F3825, 1272 PREFIX_VEX_0F3828, 1273 PREFIX_VEX_0F3829, 1274 PREFIX_VEX_0F382A, 1275 PREFIX_VEX_0F382B, 1276 PREFIX_VEX_0F382C, 1277 PREFIX_VEX_0F382D, 1278 PREFIX_VEX_0F382E, 1279 PREFIX_VEX_0F382F, 1280 PREFIX_VEX_0F3830, 1281 PREFIX_VEX_0F3831, 1282 PREFIX_VEX_0F3832, 1283 PREFIX_VEX_0F3833, 1284 PREFIX_VEX_0F3834, 1285 PREFIX_VEX_0F3835, 1286 PREFIX_VEX_0F3836, 1287 PREFIX_VEX_0F3837, 1288 PREFIX_VEX_0F3838, 1289 PREFIX_VEX_0F3839, 1290 PREFIX_VEX_0F383A, 1291 PREFIX_VEX_0F383B, 1292 PREFIX_VEX_0F383C, 1293 PREFIX_VEX_0F383D, 1294 PREFIX_VEX_0F383E, 1295 PREFIX_VEX_0F383F, 1296 PREFIX_VEX_0F3840, 1297 PREFIX_VEX_0F3841, 1298 PREFIX_VEX_0F3845, 1299 PREFIX_VEX_0F3846, 1300 PREFIX_VEX_0F3847, 1301 PREFIX_VEX_0F3858, 1302 PREFIX_VEX_0F3859, 1303 PREFIX_VEX_0F385A, 1304 PREFIX_VEX_0F3878, 1305 PREFIX_VEX_0F3879, 1306 PREFIX_VEX_0F388C, 1307 PREFIX_VEX_0F388E, 1308 PREFIX_VEX_0F3890, 1309 PREFIX_VEX_0F3891, 1310 PREFIX_VEX_0F3892, 1311 PREFIX_VEX_0F3893, 1312 PREFIX_VEX_0F3896, 1313 PREFIX_VEX_0F3897, 1314 PREFIX_VEX_0F3898, 1315 PREFIX_VEX_0F3899, 1316 PREFIX_VEX_0F389A, 1317 PREFIX_VEX_0F389B, 1318 PREFIX_VEX_0F389C, 1319 PREFIX_VEX_0F389D, 1320 PREFIX_VEX_0F389E, 1321 PREFIX_VEX_0F389F, 1322 PREFIX_VEX_0F38A6, 1323 PREFIX_VEX_0F38A7, 1324 PREFIX_VEX_0F38A8, 1325 PREFIX_VEX_0F38A9, 1326 PREFIX_VEX_0F38AA, 1327 PREFIX_VEX_0F38AB, 1328 PREFIX_VEX_0F38AC, 1329 PREFIX_VEX_0F38AD, 1330 PREFIX_VEX_0F38AE, 1331 PREFIX_VEX_0F38AF, 1332 PREFIX_VEX_0F38B6, 1333 PREFIX_VEX_0F38B7, 1334 PREFIX_VEX_0F38B8, 1335 PREFIX_VEX_0F38B9, 1336 PREFIX_VEX_0F38BA, 1337 PREFIX_VEX_0F38BB, 1338 PREFIX_VEX_0F38BC, 1339 PREFIX_VEX_0F38BD, 1340 PREFIX_VEX_0F38BE, 1341 PREFIX_VEX_0F38BF, 1342 PREFIX_VEX_0F38CF, 1343 PREFIX_VEX_0F38DB, 1344 PREFIX_VEX_0F38DC, 1345 PREFIX_VEX_0F38DD, 1346 PREFIX_VEX_0F38DE, 1347 PREFIX_VEX_0F38DF, 1348 PREFIX_VEX_0F38F2, 1349 PREFIX_VEX_0F38F3_REG_1, 1350 PREFIX_VEX_0F38F3_REG_2, 1351 PREFIX_VEX_0F38F3_REG_3, 1352 PREFIX_VEX_0F38F5, 1353 PREFIX_VEX_0F38F6, 1354 PREFIX_VEX_0F38F7, 1355 PREFIX_VEX_0F3A00, 1356 PREFIX_VEX_0F3A01, 1357 PREFIX_VEX_0F3A02, 1358 PREFIX_VEX_0F3A04, 1359 PREFIX_VEX_0F3A05, 1360 PREFIX_VEX_0F3A06, 1361 PREFIX_VEX_0F3A08, 1362 PREFIX_VEX_0F3A09, 1363 PREFIX_VEX_0F3A0A, 1364 PREFIX_VEX_0F3A0B, 1365 PREFIX_VEX_0F3A0C, 1366 PREFIX_VEX_0F3A0D, 1367 PREFIX_VEX_0F3A0E, 1368 PREFIX_VEX_0F3A0F, 1369 PREFIX_VEX_0F3A14, 1370 PREFIX_VEX_0F3A15, 1371 PREFIX_VEX_0F3A16, 1372 PREFIX_VEX_0F3A17, 1373 PREFIX_VEX_0F3A18, 1374 PREFIX_VEX_0F3A19, 1375 PREFIX_VEX_0F3A1D, 1376 PREFIX_VEX_0F3A20, 1377 PREFIX_VEX_0F3A21, 1378 PREFIX_VEX_0F3A22, 1379 PREFIX_VEX_0F3A30, 1380 PREFIX_VEX_0F3A31, 1381 PREFIX_VEX_0F3A32, 1382 PREFIX_VEX_0F3A33, 1383 PREFIX_VEX_0F3A38, 1384 PREFIX_VEX_0F3A39, 1385 PREFIX_VEX_0F3A40, 1386 PREFIX_VEX_0F3A41, 1387 PREFIX_VEX_0F3A42, 1388 PREFIX_VEX_0F3A44, 1389 PREFIX_VEX_0F3A46, 1390 PREFIX_VEX_0F3A48, 1391 PREFIX_VEX_0F3A49, 1392 PREFIX_VEX_0F3A4A, 1393 PREFIX_VEX_0F3A4B, 1394 PREFIX_VEX_0F3A4C, 1395 PREFIX_VEX_0F3A5C, 1396 PREFIX_VEX_0F3A5D, 1397 PREFIX_VEX_0F3A5E, 1398 PREFIX_VEX_0F3A5F, 1399 PREFIX_VEX_0F3A60, 1400 PREFIX_VEX_0F3A61, 1401 PREFIX_VEX_0F3A62, 1402 PREFIX_VEX_0F3A63, 1403 PREFIX_VEX_0F3A68, 1404 PREFIX_VEX_0F3A69, 1405 PREFIX_VEX_0F3A6A, 1406 PREFIX_VEX_0F3A6B, 1407 PREFIX_VEX_0F3A6C, 1408 PREFIX_VEX_0F3A6D, 1409 PREFIX_VEX_0F3A6E, 1410 PREFIX_VEX_0F3A6F, 1411 PREFIX_VEX_0F3A78, 1412 PREFIX_VEX_0F3A79, 1413 PREFIX_VEX_0F3A7A, 1414 PREFIX_VEX_0F3A7B, 1415 PREFIX_VEX_0F3A7C, 1416 PREFIX_VEX_0F3A7D, 1417 PREFIX_VEX_0F3A7E, 1418 PREFIX_VEX_0F3A7F, 1419 PREFIX_VEX_0F3ACE, 1420 PREFIX_VEX_0F3ACF, 1421 PREFIX_VEX_0F3ADF, 1422 PREFIX_VEX_0F3AF0, 1423 1424 PREFIX_EVEX_0F10, 1425 PREFIX_EVEX_0F11, 1426 PREFIX_EVEX_0F12, 1427 PREFIX_EVEX_0F13, 1428 PREFIX_EVEX_0F14, 1429 PREFIX_EVEX_0F15, 1430 PREFIX_EVEX_0F16, 1431 PREFIX_EVEX_0F17, 1432 PREFIX_EVEX_0F28, 1433 PREFIX_EVEX_0F29, 1434 PREFIX_EVEX_0F2A, 1435 PREFIX_EVEX_0F2B, 1436 PREFIX_EVEX_0F2C, 1437 PREFIX_EVEX_0F2D, 1438 PREFIX_EVEX_0F2E, 1439 PREFIX_EVEX_0F2F, 1440 PREFIX_EVEX_0F51, 1441 PREFIX_EVEX_0F54, 1442 PREFIX_EVEX_0F55, 1443 PREFIX_EVEX_0F56, 1444 PREFIX_EVEX_0F57, 1445 PREFIX_EVEX_0F58, 1446 PREFIX_EVEX_0F59, 1447 PREFIX_EVEX_0F5A, 1448 PREFIX_EVEX_0F5B, 1449 PREFIX_EVEX_0F5C, 1450 PREFIX_EVEX_0F5D, 1451 PREFIX_EVEX_0F5E, 1452 PREFIX_EVEX_0F5F, 1453 PREFIX_EVEX_0F60, 1454 PREFIX_EVEX_0F61, 1455 PREFIX_EVEX_0F62, 1456 PREFIX_EVEX_0F63, 1457 PREFIX_EVEX_0F64, 1458 PREFIX_EVEX_0F65, 1459 PREFIX_EVEX_0F66, 1460 PREFIX_EVEX_0F67, 1461 PREFIX_EVEX_0F68, 1462 PREFIX_EVEX_0F69, 1463 PREFIX_EVEX_0F6A, 1464 PREFIX_EVEX_0F6B, 1465 PREFIX_EVEX_0F6C, 1466 PREFIX_EVEX_0F6D, 1467 PREFIX_EVEX_0F6E, 1468 PREFIX_EVEX_0F6F, 1469 PREFIX_EVEX_0F70, 1470 PREFIX_EVEX_0F71_REG_2, 1471 PREFIX_EVEX_0F71_REG_4, 1472 PREFIX_EVEX_0F71_REG_6, 1473 PREFIX_EVEX_0F72_REG_0, 1474 PREFIX_EVEX_0F72_REG_1, 1475 PREFIX_EVEX_0F72_REG_2, 1476 PREFIX_EVEX_0F72_REG_4, 1477 PREFIX_EVEX_0F72_REG_6, 1478 PREFIX_EVEX_0F73_REG_2, 1479 PREFIX_EVEX_0F73_REG_3, 1480 PREFIX_EVEX_0F73_REG_6, 1481 PREFIX_EVEX_0F73_REG_7, 1482 PREFIX_EVEX_0F74, 1483 PREFIX_EVEX_0F75, 1484 PREFIX_EVEX_0F76, 1485 PREFIX_EVEX_0F78, 1486 PREFIX_EVEX_0F79, 1487 PREFIX_EVEX_0F7A, 1488 PREFIX_EVEX_0F7B, 1489 PREFIX_EVEX_0F7E, 1490 PREFIX_EVEX_0F7F, 1491 PREFIX_EVEX_0FC2, 1492 PREFIX_EVEX_0FC4, 1493 PREFIX_EVEX_0FC5, 1494 PREFIX_EVEX_0FC6, 1495 PREFIX_EVEX_0FD1, 1496 PREFIX_EVEX_0FD2, 1497 PREFIX_EVEX_0FD3, 1498 PREFIX_EVEX_0FD4, 1499 PREFIX_EVEX_0FD5, 1500 PREFIX_EVEX_0FD6, 1501 PREFIX_EVEX_0FD8, 1502 PREFIX_EVEX_0FD9, 1503 PREFIX_EVEX_0FDA, 1504 PREFIX_EVEX_0FDB, 1505 PREFIX_EVEX_0FDC, 1506 PREFIX_EVEX_0FDD, 1507 PREFIX_EVEX_0FDE, 1508 PREFIX_EVEX_0FDF, 1509 PREFIX_EVEX_0FE0, 1510 PREFIX_EVEX_0FE1, 1511 PREFIX_EVEX_0FE2, 1512 PREFIX_EVEX_0FE3, 1513 PREFIX_EVEX_0FE4, 1514 PREFIX_EVEX_0FE5, 1515 PREFIX_EVEX_0FE6, 1516 PREFIX_EVEX_0FE7, 1517 PREFIX_EVEX_0FE8, 1518 PREFIX_EVEX_0FE9, 1519 PREFIX_EVEX_0FEA, 1520 PREFIX_EVEX_0FEB, 1521 PREFIX_EVEX_0FEC, 1522 PREFIX_EVEX_0FED, 1523 PREFIX_EVEX_0FEE, 1524 PREFIX_EVEX_0FEF, 1525 PREFIX_EVEX_0FF1, 1526 PREFIX_EVEX_0FF2, 1527 PREFIX_EVEX_0FF3, 1528 PREFIX_EVEX_0FF4, 1529 PREFIX_EVEX_0FF5, 1530 PREFIX_EVEX_0FF6, 1531 PREFIX_EVEX_0FF8, 1532 PREFIX_EVEX_0FF9, 1533 PREFIX_EVEX_0FFA, 1534 PREFIX_EVEX_0FFB, 1535 PREFIX_EVEX_0FFC, 1536 PREFIX_EVEX_0FFD, 1537 PREFIX_EVEX_0FFE, 1538 PREFIX_EVEX_0F3800, 1539 PREFIX_EVEX_0F3804, 1540 PREFIX_EVEX_0F380B, 1541 PREFIX_EVEX_0F380C, 1542 PREFIX_EVEX_0F380D, 1543 PREFIX_EVEX_0F3810, 1544 PREFIX_EVEX_0F3811, 1545 PREFIX_EVEX_0F3812, 1546 PREFIX_EVEX_0F3813, 1547 PREFIX_EVEX_0F3814, 1548 PREFIX_EVEX_0F3815, 1549 PREFIX_EVEX_0F3816, 1550 PREFIX_EVEX_0F3818, 1551 PREFIX_EVEX_0F3819, 1552 PREFIX_EVEX_0F381A, 1553 PREFIX_EVEX_0F381B, 1554 PREFIX_EVEX_0F381C, 1555 PREFIX_EVEX_0F381D, 1556 PREFIX_EVEX_0F381E, 1557 PREFIX_EVEX_0F381F, 1558 PREFIX_EVEX_0F3820, 1559 PREFIX_EVEX_0F3821, 1560 PREFIX_EVEX_0F3822, 1561 PREFIX_EVEX_0F3823, 1562 PREFIX_EVEX_0F3824, 1563 PREFIX_EVEX_0F3825, 1564 PREFIX_EVEX_0F3826, 1565 PREFIX_EVEX_0F3827, 1566 PREFIX_EVEX_0F3828, 1567 PREFIX_EVEX_0F3829, 1568 PREFIX_EVEX_0F382A, 1569 PREFIX_EVEX_0F382B, 1570 PREFIX_EVEX_0F382C, 1571 PREFIX_EVEX_0F382D, 1572 PREFIX_EVEX_0F3830, 1573 PREFIX_EVEX_0F3831, 1574 PREFIX_EVEX_0F3832, 1575 PREFIX_EVEX_0F3833, 1576 PREFIX_EVEX_0F3834, 1577 PREFIX_EVEX_0F3835, 1578 PREFIX_EVEX_0F3836, 1579 PREFIX_EVEX_0F3837, 1580 PREFIX_EVEX_0F3838, 1581 PREFIX_EVEX_0F3839, 1582 PREFIX_EVEX_0F383A, 1583 PREFIX_EVEX_0F383B, 1584 PREFIX_EVEX_0F383C, 1585 PREFIX_EVEX_0F383D, 1586 PREFIX_EVEX_0F383E, 1587 PREFIX_EVEX_0F383F, 1588 PREFIX_EVEX_0F3840, 1589 PREFIX_EVEX_0F3842, 1590 PREFIX_EVEX_0F3843, 1591 PREFIX_EVEX_0F3844, 1592 PREFIX_EVEX_0F3845, 1593 PREFIX_EVEX_0F3846, 1594 PREFIX_EVEX_0F3847, 1595 PREFIX_EVEX_0F384C, 1596 PREFIX_EVEX_0F384D, 1597 PREFIX_EVEX_0F384E, 1598 PREFIX_EVEX_0F384F, 1599 PREFIX_EVEX_0F3850, 1600 PREFIX_EVEX_0F3851, 1601 PREFIX_EVEX_0F3852, 1602 PREFIX_EVEX_0F3853, 1603 PREFIX_EVEX_0F3854, 1604 PREFIX_EVEX_0F3855, 1605 PREFIX_EVEX_0F3858, 1606 PREFIX_EVEX_0F3859, 1607 PREFIX_EVEX_0F385A, 1608 PREFIX_EVEX_0F385B, 1609 PREFIX_EVEX_0F3862, 1610 PREFIX_EVEX_0F3863, 1611 PREFIX_EVEX_0F3864, 1612 PREFIX_EVEX_0F3865, 1613 PREFIX_EVEX_0F3866, 1614 PREFIX_EVEX_0F3870, 1615 PREFIX_EVEX_0F3871, 1616 PREFIX_EVEX_0F3872, 1617 PREFIX_EVEX_0F3873, 1618 PREFIX_EVEX_0F3875, 1619 PREFIX_EVEX_0F3876, 1620 PREFIX_EVEX_0F3877, 1621 PREFIX_EVEX_0F3878, 1622 PREFIX_EVEX_0F3879, 1623 PREFIX_EVEX_0F387A, 1624 PREFIX_EVEX_0F387B, 1625 PREFIX_EVEX_0F387C, 1626 PREFIX_EVEX_0F387D, 1627 PREFIX_EVEX_0F387E, 1628 PREFIX_EVEX_0F387F, 1629 PREFIX_EVEX_0F3883, 1630 PREFIX_EVEX_0F3888, 1631 PREFIX_EVEX_0F3889, 1632 PREFIX_EVEX_0F388A, 1633 PREFIX_EVEX_0F388B, 1634 PREFIX_EVEX_0F388D, 1635 PREFIX_EVEX_0F388F, 1636 PREFIX_EVEX_0F3890, 1637 PREFIX_EVEX_0F3891, 1638 PREFIX_EVEX_0F3892, 1639 PREFIX_EVEX_0F3893, 1640 PREFIX_EVEX_0F3896, 1641 PREFIX_EVEX_0F3897, 1642 PREFIX_EVEX_0F3898, 1643 PREFIX_EVEX_0F3899, 1644 PREFIX_EVEX_0F389A, 1645 PREFIX_EVEX_0F389B, 1646 PREFIX_EVEX_0F389C, 1647 PREFIX_EVEX_0F389D, 1648 PREFIX_EVEX_0F389E, 1649 PREFIX_EVEX_0F389F, 1650 PREFIX_EVEX_0F38A0, 1651 PREFIX_EVEX_0F38A1, 1652 PREFIX_EVEX_0F38A2, 1653 PREFIX_EVEX_0F38A3, 1654 PREFIX_EVEX_0F38A6, 1655 PREFIX_EVEX_0F38A7, 1656 PREFIX_EVEX_0F38A8, 1657 PREFIX_EVEX_0F38A9, 1658 PREFIX_EVEX_0F38AA, 1659 PREFIX_EVEX_0F38AB, 1660 PREFIX_EVEX_0F38AC, 1661 PREFIX_EVEX_0F38AD, 1662 PREFIX_EVEX_0F38AE, 1663 PREFIX_EVEX_0F38AF, 1664 PREFIX_EVEX_0F38B4, 1665 PREFIX_EVEX_0F38B5, 1666 PREFIX_EVEX_0F38B6, 1667 PREFIX_EVEX_0F38B7, 1668 PREFIX_EVEX_0F38B8, 1669 PREFIX_EVEX_0F38B9, 1670 PREFIX_EVEX_0F38BA, 1671 PREFIX_EVEX_0F38BB, 1672 PREFIX_EVEX_0F38BC, 1673 PREFIX_EVEX_0F38BD, 1674 PREFIX_EVEX_0F38BE, 1675 PREFIX_EVEX_0F38BF, 1676 PREFIX_EVEX_0F38C4, 1677 PREFIX_EVEX_0F38C6_REG_1, 1678 PREFIX_EVEX_0F38C6_REG_2, 1679 PREFIX_EVEX_0F38C6_REG_5, 1680 PREFIX_EVEX_0F38C6_REG_6, 1681 PREFIX_EVEX_0F38C7_REG_1, 1682 PREFIX_EVEX_0F38C7_REG_2, 1683 PREFIX_EVEX_0F38C7_REG_5, 1684 PREFIX_EVEX_0F38C7_REG_6, 1685 PREFIX_EVEX_0F38C8, 1686 PREFIX_EVEX_0F38CA, 1687 PREFIX_EVEX_0F38CB, 1688 PREFIX_EVEX_0F38CC, 1689 PREFIX_EVEX_0F38CD, 1690 PREFIX_EVEX_0F38CF, 1691 PREFIX_EVEX_0F38DC, 1692 PREFIX_EVEX_0F38DD, 1693 PREFIX_EVEX_0F38DE, 1694 PREFIX_EVEX_0F38DF, 1695 1696 PREFIX_EVEX_0F3A00, 1697 PREFIX_EVEX_0F3A01, 1698 PREFIX_EVEX_0F3A03, 1699 PREFIX_EVEX_0F3A04, 1700 PREFIX_EVEX_0F3A05, 1701 PREFIX_EVEX_0F3A08, 1702 PREFIX_EVEX_0F3A09, 1703 PREFIX_EVEX_0F3A0A, 1704 PREFIX_EVEX_0F3A0B, 1705 PREFIX_EVEX_0F3A0F, 1706 PREFIX_EVEX_0F3A14, 1707 PREFIX_EVEX_0F3A15, 1708 PREFIX_EVEX_0F3A16, 1709 PREFIX_EVEX_0F3A17, 1710 PREFIX_EVEX_0F3A18, 1711 PREFIX_EVEX_0F3A19, 1712 PREFIX_EVEX_0F3A1A, 1713 PREFIX_EVEX_0F3A1B, 1714 PREFIX_EVEX_0F3A1D, 1715 PREFIX_EVEX_0F3A1E, 1716 PREFIX_EVEX_0F3A1F, 1717 PREFIX_EVEX_0F3A20, 1718 PREFIX_EVEX_0F3A21, 1719 PREFIX_EVEX_0F3A22, 1720 PREFIX_EVEX_0F3A23, 1721 PREFIX_EVEX_0F3A25, 1722 PREFIX_EVEX_0F3A26, 1723 PREFIX_EVEX_0F3A27, 1724 PREFIX_EVEX_0F3A38, 1725 PREFIX_EVEX_0F3A39, 1726 PREFIX_EVEX_0F3A3A, 1727 PREFIX_EVEX_0F3A3B, 1728 PREFIX_EVEX_0F3A3E, 1729 PREFIX_EVEX_0F3A3F, 1730 PREFIX_EVEX_0F3A42, 1731 PREFIX_EVEX_0F3A43, 1732 PREFIX_EVEX_0F3A44, 1733 PREFIX_EVEX_0F3A50, 1734 PREFIX_EVEX_0F3A51, 1735 PREFIX_EVEX_0F3A54, 1736 PREFIX_EVEX_0F3A55, 1737 PREFIX_EVEX_0F3A56, 1738 PREFIX_EVEX_0F3A57, 1739 PREFIX_EVEX_0F3A66, 1740 PREFIX_EVEX_0F3A67, 1741 PREFIX_EVEX_0F3A70, 1742 PREFIX_EVEX_0F3A71, 1743 PREFIX_EVEX_0F3A72, 1744 PREFIX_EVEX_0F3A73, 1745 PREFIX_EVEX_0F3ACE, 1746 PREFIX_EVEX_0F3ACF 1747 }; 1748 1749 enum 1750 { 1751 X86_64_06 = 0, 1752 X86_64_07, 1753 X86_64_0D, 1754 X86_64_16, 1755 X86_64_17, 1756 X86_64_1E, 1757 X86_64_1F, 1758 X86_64_27, 1759 X86_64_2F, 1760 X86_64_37, 1761 X86_64_3F, 1762 X86_64_60, 1763 X86_64_61, 1764 X86_64_62, 1765 X86_64_63, 1766 X86_64_6D, 1767 X86_64_6F, 1768 X86_64_82, 1769 X86_64_9A, 1770 X86_64_C4, 1771 X86_64_C5, 1772 X86_64_CE, 1773 X86_64_D4, 1774 X86_64_D5, 1775 X86_64_E8, 1776 X86_64_E9, 1777 X86_64_EA, 1778 X86_64_0F01_REG_0, 1779 X86_64_0F01_REG_1, 1780 X86_64_0F01_REG_2, 1781 X86_64_0F01_REG_3 1782 }; 1783 1784 enum 1785 { 1786 THREE_BYTE_0F38 = 0, 1787 THREE_BYTE_0F3A 1788 }; 1789 1790 enum 1791 { 1792 XOP_08 = 0, 1793 XOP_09, 1794 XOP_0A 1795 }; 1796 1797 enum 1798 { 1799 VEX_0F = 0, 1800 VEX_0F38, 1801 VEX_0F3A 1802 }; 1803 1804 enum 1805 { 1806 EVEX_0F = 0, 1807 EVEX_0F38, 1808 EVEX_0F3A 1809 }; 1810 1811 enum 1812 { 1813 VEX_LEN_0F12_P_0_M_0 = 0, 1814 VEX_LEN_0F12_P_0_M_1, 1815 VEX_LEN_0F12_P_2, 1816 VEX_LEN_0F13_M_0, 1817 VEX_LEN_0F16_P_0_M_0, 1818 VEX_LEN_0F16_P_0_M_1, 1819 VEX_LEN_0F16_P_2, 1820 VEX_LEN_0F17_M_0, 1821 VEX_LEN_0F2A_P_1, 1822 VEX_LEN_0F2A_P_3, 1823 VEX_LEN_0F2C_P_1, 1824 VEX_LEN_0F2C_P_3, 1825 VEX_LEN_0F2D_P_1, 1826 VEX_LEN_0F2D_P_3, 1827 VEX_LEN_0F41_P_0, 1828 VEX_LEN_0F41_P_2, 1829 VEX_LEN_0F42_P_0, 1830 VEX_LEN_0F42_P_2, 1831 VEX_LEN_0F44_P_0, 1832 VEX_LEN_0F44_P_2, 1833 VEX_LEN_0F45_P_0, 1834 VEX_LEN_0F45_P_2, 1835 VEX_LEN_0F46_P_0, 1836 VEX_LEN_0F46_P_2, 1837 VEX_LEN_0F47_P_0, 1838 VEX_LEN_0F47_P_2, 1839 VEX_LEN_0F4A_P_0, 1840 VEX_LEN_0F4A_P_2, 1841 VEX_LEN_0F4B_P_0, 1842 VEX_LEN_0F4B_P_2, 1843 VEX_LEN_0F6E_P_2, 1844 VEX_LEN_0F77_P_0, 1845 VEX_LEN_0F7E_P_1, 1846 VEX_LEN_0F7E_P_2, 1847 VEX_LEN_0F90_P_0, 1848 VEX_LEN_0F90_P_2, 1849 VEX_LEN_0F91_P_0, 1850 VEX_LEN_0F91_P_2, 1851 VEX_LEN_0F92_P_0, 1852 VEX_LEN_0F92_P_2, 1853 VEX_LEN_0F92_P_3, 1854 VEX_LEN_0F93_P_0, 1855 VEX_LEN_0F93_P_2, 1856 VEX_LEN_0F93_P_3, 1857 VEX_LEN_0F98_P_0, 1858 VEX_LEN_0F98_P_2, 1859 VEX_LEN_0F99_P_0, 1860 VEX_LEN_0F99_P_2, 1861 VEX_LEN_0FAE_R_2_M_0, 1862 VEX_LEN_0FAE_R_3_M_0, 1863 VEX_LEN_0FC4_P_2, 1864 VEX_LEN_0FC5_P_2, 1865 VEX_LEN_0FD6_P_2, 1866 VEX_LEN_0FF7_P_2, 1867 VEX_LEN_0F3816_P_2, 1868 VEX_LEN_0F3819_P_2, 1869 VEX_LEN_0F381A_P_2_M_0, 1870 VEX_LEN_0F3836_P_2, 1871 VEX_LEN_0F3841_P_2, 1872 VEX_LEN_0F385A_P_2_M_0, 1873 VEX_LEN_0F38DB_P_2, 1874 VEX_LEN_0F38F2_P_0, 1875 VEX_LEN_0F38F3_R_1_P_0, 1876 VEX_LEN_0F38F3_R_2_P_0, 1877 VEX_LEN_0F38F3_R_3_P_0, 1878 VEX_LEN_0F38F5_P_0, 1879 VEX_LEN_0F38F5_P_1, 1880 VEX_LEN_0F38F5_P_3, 1881 VEX_LEN_0F38F6_P_3, 1882 VEX_LEN_0F38F7_P_0, 1883 VEX_LEN_0F38F7_P_1, 1884 VEX_LEN_0F38F7_P_2, 1885 VEX_LEN_0F38F7_P_3, 1886 VEX_LEN_0F3A00_P_2, 1887 VEX_LEN_0F3A01_P_2, 1888 VEX_LEN_0F3A06_P_2, 1889 VEX_LEN_0F3A14_P_2, 1890 VEX_LEN_0F3A15_P_2, 1891 VEX_LEN_0F3A16_P_2, 1892 VEX_LEN_0F3A17_P_2, 1893 VEX_LEN_0F3A18_P_2, 1894 VEX_LEN_0F3A19_P_2, 1895 VEX_LEN_0F3A20_P_2, 1896 VEX_LEN_0F3A21_P_2, 1897 VEX_LEN_0F3A22_P_2, 1898 VEX_LEN_0F3A30_P_2, 1899 VEX_LEN_0F3A31_P_2, 1900 VEX_LEN_0F3A32_P_2, 1901 VEX_LEN_0F3A33_P_2, 1902 VEX_LEN_0F3A38_P_2, 1903 VEX_LEN_0F3A39_P_2, 1904 VEX_LEN_0F3A41_P_2, 1905 VEX_LEN_0F3A46_P_2, 1906 VEX_LEN_0F3A60_P_2, 1907 VEX_LEN_0F3A61_P_2, 1908 VEX_LEN_0F3A62_P_2, 1909 VEX_LEN_0F3A63_P_2, 1910 VEX_LEN_0F3A6A_P_2, 1911 VEX_LEN_0F3A6B_P_2, 1912 VEX_LEN_0F3A6E_P_2, 1913 VEX_LEN_0F3A6F_P_2, 1914 VEX_LEN_0F3A7A_P_2, 1915 VEX_LEN_0F3A7B_P_2, 1916 VEX_LEN_0F3A7E_P_2, 1917 VEX_LEN_0F3A7F_P_2, 1918 VEX_LEN_0F3ADF_P_2, 1919 VEX_LEN_0F3AF0_P_3, 1920 VEX_LEN_0FXOP_08_CC, 1921 VEX_LEN_0FXOP_08_CD, 1922 VEX_LEN_0FXOP_08_CE, 1923 VEX_LEN_0FXOP_08_CF, 1924 VEX_LEN_0FXOP_08_EC, 1925 VEX_LEN_0FXOP_08_ED, 1926 VEX_LEN_0FXOP_08_EE, 1927 VEX_LEN_0FXOP_08_EF, 1928 VEX_LEN_0FXOP_09_80, 1929 VEX_LEN_0FXOP_09_81 1930 }; 1931 1932 enum 1933 { 1934 EVEX_LEN_0F6E_P_2 = 0, 1935 EVEX_LEN_0F7E_P_1, 1936 EVEX_LEN_0F7E_P_2, 1937 EVEX_LEN_0FD6_P_2 1938 }; 1939 1940 enum 1941 { 1942 VEX_W_0F41_P_0_LEN_1 = 0, 1943 VEX_W_0F41_P_2_LEN_1, 1944 VEX_W_0F42_P_0_LEN_1, 1945 VEX_W_0F42_P_2_LEN_1, 1946 VEX_W_0F44_P_0_LEN_0, 1947 VEX_W_0F44_P_2_LEN_0, 1948 VEX_W_0F45_P_0_LEN_1, 1949 VEX_W_0F45_P_2_LEN_1, 1950 VEX_W_0F46_P_0_LEN_1, 1951 VEX_W_0F46_P_2_LEN_1, 1952 VEX_W_0F47_P_0_LEN_1, 1953 VEX_W_0F47_P_2_LEN_1, 1954 VEX_W_0F4A_P_0_LEN_1, 1955 VEX_W_0F4A_P_2_LEN_1, 1956 VEX_W_0F4B_P_0_LEN_1, 1957 VEX_W_0F4B_P_2_LEN_1, 1958 VEX_W_0F90_P_0_LEN_0, 1959 VEX_W_0F90_P_2_LEN_0, 1960 VEX_W_0F91_P_0_LEN_0, 1961 VEX_W_0F91_P_2_LEN_0, 1962 VEX_W_0F92_P_0_LEN_0, 1963 VEX_W_0F92_P_2_LEN_0, 1964 VEX_W_0F93_P_0_LEN_0, 1965 VEX_W_0F93_P_2_LEN_0, 1966 VEX_W_0F98_P_0_LEN_0, 1967 VEX_W_0F98_P_2_LEN_0, 1968 VEX_W_0F99_P_0_LEN_0, 1969 VEX_W_0F99_P_2_LEN_0, 1970 VEX_W_0F380C_P_2, 1971 VEX_W_0F380D_P_2, 1972 VEX_W_0F380E_P_2, 1973 VEX_W_0F380F_P_2, 1974 VEX_W_0F3816_P_2, 1975 VEX_W_0F3818_P_2, 1976 VEX_W_0F3819_P_2, 1977 VEX_W_0F381A_P_2_M_0, 1978 VEX_W_0F382C_P_2_M_0, 1979 VEX_W_0F382D_P_2_M_0, 1980 VEX_W_0F382E_P_2_M_0, 1981 VEX_W_0F382F_P_2_M_0, 1982 VEX_W_0F3836_P_2, 1983 VEX_W_0F3846_P_2, 1984 VEX_W_0F3858_P_2, 1985 VEX_W_0F3859_P_2, 1986 VEX_W_0F385A_P_2_M_0, 1987 VEX_W_0F3878_P_2, 1988 VEX_W_0F3879_P_2, 1989 VEX_W_0F38CF_P_2, 1990 VEX_W_0F3A00_P_2, 1991 VEX_W_0F3A01_P_2, 1992 VEX_W_0F3A02_P_2, 1993 VEX_W_0F3A04_P_2, 1994 VEX_W_0F3A05_P_2, 1995 VEX_W_0F3A06_P_2, 1996 VEX_W_0F3A18_P_2, 1997 VEX_W_0F3A19_P_2, 1998 VEX_W_0F3A30_P_2_LEN_0, 1999 VEX_W_0F3A31_P_2_LEN_0, 2000 VEX_W_0F3A32_P_2_LEN_0, 2001 VEX_W_0F3A33_P_2_LEN_0, 2002 VEX_W_0F3A38_P_2, 2003 VEX_W_0F3A39_P_2, 2004 VEX_W_0F3A46_P_2, 2005 VEX_W_0F3A48_P_2, 2006 VEX_W_0F3A49_P_2, 2007 VEX_W_0F3A4A_P_2, 2008 VEX_W_0F3A4B_P_2, 2009 VEX_W_0F3A4C_P_2, 2010 VEX_W_0F3ACE_P_2, 2011 VEX_W_0F3ACF_P_2, 2012 2013 EVEX_W_0F10_P_0, 2014 EVEX_W_0F10_P_1_M_0, 2015 EVEX_W_0F10_P_1_M_1, 2016 EVEX_W_0F10_P_2, 2017 EVEX_W_0F10_P_3_M_0, 2018 EVEX_W_0F10_P_3_M_1, 2019 EVEX_W_0F11_P_0, 2020 EVEX_W_0F11_P_1_M_0, 2021 EVEX_W_0F11_P_1_M_1, 2022 EVEX_W_0F11_P_2, 2023 EVEX_W_0F11_P_3_M_0, 2024 EVEX_W_0F11_P_3_M_1, 2025 EVEX_W_0F12_P_0_M_0, 2026 EVEX_W_0F12_P_0_M_1, 2027 EVEX_W_0F12_P_1, 2028 EVEX_W_0F12_P_2, 2029 EVEX_W_0F12_P_3, 2030 EVEX_W_0F13_P_0, 2031 EVEX_W_0F13_P_2, 2032 EVEX_W_0F14_P_0, 2033 EVEX_W_0F14_P_2, 2034 EVEX_W_0F15_P_0, 2035 EVEX_W_0F15_P_2, 2036 EVEX_W_0F16_P_0_M_0, 2037 EVEX_W_0F16_P_0_M_1, 2038 EVEX_W_0F16_P_1, 2039 EVEX_W_0F16_P_2, 2040 EVEX_W_0F17_P_0, 2041 EVEX_W_0F17_P_2, 2042 EVEX_W_0F28_P_0, 2043 EVEX_W_0F28_P_2, 2044 EVEX_W_0F29_P_0, 2045 EVEX_W_0F29_P_2, 2046 EVEX_W_0F2A_P_1, 2047 EVEX_W_0F2A_P_3, 2048 EVEX_W_0F2B_P_0, 2049 EVEX_W_0F2B_P_2, 2050 EVEX_W_0F2E_P_0, 2051 EVEX_W_0F2E_P_2, 2052 EVEX_W_0F2F_P_0, 2053 EVEX_W_0F2F_P_2, 2054 EVEX_W_0F51_P_0, 2055 EVEX_W_0F51_P_1, 2056 EVEX_W_0F51_P_2, 2057 EVEX_W_0F51_P_3, 2058 EVEX_W_0F54_P_0, 2059 EVEX_W_0F54_P_2, 2060 EVEX_W_0F55_P_0, 2061 EVEX_W_0F55_P_2, 2062 EVEX_W_0F56_P_0, 2063 EVEX_W_0F56_P_2, 2064 EVEX_W_0F57_P_0, 2065 EVEX_W_0F57_P_2, 2066 EVEX_W_0F58_P_0, 2067 EVEX_W_0F58_P_1, 2068 EVEX_W_0F58_P_2, 2069 EVEX_W_0F58_P_3, 2070 EVEX_W_0F59_P_0, 2071 EVEX_W_0F59_P_1, 2072 EVEX_W_0F59_P_2, 2073 EVEX_W_0F59_P_3, 2074 EVEX_W_0F5A_P_0, 2075 EVEX_W_0F5A_P_1, 2076 EVEX_W_0F5A_P_2, 2077 EVEX_W_0F5A_P_3, 2078 EVEX_W_0F5B_P_0, 2079 EVEX_W_0F5B_P_1, 2080 EVEX_W_0F5B_P_2, 2081 EVEX_W_0F5C_P_0, 2082 EVEX_W_0F5C_P_1, 2083 EVEX_W_0F5C_P_2, 2084 EVEX_W_0F5C_P_3, 2085 EVEX_W_0F5D_P_0, 2086 EVEX_W_0F5D_P_1, 2087 EVEX_W_0F5D_P_2, 2088 EVEX_W_0F5D_P_3, 2089 EVEX_W_0F5E_P_0, 2090 EVEX_W_0F5E_P_1, 2091 EVEX_W_0F5E_P_2, 2092 EVEX_W_0F5E_P_3, 2093 EVEX_W_0F5F_P_0, 2094 EVEX_W_0F5F_P_1, 2095 EVEX_W_0F5F_P_2, 2096 EVEX_W_0F5F_P_3, 2097 EVEX_W_0F62_P_2, 2098 EVEX_W_0F66_P_2, 2099 EVEX_W_0F6A_P_2, 2100 EVEX_W_0F6B_P_2, 2101 EVEX_W_0F6C_P_2, 2102 EVEX_W_0F6D_P_2, 2103 EVEX_W_0F6F_P_1, 2104 EVEX_W_0F6F_P_2, 2105 EVEX_W_0F6F_P_3, 2106 EVEX_W_0F70_P_2, 2107 EVEX_W_0F72_R_2_P_2, 2108 EVEX_W_0F72_R_6_P_2, 2109 EVEX_W_0F73_R_2_P_2, 2110 EVEX_W_0F73_R_6_P_2, 2111 EVEX_W_0F76_P_2, 2112 EVEX_W_0F78_P_0, 2113 EVEX_W_0F78_P_2, 2114 EVEX_W_0F79_P_0, 2115 EVEX_W_0F79_P_2, 2116 EVEX_W_0F7A_P_1, 2117 EVEX_W_0F7A_P_2, 2118 EVEX_W_0F7A_P_3, 2119 EVEX_W_0F7B_P_1, 2120 EVEX_W_0F7B_P_2, 2121 EVEX_W_0F7B_P_3, 2122 EVEX_W_0F7E_P_1, 2123 EVEX_W_0F7F_P_1, 2124 EVEX_W_0F7F_P_2, 2125 EVEX_W_0F7F_P_3, 2126 EVEX_W_0FC2_P_0, 2127 EVEX_W_0FC2_P_1, 2128 EVEX_W_0FC2_P_2, 2129 EVEX_W_0FC2_P_3, 2130 EVEX_W_0FC6_P_0, 2131 EVEX_W_0FC6_P_2, 2132 EVEX_W_0FD2_P_2, 2133 EVEX_W_0FD3_P_2, 2134 EVEX_W_0FD4_P_2, 2135 EVEX_W_0FD6_P_2, 2136 EVEX_W_0FE6_P_1, 2137 EVEX_W_0FE6_P_2, 2138 EVEX_W_0FE6_P_3, 2139 EVEX_W_0FE7_P_2, 2140 EVEX_W_0FF2_P_2, 2141 EVEX_W_0FF3_P_2, 2142 EVEX_W_0FF4_P_2, 2143 EVEX_W_0FFA_P_2, 2144 EVEX_W_0FFB_P_2, 2145 EVEX_W_0FFE_P_2, 2146 EVEX_W_0F380C_P_2, 2147 EVEX_W_0F380D_P_2, 2148 EVEX_W_0F3810_P_1, 2149 EVEX_W_0F3810_P_2, 2150 EVEX_W_0F3811_P_1, 2151 EVEX_W_0F3811_P_2, 2152 EVEX_W_0F3812_P_1, 2153 EVEX_W_0F3812_P_2, 2154 EVEX_W_0F3813_P_1, 2155 EVEX_W_0F3813_P_2, 2156 EVEX_W_0F3814_P_1, 2157 EVEX_W_0F3815_P_1, 2158 EVEX_W_0F3818_P_2, 2159 EVEX_W_0F3819_P_2, 2160 EVEX_W_0F381A_P_2, 2161 EVEX_W_0F381B_P_2, 2162 EVEX_W_0F381E_P_2, 2163 EVEX_W_0F381F_P_2, 2164 EVEX_W_0F3820_P_1, 2165 EVEX_W_0F3821_P_1, 2166 EVEX_W_0F3822_P_1, 2167 EVEX_W_0F3823_P_1, 2168 EVEX_W_0F3824_P_1, 2169 EVEX_W_0F3825_P_1, 2170 EVEX_W_0F3825_P_2, 2171 EVEX_W_0F3826_P_1, 2172 EVEX_W_0F3826_P_2, 2173 EVEX_W_0F3828_P_1, 2174 EVEX_W_0F3828_P_2, 2175 EVEX_W_0F3829_P_1, 2176 EVEX_W_0F3829_P_2, 2177 EVEX_W_0F382A_P_1, 2178 EVEX_W_0F382A_P_2, 2179 EVEX_W_0F382B_P_2, 2180 EVEX_W_0F3830_P_1, 2181 EVEX_W_0F3831_P_1, 2182 EVEX_W_0F3832_P_1, 2183 EVEX_W_0F3833_P_1, 2184 EVEX_W_0F3834_P_1, 2185 EVEX_W_0F3835_P_1, 2186 EVEX_W_0F3835_P_2, 2187 EVEX_W_0F3837_P_2, 2188 EVEX_W_0F3838_P_1, 2189 EVEX_W_0F3839_P_1, 2190 EVEX_W_0F383A_P_1, 2191 EVEX_W_0F3840_P_2, 2192 EVEX_W_0F3854_P_2, 2193 EVEX_W_0F3855_P_2, 2194 EVEX_W_0F3858_P_2, 2195 EVEX_W_0F3859_P_2, 2196 EVEX_W_0F385A_P_2, 2197 EVEX_W_0F385B_P_2, 2198 EVEX_W_0F3862_P_2, 2199 EVEX_W_0F3863_P_2, 2200 EVEX_W_0F3866_P_2, 2201 EVEX_W_0F3870_P_2, 2202 EVEX_W_0F3871_P_2, 2203 EVEX_W_0F3872_P_2, 2204 EVEX_W_0F3873_P_2, 2205 EVEX_W_0F3875_P_2, 2206 EVEX_W_0F3878_P_2, 2207 EVEX_W_0F3879_P_2, 2208 EVEX_W_0F387A_P_2, 2209 EVEX_W_0F387B_P_2, 2210 EVEX_W_0F387D_P_2, 2211 EVEX_W_0F3883_P_2, 2212 EVEX_W_0F388D_P_2, 2213 EVEX_W_0F3891_P_2, 2214 EVEX_W_0F3893_P_2, 2215 EVEX_W_0F38A1_P_2, 2216 EVEX_W_0F38A3_P_2, 2217 EVEX_W_0F38C7_R_1_P_2, 2218 EVEX_W_0F38C7_R_2_P_2, 2219 EVEX_W_0F38C7_R_5_P_2, 2220 EVEX_W_0F38C7_R_6_P_2, 2221 2222 EVEX_W_0F3A00_P_2, 2223 EVEX_W_0F3A01_P_2, 2224 EVEX_W_0F3A04_P_2, 2225 EVEX_W_0F3A05_P_2, 2226 EVEX_W_0F3A08_P_2, 2227 EVEX_W_0F3A09_P_2, 2228 EVEX_W_0F3A0A_P_2, 2229 EVEX_W_0F3A0B_P_2, 2230 EVEX_W_0F3A18_P_2, 2231 EVEX_W_0F3A19_P_2, 2232 EVEX_W_0F3A1A_P_2, 2233 EVEX_W_0F3A1B_P_2, 2234 EVEX_W_0F3A1D_P_2, 2235 EVEX_W_0F3A21_P_2, 2236 EVEX_W_0F3A23_P_2, 2237 EVEX_W_0F3A38_P_2, 2238 EVEX_W_0F3A39_P_2, 2239 EVEX_W_0F3A3A_P_2, 2240 EVEX_W_0F3A3B_P_2, 2241 EVEX_W_0F3A3E_P_2, 2242 EVEX_W_0F3A3F_P_2, 2243 EVEX_W_0F3A42_P_2, 2244 EVEX_W_0F3A43_P_2, 2245 EVEX_W_0F3A50_P_2, 2246 EVEX_W_0F3A51_P_2, 2247 EVEX_W_0F3A56_P_2, 2248 EVEX_W_0F3A57_P_2, 2249 EVEX_W_0F3A66_P_2, 2250 EVEX_W_0F3A67_P_2, 2251 EVEX_W_0F3A70_P_2, 2252 EVEX_W_0F3A71_P_2, 2253 EVEX_W_0F3A72_P_2, 2254 EVEX_W_0F3A73_P_2, 2255 EVEX_W_0F3ACE_P_2, 2256 EVEX_W_0F3ACF_P_2 2257 }; 2258 2259 typedef void (*op_rtn) (int bytemode, int sizeflag); 2260 2261 struct dis386 { 2262 const char *name; 2263 struct 2264 { 2265 op_rtn rtn; 2266 int bytemode; 2267 } op[MAX_OPERANDS]; 2268 unsigned int prefix_requirement; 2269 }; 2270 2271 /* Upper case letters in the instruction names here are macros. 2272 'A' => print 'b' if no register operands or suffix_always is true 2273 'B' => print 'b' if suffix_always is true 2274 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand 2275 size prefix 2276 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if 2277 suffix_always is true 2278 'E' => print 'e' if 32-bit form of jcxz 2279 'F' => print 'w' or 'l' depending on address size prefix (loop insns) 2280 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns) 2281 'H' => print ",pt" or ",pn" branch hint 2282 'I' => honor following macro letter even in Intel mode (implemented only 2283 for some of the macro letters) 2284 'J' => print 'l' 2285 'K' => print 'd' or 'q' if rex prefix is present. 2286 'L' => print 'l' if suffix_always is true 2287 'M' => print 'r' if intel_mnemonic is false. 2288 'N' => print 'n' if instruction has no wait "prefix" 2289 'O' => print 'd' or 'o' (or 'q' in Intel mode) 2290 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix, 2291 or suffix_always is true. print 'q' if rex prefix is present. 2292 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always 2293 is true 2294 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode) 2295 'S' => print 'w', 'l' or 'q' if suffix_always is true 2296 'T' => print 'q' in 64bit mode if instruction has no operand size 2297 prefix and behave as 'P' otherwise 2298 'U' => print 'q' in 64bit mode if instruction has no operand size 2299 prefix and behave as 'Q' otherwise 2300 'V' => print 'q' in 64bit mode if instruction has no operand size 2301 prefix and behave as 'S' otherwise 2302 'W' => print 'b', 'w' or 'l' ('d' in Intel mode) 2303 'X' => print 's', 'd' depending on data16 prefix (for XMM) 2304 'Y' unused. 2305 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise 2306 '!' => change condition from true to false or from false to true. 2307 '%' => add 1 upper case letter to the macro. 2308 '^' => print 'w' or 'l' depending on operand size prefix or 2309 suffix_always is true (lcall/ljmp). 2310 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending 2311 on operand size prefix. 2312 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction 2313 has no operand size prefix for AMD64 ISA, behave as 'P' 2314 otherwise 2315 2316 2 upper case letter macros: 2317 "XY" => print 'x' or 'y' if suffix_always is true or no register 2318 operands and no broadcast. 2319 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no 2320 register operands and no broadcast. 2321 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA) 2322 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand 2323 or suffix_always is true 2324 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise 2325 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise 2326 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise 2327 "LW" => print 'd', 'q' depending on the VEX.W bit 2328 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has 2329 an operand size prefix, or suffix_always is true. print 2330 'q' if rex prefix is present. 2331 2332 Many of the above letters print nothing in Intel mode. See "putop" 2333 for the details. 2334 2335 Braces '{' and '}', and vertical bars '|', indicate alternative 2336 mnemonic strings for AT&T and Intel. */ 2337 2338 static const struct dis386 dis386[] = { 2339 /* 00 */ 2340 { "addB", { Ebh1, Gb }, 0 }, 2341 { "addS", { Evh1, Gv }, 0 }, 2342 { "addB", { Gb, EbS }, 0 }, 2343 { "addS", { Gv, EvS }, 0 }, 2344 { "addB", { AL, Ib }, 0 }, 2345 { "addS", { eAX, Iv }, 0 }, 2346 { X86_64_TABLE (X86_64_06) }, 2347 { X86_64_TABLE (X86_64_07) }, 2348 /* 08 */ 2349 { "orB", { Ebh1, Gb }, 0 }, 2350 { "orS", { Evh1, Gv }, 0 }, 2351 { "orB", { Gb, EbS }, 0 }, 2352 { "orS", { Gv, EvS }, 0 }, 2353 { "orB", { AL, Ib }, 0 }, 2354 { "orS", { eAX, Iv }, 0 }, 2355 { X86_64_TABLE (X86_64_0D) }, 2356 { Bad_Opcode }, /* 0x0f extended opcode escape */ 2357 /* 10 */ 2358 { "adcB", { Ebh1, Gb }, 0 }, 2359 { "adcS", { Evh1, Gv }, 0 }, 2360 { "adcB", { Gb, EbS }, 0 }, 2361 { "adcS", { Gv, EvS }, 0 }, 2362 { "adcB", { AL, Ib }, 0 }, 2363 { "adcS", { eAX, Iv }, 0 }, 2364 { X86_64_TABLE (X86_64_16) }, 2365 { X86_64_TABLE (X86_64_17) }, 2366 /* 18 */ 2367 { "sbbB", { Ebh1, Gb }, 0 }, 2368 { "sbbS", { Evh1, Gv }, 0 }, 2369 { "sbbB", { Gb, EbS }, 0 }, 2370 { "sbbS", { Gv, EvS }, 0 }, 2371 { "sbbB", { AL, Ib }, 0 }, 2372 { "sbbS", { eAX, Iv }, 0 }, 2373 { X86_64_TABLE (X86_64_1E) }, 2374 { X86_64_TABLE (X86_64_1F) }, 2375 /* 20 */ 2376 { "andB", { Ebh1, Gb }, 0 }, 2377 { "andS", { Evh1, Gv }, 0 }, 2378 { "andB", { Gb, EbS }, 0 }, 2379 { "andS", { Gv, EvS }, 0 }, 2380 { "andB", { AL, Ib }, 0 }, 2381 { "andS", { eAX, Iv }, 0 }, 2382 { Bad_Opcode }, /* SEG ES prefix */ 2383 { X86_64_TABLE (X86_64_27) }, 2384 /* 28 */ 2385 { "subB", { Ebh1, Gb }, 0 }, 2386 { "subS", { Evh1, Gv }, 0 }, 2387 { "subB", { Gb, EbS }, 0 }, 2388 { "subS", { Gv, EvS }, 0 }, 2389 { "subB", { AL, Ib }, 0 }, 2390 { "subS", { eAX, Iv }, 0 }, 2391 { Bad_Opcode }, /* SEG CS prefix */ 2392 { X86_64_TABLE (X86_64_2F) }, 2393 /* 30 */ 2394 { "xorB", { Ebh1, Gb }, 0 }, 2395 { "xorS", { Evh1, Gv }, 0 }, 2396 { "xorB", { Gb, EbS }, 0 }, 2397 { "xorS", { Gv, EvS }, 0 }, 2398 { "xorB", { AL, Ib }, 0 }, 2399 { "xorS", { eAX, Iv }, 0 }, 2400 { Bad_Opcode }, /* SEG SS prefix */ 2401 { X86_64_TABLE (X86_64_37) }, 2402 /* 38 */ 2403 { "cmpB", { Eb, Gb }, 0 }, 2404 { "cmpS", { Ev, Gv }, 0 }, 2405 { "cmpB", { Gb, EbS }, 0 }, 2406 { "cmpS", { Gv, EvS }, 0 }, 2407 { "cmpB", { AL, Ib }, 0 }, 2408 { "cmpS", { eAX, Iv }, 0 }, 2409 { Bad_Opcode }, /* SEG DS prefix */ 2410 { X86_64_TABLE (X86_64_3F) }, 2411 /* 40 */ 2412 { "inc{S|}", { RMeAX }, 0 }, 2413 { "inc{S|}", { RMeCX }, 0 }, 2414 { "inc{S|}", { RMeDX }, 0 }, 2415 { "inc{S|}", { RMeBX }, 0 }, 2416 { "inc{S|}", { RMeSP }, 0 }, 2417 { "inc{S|}", { RMeBP }, 0 }, 2418 { "inc{S|}", { RMeSI }, 0 }, 2419 { "inc{S|}", { RMeDI }, 0 }, 2420 /* 48 */ 2421 { "dec{S|}", { RMeAX }, 0 }, 2422 { "dec{S|}", { RMeCX }, 0 }, 2423 { "dec{S|}", { RMeDX }, 0 }, 2424 { "dec{S|}", { RMeBX }, 0 }, 2425 { "dec{S|}", { RMeSP }, 0 }, 2426 { "dec{S|}", { RMeBP }, 0 }, 2427 { "dec{S|}", { RMeSI }, 0 }, 2428 { "dec{S|}", { RMeDI }, 0 }, 2429 /* 50 */ 2430 { "pushV", { RMrAX }, 0 }, 2431 { "pushV", { RMrCX }, 0 }, 2432 { "pushV", { RMrDX }, 0 }, 2433 { "pushV", { RMrBX }, 0 }, 2434 { "pushV", { RMrSP }, 0 }, 2435 { "pushV", { RMrBP }, 0 }, 2436 { "pushV", { RMrSI }, 0 }, 2437 { "pushV", { RMrDI }, 0 }, 2438 /* 58 */ 2439 { "popV", { RMrAX }, 0 }, 2440 { "popV", { RMrCX }, 0 }, 2441 { "popV", { RMrDX }, 0 }, 2442 { "popV", { RMrBX }, 0 }, 2443 { "popV", { RMrSP }, 0 }, 2444 { "popV", { RMrBP }, 0 }, 2445 { "popV", { RMrSI }, 0 }, 2446 { "popV", { RMrDI }, 0 }, 2447 /* 60 */ 2448 { X86_64_TABLE (X86_64_60) }, 2449 { X86_64_TABLE (X86_64_61) }, 2450 { X86_64_TABLE (X86_64_62) }, 2451 { X86_64_TABLE (X86_64_63) }, 2452 { Bad_Opcode }, /* seg fs */ 2453 { Bad_Opcode }, /* seg gs */ 2454 { Bad_Opcode }, /* op size prefix */ 2455 { Bad_Opcode }, /* adr size prefix */ 2456 /* 68 */ 2457 { "pushT", { sIv }, 0 }, 2458 { "imulS", { Gv, Ev, Iv }, 0 }, 2459 { "pushT", { sIbT }, 0 }, 2460 { "imulS", { Gv, Ev, sIb }, 0 }, 2461 { "ins{b|}", { Ybr, indirDX }, 0 }, 2462 { X86_64_TABLE (X86_64_6D) }, 2463 { "outs{b|}", { indirDXr, Xb }, 0 }, 2464 { X86_64_TABLE (X86_64_6F) }, 2465 /* 70 */ 2466 { "joH", { Jb, BND, cond_jump_flag }, 0 }, 2467 { "jnoH", { Jb, BND, cond_jump_flag }, 0 }, 2468 { "jbH", { Jb, BND, cond_jump_flag }, 0 }, 2469 { "jaeH", { Jb, BND, cond_jump_flag }, 0 }, 2470 { "jeH", { Jb, BND, cond_jump_flag }, 0 }, 2471 { "jneH", { Jb, BND, cond_jump_flag }, 0 }, 2472 { "jbeH", { Jb, BND, cond_jump_flag }, 0 }, 2473 { "jaH", { Jb, BND, cond_jump_flag }, 0 }, 2474 /* 78 */ 2475 { "jsH", { Jb, BND, cond_jump_flag }, 0 }, 2476 { "jnsH", { Jb, BND, cond_jump_flag }, 0 }, 2477 { "jpH", { Jb, BND, cond_jump_flag }, 0 }, 2478 { "jnpH", { Jb, BND, cond_jump_flag }, 0 }, 2479 { "jlH", { Jb, BND, cond_jump_flag }, 0 }, 2480 { "jgeH", { Jb, BND, cond_jump_flag }, 0 }, 2481 { "jleH", { Jb, BND, cond_jump_flag }, 0 }, 2482 { "jgH", { Jb, BND, cond_jump_flag }, 0 }, 2483 /* 80 */ 2484 { REG_TABLE (REG_80) }, 2485 { REG_TABLE (REG_81) }, 2486 { X86_64_TABLE (X86_64_82) }, 2487 { REG_TABLE (REG_83) }, 2488 { "testB", { Eb, Gb }, 0 }, 2489 { "testS", { Ev, Gv }, 0 }, 2490 { "xchgB", { Ebh2, Gb }, 0 }, 2491 { "xchgS", { Evh2, Gv }, 0 }, 2492 /* 88 */ 2493 { "movB", { Ebh3, Gb }, 0 }, 2494 { "movS", { Evh3, Gv }, 0 }, 2495 { "movB", { Gb, EbS }, 0 }, 2496 { "movS", { Gv, EvS }, 0 }, 2497 { "movD", { Sv, Sw }, 0 }, 2498 { MOD_TABLE (MOD_8D) }, 2499 { "movD", { Sw, Sv }, 0 }, 2500 { REG_TABLE (REG_8F) }, 2501 /* 90 */ 2502 { PREFIX_TABLE (PREFIX_90) }, 2503 { "xchgS", { RMeCX, eAX }, 0 }, 2504 { "xchgS", { RMeDX, eAX }, 0 }, 2505 { "xchgS", { RMeBX, eAX }, 0 }, 2506 { "xchgS", { RMeSP, eAX }, 0 }, 2507 { "xchgS", { RMeBP, eAX }, 0 }, 2508 { "xchgS", { RMeSI, eAX }, 0 }, 2509 { "xchgS", { RMeDI, eAX }, 0 }, 2510 /* 98 */ 2511 { "cW{t|}R", { XX }, 0 }, 2512 { "cR{t|}O", { XX }, 0 }, 2513 { X86_64_TABLE (X86_64_9A) }, 2514 { Bad_Opcode }, /* fwait */ 2515 { "pushfT", { XX }, 0 }, 2516 { "popfT", { XX }, 0 }, 2517 { "sahf", { XX }, 0 }, 2518 { "lahf", { XX }, 0 }, 2519 /* a0 */ 2520 { "mov%LB", { AL, Ob }, 0 }, 2521 { "mov%LS", { eAX, Ov }, 0 }, 2522 { "mov%LB", { Ob, AL }, 0 }, 2523 { "mov%LS", { Ov, eAX }, 0 }, 2524 { "movs{b|}", { Ybr, Xb }, 0 }, 2525 { "movs{R|}", { Yvr, Xv }, 0 }, 2526 { "cmps{b|}", { Xb, Yb }, 0 }, 2527 { "cmps{R|}", { Xv, Yv }, 0 }, 2528 /* a8 */ 2529 { "testB", { AL, Ib }, 0 }, 2530 { "testS", { eAX, Iv }, 0 }, 2531 { "stosB", { Ybr, AL }, 0 }, 2532 { "stosS", { Yvr, eAX }, 0 }, 2533 { "lodsB", { ALr, Xb }, 0 }, 2534 { "lodsS", { eAXr, Xv }, 0 }, 2535 { "scasB", { AL, Yb }, 0 }, 2536 { "scasS", { eAX, Yv }, 0 }, 2537 /* b0 */ 2538 { "movB", { RMAL, Ib }, 0 }, 2539 { "movB", { RMCL, Ib }, 0 }, 2540 { "movB", { RMDL, Ib }, 0 }, 2541 { "movB", { RMBL, Ib }, 0 }, 2542 { "movB", { RMAH, Ib }, 0 }, 2543 { "movB", { RMCH, Ib }, 0 }, 2544 { "movB", { RMDH, Ib }, 0 }, 2545 { "movB", { RMBH, Ib }, 0 }, 2546 /* b8 */ 2547 { "mov%LV", { RMeAX, Iv64 }, 0 }, 2548 { "mov%LV", { RMeCX, Iv64 }, 0 }, 2549 { "mov%LV", { RMeDX, Iv64 }, 0 }, 2550 { "mov%LV", { RMeBX, Iv64 }, 0 }, 2551 { "mov%LV", { RMeSP, Iv64 }, 0 }, 2552 { "mov%LV", { RMeBP, Iv64 }, 0 }, 2553 { "mov%LV", { RMeSI, Iv64 }, 0 }, 2554 { "mov%LV", { RMeDI, Iv64 }, 0 }, 2555 /* c0 */ 2556 { REG_TABLE (REG_C0) }, 2557 { REG_TABLE (REG_C1) }, 2558 { "retT", { Iw, BND }, 0 }, 2559 { "retT", { BND }, 0 }, 2560 { X86_64_TABLE (X86_64_C4) }, 2561 { X86_64_TABLE (X86_64_C5) }, 2562 { REG_TABLE (REG_C6) }, 2563 { REG_TABLE (REG_C7) }, 2564 /* c8 */ 2565 { "enterT", { Iw, Ib }, 0 }, 2566 { "leaveT", { XX }, 0 }, 2567 { "Jret{|f}P", { Iw }, 0 }, 2568 { "Jret{|f}P", { XX }, 0 }, 2569 { "int3", { XX }, 0 }, 2570 { "int", { Ib }, 0 }, 2571 { X86_64_TABLE (X86_64_CE) }, 2572 { "iret%LP", { XX }, 0 }, 2573 /* d0 */ 2574 { REG_TABLE (REG_D0) }, 2575 { REG_TABLE (REG_D1) }, 2576 { REG_TABLE (REG_D2) }, 2577 { REG_TABLE (REG_D3) }, 2578 { X86_64_TABLE (X86_64_D4) }, 2579 { X86_64_TABLE (X86_64_D5) }, 2580 { Bad_Opcode }, 2581 { "xlat", { DSBX }, 0 }, 2582 /* d8 */ 2583 { FLOAT }, 2584 { FLOAT }, 2585 { FLOAT }, 2586 { FLOAT }, 2587 { FLOAT }, 2588 { FLOAT }, 2589 { FLOAT }, 2590 { FLOAT }, 2591 /* e0 */ 2592 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 }, 2593 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 }, 2594 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 }, 2595 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 }, 2596 { "inB", { AL, Ib }, 0 }, 2597 { "inG", { zAX, Ib }, 0 }, 2598 { "outB", { Ib, AL }, 0 }, 2599 { "outG", { Ib, zAX }, 0 }, 2600 /* e8 */ 2601 { X86_64_TABLE (X86_64_E8) }, 2602 { X86_64_TABLE (X86_64_E9) }, 2603 { X86_64_TABLE (X86_64_EA) }, 2604 { "jmp", { Jb, BND }, 0 }, 2605 { "inB", { AL, indirDX }, 0 }, 2606 { "inG", { zAX, indirDX }, 0 }, 2607 { "outB", { indirDX, AL }, 0 }, 2608 { "outG", { indirDX, zAX }, 0 }, 2609 /* f0 */ 2610 { Bad_Opcode }, /* lock prefix */ 2611 { "icebp", { XX }, 0 }, 2612 { Bad_Opcode }, /* repne */ 2613 { Bad_Opcode }, /* repz */ 2614 { "hlt", { XX }, 0 }, 2615 { "cmc", { XX }, 0 }, 2616 { REG_TABLE (REG_F6) }, 2617 { REG_TABLE (REG_F7) }, 2618 /* f8 */ 2619 { "clc", { XX }, 0 }, 2620 { "stc", { XX }, 0 }, 2621 { "cli", { XX }, 0 }, 2622 { "sti", { XX }, 0 }, 2623 { "cld", { XX }, 0 }, 2624 { "std", { XX }, 0 }, 2625 { REG_TABLE (REG_FE) }, 2626 { REG_TABLE (REG_FF) }, 2627 }; 2628 2629 static const struct dis386 dis386_twobyte[] = { 2630 /* 00 */ 2631 { REG_TABLE (REG_0F00 ) }, 2632 { REG_TABLE (REG_0F01 ) }, 2633 { "larS", { Gv, Ew }, 0 }, 2634 { "lslS", { Gv, Ew }, 0 }, 2635 { Bad_Opcode }, 2636 { "syscall", { XX }, 0 }, 2637 { "clts", { XX }, 0 }, 2638 { "sysret%LP", { XX }, 0 }, 2639 /* 08 */ 2640 { "invd", { XX }, 0 }, 2641 { PREFIX_TABLE (PREFIX_0F09) }, 2642 { Bad_Opcode }, 2643 { "ud2", { XX }, 0 }, 2644 { Bad_Opcode }, 2645 { REG_TABLE (REG_0F0D) }, 2646 { "femms", { XX }, 0 }, 2647 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */ 2648 /* 10 */ 2649 { PREFIX_TABLE (PREFIX_0F10) }, 2650 { PREFIX_TABLE (PREFIX_0F11) }, 2651 { PREFIX_TABLE (PREFIX_0F12) }, 2652 { MOD_TABLE (MOD_0F13) }, 2653 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE }, 2654 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE }, 2655 { PREFIX_TABLE (PREFIX_0F16) }, 2656 { MOD_TABLE (MOD_0F17) }, 2657 /* 18 */ 2658 { REG_TABLE (REG_0F18) }, 2659 { "nopQ", { Ev }, 0 }, 2660 { PREFIX_TABLE (PREFIX_0F1A) }, 2661 { PREFIX_TABLE (PREFIX_0F1B) }, 2662 { PREFIX_TABLE (PREFIX_0F1C) }, 2663 { "nopQ", { Ev }, 0 }, 2664 { PREFIX_TABLE (PREFIX_0F1E) }, 2665 { "nopQ", { Ev }, 0 }, 2666 /* 20 */ 2667 { "movZ", { Rm, Cm }, 0 }, 2668 { "movZ", { Rm, Dm }, 0 }, 2669 { "movZ", { Cm, Rm }, 0 }, 2670 { "movZ", { Dm, Rm }, 0 }, 2671 { MOD_TABLE (MOD_0F24) }, 2672 { Bad_Opcode }, 2673 { MOD_TABLE (MOD_0F26) }, 2674 { Bad_Opcode }, 2675 /* 28 */ 2676 { "movapX", { XM, EXx }, PREFIX_OPCODE }, 2677 { "movapX", { EXxS, XM }, PREFIX_OPCODE }, 2678 { PREFIX_TABLE (PREFIX_0F2A) }, 2679 { PREFIX_TABLE (PREFIX_0F2B) }, 2680 { PREFIX_TABLE (PREFIX_0F2C) }, 2681 { PREFIX_TABLE (PREFIX_0F2D) }, 2682 { PREFIX_TABLE (PREFIX_0F2E) }, 2683 { PREFIX_TABLE (PREFIX_0F2F) }, 2684 /* 30 */ 2685 { "wrmsr", { XX }, 0 }, 2686 { "rdtsc", { XX }, 0 }, 2687 { "rdmsr", { XX }, 0 }, 2688 { "rdpmc", { XX }, 0 }, 2689 { "sysenter", { XX }, 0 }, 2690 { "sysexit", { XX }, 0 }, 2691 { Bad_Opcode }, 2692 { "getsec", { XX }, 0 }, 2693 /* 38 */ 2694 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) }, 2695 { Bad_Opcode }, 2696 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) }, 2697 { Bad_Opcode }, 2698 { Bad_Opcode }, 2699 { Bad_Opcode }, 2700 { Bad_Opcode }, 2701 { Bad_Opcode }, 2702 /* 40 */ 2703 { "cmovoS", { Gv, Ev }, 0 }, 2704 { "cmovnoS", { Gv, Ev }, 0 }, 2705 { "cmovbS", { Gv, Ev }, 0 }, 2706 { "cmovaeS", { Gv, Ev }, 0 }, 2707 { "cmoveS", { Gv, Ev }, 0 }, 2708 { "cmovneS", { Gv, Ev }, 0 }, 2709 { "cmovbeS", { Gv, Ev }, 0 }, 2710 { "cmovaS", { Gv, Ev }, 0 }, 2711 /* 48 */ 2712 { "cmovsS", { Gv, Ev }, 0 }, 2713 { "cmovnsS", { Gv, Ev }, 0 }, 2714 { "cmovpS", { Gv, Ev }, 0 }, 2715 { "cmovnpS", { Gv, Ev }, 0 }, 2716 { "cmovlS", { Gv, Ev }, 0 }, 2717 { "cmovgeS", { Gv, Ev }, 0 }, 2718 { "cmovleS", { Gv, Ev }, 0 }, 2719 { "cmovgS", { Gv, Ev }, 0 }, 2720 /* 50 */ 2721 { MOD_TABLE (MOD_0F51) }, 2722 { PREFIX_TABLE (PREFIX_0F51) }, 2723 { PREFIX_TABLE (PREFIX_0F52) }, 2724 { PREFIX_TABLE (PREFIX_0F53) }, 2725 { "andpX", { XM, EXx }, PREFIX_OPCODE }, 2726 { "andnpX", { XM, EXx }, PREFIX_OPCODE }, 2727 { "orpX", { XM, EXx }, PREFIX_OPCODE }, 2728 { "xorpX", { XM, EXx }, PREFIX_OPCODE }, 2729 /* 58 */ 2730 { PREFIX_TABLE (PREFIX_0F58) }, 2731 { PREFIX_TABLE (PREFIX_0F59) }, 2732 { PREFIX_TABLE (PREFIX_0F5A) }, 2733 { PREFIX_TABLE (PREFIX_0F5B) }, 2734 { PREFIX_TABLE (PREFIX_0F5C) }, 2735 { PREFIX_TABLE (PREFIX_0F5D) }, 2736 { PREFIX_TABLE (PREFIX_0F5E) }, 2737 { PREFIX_TABLE (PREFIX_0F5F) }, 2738 /* 60 */ 2739 { PREFIX_TABLE (PREFIX_0F60) }, 2740 { PREFIX_TABLE (PREFIX_0F61) }, 2741 { PREFIX_TABLE (PREFIX_0F62) }, 2742 { "packsswb", { MX, EM }, PREFIX_OPCODE }, 2743 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE }, 2744 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE }, 2745 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE }, 2746 { "packuswb", { MX, EM }, PREFIX_OPCODE }, 2747 /* 68 */ 2748 { "punpckhbw", { MX, EM }, PREFIX_OPCODE }, 2749 { "punpckhwd", { MX, EM }, PREFIX_OPCODE }, 2750 { "punpckhdq", { MX, EM }, PREFIX_OPCODE }, 2751 { "packssdw", { MX, EM }, PREFIX_OPCODE }, 2752 { PREFIX_TABLE (PREFIX_0F6C) }, 2753 { PREFIX_TABLE (PREFIX_0F6D) }, 2754 { "movK", { MX, Edq }, PREFIX_OPCODE }, 2755 { PREFIX_TABLE (PREFIX_0F6F) }, 2756 /* 70 */ 2757 { PREFIX_TABLE (PREFIX_0F70) }, 2758 { REG_TABLE (REG_0F71) }, 2759 { REG_TABLE (REG_0F72) }, 2760 { REG_TABLE (REG_0F73) }, 2761 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE }, 2762 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE }, 2763 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE }, 2764 { "emms", { XX }, PREFIX_OPCODE }, 2765 /* 78 */ 2766 { PREFIX_TABLE (PREFIX_0F78) }, 2767 { PREFIX_TABLE (PREFIX_0F79) }, 2768 { Bad_Opcode }, 2769 { Bad_Opcode }, 2770 { PREFIX_TABLE (PREFIX_0F7C) }, 2771 { PREFIX_TABLE (PREFIX_0F7D) }, 2772 { PREFIX_TABLE (PREFIX_0F7E) }, 2773 { PREFIX_TABLE (PREFIX_0F7F) }, 2774 /* 80 */ 2775 { "joH", { Jv, BND, cond_jump_flag }, 0 }, 2776 { "jnoH", { Jv, BND, cond_jump_flag }, 0 }, 2777 { "jbH", { Jv, BND, cond_jump_flag }, 0 }, 2778 { "jaeH", { Jv, BND, cond_jump_flag }, 0 }, 2779 { "jeH", { Jv, BND, cond_jump_flag }, 0 }, 2780 { "jneH", { Jv, BND, cond_jump_flag }, 0 }, 2781 { "jbeH", { Jv, BND, cond_jump_flag }, 0 }, 2782 { "jaH", { Jv, BND, cond_jump_flag }, 0 }, 2783 /* 88 */ 2784 { "jsH", { Jv, BND, cond_jump_flag }, 0 }, 2785 { "jnsH", { Jv, BND, cond_jump_flag }, 0 }, 2786 { "jpH", { Jv, BND, cond_jump_flag }, 0 }, 2787 { "jnpH", { Jv, BND, cond_jump_flag }, 0 }, 2788 { "jlH", { Jv, BND, cond_jump_flag }, 0 }, 2789 { "jgeH", { Jv, BND, cond_jump_flag }, 0 }, 2790 { "jleH", { Jv, BND, cond_jump_flag }, 0 }, 2791 { "jgH", { Jv, BND, cond_jump_flag }, 0 }, 2792 /* 90 */ 2793 { "seto", { Eb }, 0 }, 2794 { "setno", { Eb }, 0 }, 2795 { "setb", { Eb }, 0 }, 2796 { "setae", { Eb }, 0 }, 2797 { "sete", { Eb }, 0 }, 2798 { "setne", { Eb }, 0 }, 2799 { "setbe", { Eb }, 0 }, 2800 { "seta", { Eb }, 0 }, 2801 /* 98 */ 2802 { "sets", { Eb }, 0 }, 2803 { "setns", { Eb }, 0 }, 2804 { "setp", { Eb }, 0 }, 2805 { "setnp", { Eb }, 0 }, 2806 { "setl", { Eb }, 0 }, 2807 { "setge", { Eb }, 0 }, 2808 { "setle", { Eb }, 0 }, 2809 { "setg", { Eb }, 0 }, 2810 /* a0 */ 2811 { "pushT", { fs }, 0 }, 2812 { "popT", { fs }, 0 }, 2813 { "cpuid", { XX }, 0 }, 2814 { "btS", { Ev, Gv }, 0 }, 2815 { "shldS", { Ev, Gv, Ib }, 0 }, 2816 { "shldS", { Ev, Gv, CL }, 0 }, 2817 { REG_TABLE (REG_0FA6) }, 2818 { REG_TABLE (REG_0FA7) }, 2819 /* a8 */ 2820 { "pushT", { gs }, 0 }, 2821 { "popT", { gs }, 0 }, 2822 { "rsm", { XX }, 0 }, 2823 { "btsS", { Evh1, Gv }, 0 }, 2824 { "shrdS", { Ev, Gv, Ib }, 0 }, 2825 { "shrdS", { Ev, Gv, CL }, 0 }, 2826 { REG_TABLE (REG_0FAE) }, 2827 { "imulS", { Gv, Ev }, 0 }, 2828 /* b0 */ 2829 { "cmpxchgB", { Ebh1, Gb }, 0 }, 2830 { "cmpxchgS", { Evh1, Gv }, 0 }, 2831 { MOD_TABLE (MOD_0FB2) }, 2832 { "btrS", { Evh1, Gv }, 0 }, 2833 { MOD_TABLE (MOD_0FB4) }, 2834 { MOD_TABLE (MOD_0FB5) }, 2835 { "movz{bR|x}", { Gv, Eb }, 0 }, 2836 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */ 2837 /* b8 */ 2838 { PREFIX_TABLE (PREFIX_0FB8) }, 2839 { "ud1S", { Gv, Ev }, 0 }, 2840 { REG_TABLE (REG_0FBA) }, 2841 { "btcS", { Evh1, Gv }, 0 }, 2842 { PREFIX_TABLE (PREFIX_0FBC) }, 2843 { PREFIX_TABLE (PREFIX_0FBD) }, 2844 { "movs{bR|x}", { Gv, Eb }, 0 }, 2845 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */ 2846 /* c0 */ 2847 { "xaddB", { Ebh1, Gb }, 0 }, 2848 { "xaddS", { Evh1, Gv }, 0 }, 2849 { PREFIX_TABLE (PREFIX_0FC2) }, 2850 { MOD_TABLE (MOD_0FC3) }, 2851 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE }, 2852 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE }, 2853 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE }, 2854 { REG_TABLE (REG_0FC7) }, 2855 /* c8 */ 2856 { "bswap", { RMeAX }, 0 }, 2857 { "bswap", { RMeCX }, 0 }, 2858 { "bswap", { RMeDX }, 0 }, 2859 { "bswap", { RMeBX }, 0 }, 2860 { "bswap", { RMeSP }, 0 }, 2861 { "bswap", { RMeBP }, 0 }, 2862 { "bswap", { RMeSI }, 0 }, 2863 { "bswap", { RMeDI }, 0 }, 2864 /* d0 */ 2865 { PREFIX_TABLE (PREFIX_0FD0) }, 2866 { "psrlw", { MX, EM }, PREFIX_OPCODE }, 2867 { "psrld", { MX, EM }, PREFIX_OPCODE }, 2868 { "psrlq", { MX, EM }, PREFIX_OPCODE }, 2869 { "paddq", { MX, EM }, PREFIX_OPCODE }, 2870 { "pmullw", { MX, EM }, PREFIX_OPCODE }, 2871 { PREFIX_TABLE (PREFIX_0FD6) }, 2872 { MOD_TABLE (MOD_0FD7) }, 2873 /* d8 */ 2874 { "psubusb", { MX, EM }, PREFIX_OPCODE }, 2875 { "psubusw", { MX, EM }, PREFIX_OPCODE }, 2876 { "pminub", { MX, EM }, PREFIX_OPCODE }, 2877 { "pand", { MX, EM }, PREFIX_OPCODE }, 2878 { "paddusb", { MX, EM }, PREFIX_OPCODE }, 2879 { "paddusw", { MX, EM }, PREFIX_OPCODE }, 2880 { "pmaxub", { MX, EM }, PREFIX_OPCODE }, 2881 { "pandn", { MX, EM }, PREFIX_OPCODE }, 2882 /* e0 */ 2883 { "pavgb", { MX, EM }, PREFIX_OPCODE }, 2884 { "psraw", { MX, EM }, PREFIX_OPCODE }, 2885 { "psrad", { MX, EM }, PREFIX_OPCODE }, 2886 { "pavgw", { MX, EM }, PREFIX_OPCODE }, 2887 { "pmulhuw", { MX, EM }, PREFIX_OPCODE }, 2888 { "pmulhw", { MX, EM }, PREFIX_OPCODE }, 2889 { PREFIX_TABLE (PREFIX_0FE6) }, 2890 { PREFIX_TABLE (PREFIX_0FE7) }, 2891 /* e8 */ 2892 { "psubsb", { MX, EM }, PREFIX_OPCODE }, 2893 { "psubsw", { MX, EM }, PREFIX_OPCODE }, 2894 { "pminsw", { MX, EM }, PREFIX_OPCODE }, 2895 { "por", { MX, EM }, PREFIX_OPCODE }, 2896 { "paddsb", { MX, EM }, PREFIX_OPCODE }, 2897 { "paddsw", { MX, EM }, PREFIX_OPCODE }, 2898 { "pmaxsw", { MX, EM }, PREFIX_OPCODE }, 2899 { "pxor", { MX, EM }, PREFIX_OPCODE }, 2900 /* f0 */ 2901 { PREFIX_TABLE (PREFIX_0FF0) }, 2902 { "psllw", { MX, EM }, PREFIX_OPCODE }, 2903 { "pslld", { MX, EM }, PREFIX_OPCODE }, 2904 { "psllq", { MX, EM }, PREFIX_OPCODE }, 2905 { "pmuludq", { MX, EM }, PREFIX_OPCODE }, 2906 { "pmaddwd", { MX, EM }, PREFIX_OPCODE }, 2907 { "psadbw", { MX, EM }, PREFIX_OPCODE }, 2908 { PREFIX_TABLE (PREFIX_0FF7) }, 2909 /* f8 */ 2910 { "psubb", { MX, EM }, PREFIX_OPCODE }, 2911 { "psubw", { MX, EM }, PREFIX_OPCODE }, 2912 { "psubd", { MX, EM }, PREFIX_OPCODE }, 2913 { "psubq", { MX, EM }, PREFIX_OPCODE }, 2914 { "paddb", { MX, EM }, PREFIX_OPCODE }, 2915 { "paddw", { MX, EM }, PREFIX_OPCODE }, 2916 { "paddd", { MX, EM }, PREFIX_OPCODE }, 2917 { "ud0S", { Gv, Ev }, 0 }, 2918 }; 2919 2920 static const unsigned char onebyte_has_modrm[256] = { 2921 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2922 /* ------------------------------- */ 2923 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */ 2924 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */ 2925 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */ 2926 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */ 2927 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */ 2928 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */ 2929 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */ 2930 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */ 2931 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */ 2932 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */ 2933 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */ 2934 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */ 2935 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */ 2936 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */ 2937 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */ 2938 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */ 2939 /* ------------------------------- */ 2940 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2941 }; 2942 2943 static const unsigned char twobyte_has_modrm[256] = { 2944 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2945 /* ------------------------------- */ 2946 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */ 2947 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */ 2948 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */ 2949 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */ 2950 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */ 2951 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */ 2952 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */ 2953 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */ 2954 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ 2955 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */ 2956 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */ 2957 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */ 2958 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */ 2959 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */ 2960 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */ 2961 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */ 2962 /* ------------------------------- */ 2963 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2964 }; 2965 2966 static char obuf[100]; 2967 static char *obufp; 2968 static char *mnemonicendp; 2969 static char scratchbuf[100]; 2970 static unsigned char *start_codep; 2971 static unsigned char *insn_codep; 2972 static unsigned char *codep; 2973 static unsigned char *end_codep; 2974 static int last_lock_prefix; 2975 static int last_repz_prefix; 2976 static int last_repnz_prefix; 2977 static int last_data_prefix; 2978 static int last_addr_prefix; 2979 static int last_rex_prefix; 2980 static int last_seg_prefix; 2981 static int fwait_prefix; 2982 /* The active segment register prefix. */ 2983 static int active_seg_prefix; 2984 #define MAX_CODE_LENGTH 15 2985 /* We can up to 14 prefixes since the maximum instruction length is 2986 15bytes. */ 2987 static int all_prefixes[MAX_CODE_LENGTH - 1]; 2988 static disassemble_info *the_info; 2989 static struct 2990 { 2991 int mod; 2992 int reg; 2993 int rm; 2994 } 2995 modrm; 2996 static unsigned char need_modrm; 2997 static struct 2998 { 2999 int scale; 3000 int index; 3001 int base; 3002 } 3003 sib; 3004 static struct 3005 { 3006 int register_specifier; 3007 int length; 3008 int prefix; 3009 int w; 3010 int evex; 3011 int r; 3012 int v; 3013 int mask_register_specifier; 3014 int zeroing; 3015 int ll; 3016 int b; 3017 } 3018 vex; 3019 static unsigned char need_vex; 3020 static unsigned char need_vex_reg; 3021 static unsigned char vex_w_done; 3022 3023 struct op 3024 { 3025 const char *name; 3026 unsigned int len; 3027 }; 3028 3029 /* If we are accessing mod/rm/reg without need_modrm set, then the 3030 values are stale. Hitting this abort likely indicates that you 3031 need to update onebyte_has_modrm or twobyte_has_modrm. */ 3032 #define MODRM_CHECK if (!need_modrm) abort () 3033 3034 static const char **names64; 3035 static const char **names32; 3036 static const char **names16; 3037 static const char **names8; 3038 static const char **names8rex; 3039 static const char **names_seg; 3040 static const char *index64; 3041 static const char *index32; 3042 static const char **index16; 3043 static const char **names_bnd; 3044 3045 static const char *intel_names64[] = { 3046 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", 3047 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" 3048 }; 3049 static const char *intel_names32[] = { 3050 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", 3051 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" 3052 }; 3053 static const char *intel_names16[] = { 3054 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", 3055 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" 3056 }; 3057 static const char *intel_names8[] = { 3058 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", 3059 }; 3060 static const char *intel_names8rex[] = { 3061 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", 3062 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" 3063 }; 3064 static const char *intel_names_seg[] = { 3065 "es", "cs", "ss", "ds", "fs", "gs", "?", "?", 3066 }; 3067 static const char *intel_index64 = "riz"; 3068 static const char *intel_index32 = "eiz"; 3069 static const char *intel_index16[] = { 3070 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx" 3071 }; 3072 3073 static const char *att_names64[] = { 3074 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", 3075 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" 3076 }; 3077 static const char *att_names32[] = { 3078 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", 3079 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" 3080 }; 3081 static const char *att_names16[] = { 3082 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", 3083 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" 3084 }; 3085 static const char *att_names8[] = { 3086 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh", 3087 }; 3088 static const char *att_names8rex[] = { 3089 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", 3090 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" 3091 }; 3092 static const char *att_names_seg[] = { 3093 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?", 3094 }; 3095 static const char *att_index64 = "%riz"; 3096 static const char *att_index32 = "%eiz"; 3097 static const char *att_index16[] = { 3098 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx" 3099 }; 3100 3101 static const char **names_mm; 3102 static const char *intel_names_mm[] = { 3103 "mm0", "mm1", "mm2", "mm3", 3104 "mm4", "mm5", "mm6", "mm7" 3105 }; 3106 static const char *att_names_mm[] = { 3107 "%mm0", "%mm1", "%mm2", "%mm3", 3108 "%mm4", "%mm5", "%mm6", "%mm7" 3109 }; 3110 3111 static const char *intel_names_bnd[] = { 3112 "bnd0", "bnd1", "bnd2", "bnd3" 3113 }; 3114 3115 static const char *att_names_bnd[] = { 3116 "%bnd0", "%bnd1", "%bnd2", "%bnd3" 3117 }; 3118 3119 static const char **names_xmm; 3120 static const char *intel_names_xmm[] = { 3121 "xmm0", "xmm1", "xmm2", "xmm3", 3122 "xmm4", "xmm5", "xmm6", "xmm7", 3123 "xmm8", "xmm9", "xmm10", "xmm11", 3124 "xmm12", "xmm13", "xmm14", "xmm15", 3125 "xmm16", "xmm17", "xmm18", "xmm19", 3126 "xmm20", "xmm21", "xmm22", "xmm23", 3127 "xmm24", "xmm25", "xmm26", "xmm27", 3128 "xmm28", "xmm29", "xmm30", "xmm31" 3129 }; 3130 static const char *att_names_xmm[] = { 3131 "%xmm0", "%xmm1", "%xmm2", "%xmm3", 3132 "%xmm4", "%xmm5", "%xmm6", "%xmm7", 3133 "%xmm8", "%xmm9", "%xmm10", "%xmm11", 3134 "%xmm12", "%xmm13", "%xmm14", "%xmm15", 3135 "%xmm16", "%xmm17", "%xmm18", "%xmm19", 3136 "%xmm20", "%xmm21", "%xmm22", "%xmm23", 3137 "%xmm24", "%xmm25", "%xmm26", "%xmm27", 3138 "%xmm28", "%xmm29", "%xmm30", "%xmm31" 3139 }; 3140 3141 static const char **names_ymm; 3142 static const char *intel_names_ymm[] = { 3143 "ymm0", "ymm1", "ymm2", "ymm3", 3144 "ymm4", "ymm5", "ymm6", "ymm7", 3145 "ymm8", "ymm9", "ymm10", "ymm11", 3146 "ymm12", "ymm13", "ymm14", "ymm15", 3147 "ymm16", "ymm17", "ymm18", "ymm19", 3148 "ymm20", "ymm21", "ymm22", "ymm23", 3149 "ymm24", "ymm25", "ymm26", "ymm27", 3150 "ymm28", "ymm29", "ymm30", "ymm31" 3151 }; 3152 static const char *att_names_ymm[] = { 3153 "%ymm0", "%ymm1", "%ymm2", "%ymm3", 3154 "%ymm4", "%ymm5", "%ymm6", "%ymm7", 3155 "%ymm8", "%ymm9", "%ymm10", "%ymm11", 3156 "%ymm12", "%ymm13", "%ymm14", "%ymm15", 3157 "%ymm16", "%ymm17", "%ymm18", "%ymm19", 3158 "%ymm20", "%ymm21", "%ymm22", "%ymm23", 3159 "%ymm24", "%ymm25", "%ymm26", "%ymm27", 3160 "%ymm28", "%ymm29", "%ymm30", "%ymm31" 3161 }; 3162 3163 static const char **names_zmm; 3164 static const char *intel_names_zmm[] = { 3165 "zmm0", "zmm1", "zmm2", "zmm3", 3166 "zmm4", "zmm5", "zmm6", "zmm7", 3167 "zmm8", "zmm9", "zmm10", "zmm11", 3168 "zmm12", "zmm13", "zmm14", "zmm15", 3169 "zmm16", "zmm17", "zmm18", "zmm19", 3170 "zmm20", "zmm21", "zmm22", "zmm23", 3171 "zmm24", "zmm25", "zmm26", "zmm27", 3172 "zmm28", "zmm29", "zmm30", "zmm31" 3173 }; 3174 static const char *att_names_zmm[] = { 3175 "%zmm0", "%zmm1", "%zmm2", "%zmm3", 3176 "%zmm4", "%zmm5", "%zmm6", "%zmm7", 3177 "%zmm8", "%zmm9", "%zmm10", "%zmm11", 3178 "%zmm12", "%zmm13", "%zmm14", "%zmm15", 3179 "%zmm16", "%zmm17", "%zmm18", "%zmm19", 3180 "%zmm20", "%zmm21", "%zmm22", "%zmm23", 3181 "%zmm24", "%zmm25", "%zmm26", "%zmm27", 3182 "%zmm28", "%zmm29", "%zmm30", "%zmm31" 3183 }; 3184 3185 static const char **names_mask; 3186 static const char *intel_names_mask[] = { 3187 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7" 3188 }; 3189 static const char *att_names_mask[] = { 3190 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7" 3191 }; 3192 3193 static const char *names_rounding[] = 3194 { 3195 "{rn-sae}", 3196 "{rd-sae}", 3197 "{ru-sae}", 3198 "{rz-sae}" 3199 }; 3200 3201 static const struct dis386 reg_table[][8] = { 3202 /* REG_80 */ 3203 { 3204 { "addA", { Ebh1, Ib }, 0 }, 3205 { "orA", { Ebh1, Ib }, 0 }, 3206 { "adcA", { Ebh1, Ib }, 0 }, 3207 { "sbbA", { Ebh1, Ib }, 0 }, 3208 { "andA", { Ebh1, Ib }, 0 }, 3209 { "subA", { Ebh1, Ib }, 0 }, 3210 { "xorA", { Ebh1, Ib }, 0 }, 3211 { "cmpA", { Eb, Ib }, 0 }, 3212 }, 3213 /* REG_81 */ 3214 { 3215 { "addQ", { Evh1, Iv }, 0 }, 3216 { "orQ", { Evh1, Iv }, 0 }, 3217 { "adcQ", { Evh1, Iv }, 0 }, 3218 { "sbbQ", { Evh1, Iv }, 0 }, 3219 { "andQ", { Evh1, Iv }, 0 }, 3220 { "subQ", { Evh1, Iv }, 0 }, 3221 { "xorQ", { Evh1, Iv }, 0 }, 3222 { "cmpQ", { Ev, Iv }, 0 }, 3223 }, 3224 /* REG_83 */ 3225 { 3226 { "addQ", { Evh1, sIb }, 0 }, 3227 { "orQ", { Evh1, sIb }, 0 }, 3228 { "adcQ", { Evh1, sIb }, 0 }, 3229 { "sbbQ", { Evh1, sIb }, 0 }, 3230 { "andQ", { Evh1, sIb }, 0 }, 3231 { "subQ", { Evh1, sIb }, 0 }, 3232 { "xorQ", { Evh1, sIb }, 0 }, 3233 { "cmpQ", { Ev, sIb }, 0 }, 3234 }, 3235 /* REG_8F */ 3236 { 3237 { "popU", { stackEv }, 0 }, 3238 { XOP_8F_TABLE (XOP_09) }, 3239 { Bad_Opcode }, 3240 { Bad_Opcode }, 3241 { Bad_Opcode }, 3242 { XOP_8F_TABLE (XOP_09) }, 3243 }, 3244 /* REG_C0 */ 3245 { 3246 { "rolA", { Eb, Ib }, 0 }, 3247 { "rorA", { Eb, Ib }, 0 }, 3248 { "rclA", { Eb, Ib }, 0 }, 3249 { "rcrA", { Eb, Ib }, 0 }, 3250 { "shlA", { Eb, Ib }, 0 }, 3251 { "shrA", { Eb, Ib }, 0 }, 3252 { "shlA", { Eb, Ib }, 0 }, 3253 { "sarA", { Eb, Ib }, 0 }, 3254 }, 3255 /* REG_C1 */ 3256 { 3257 { "rolQ", { Ev, Ib }, 0 }, 3258 { "rorQ", { Ev, Ib }, 0 }, 3259 { "rclQ", { Ev, Ib }, 0 }, 3260 { "rcrQ", { Ev, Ib }, 0 }, 3261 { "shlQ", { Ev, Ib }, 0 }, 3262 { "shrQ", { Ev, Ib }, 0 }, 3263 { "shlQ", { Ev, Ib }, 0 }, 3264 { "sarQ", { Ev, Ib }, 0 }, 3265 }, 3266 /* REG_C6 */ 3267 { 3268 { "movA", { Ebh3, Ib }, 0 }, 3269 { Bad_Opcode }, 3270 { Bad_Opcode }, 3271 { Bad_Opcode }, 3272 { Bad_Opcode }, 3273 { Bad_Opcode }, 3274 { Bad_Opcode }, 3275 { MOD_TABLE (MOD_C6_REG_7) }, 3276 }, 3277 /* REG_C7 */ 3278 { 3279 { "movQ", { Evh3, Iv }, 0 }, 3280 { Bad_Opcode }, 3281 { Bad_Opcode }, 3282 { Bad_Opcode }, 3283 { Bad_Opcode }, 3284 { Bad_Opcode }, 3285 { Bad_Opcode }, 3286 { MOD_TABLE (MOD_C7_REG_7) }, 3287 }, 3288 /* REG_D0 */ 3289 { 3290 { "rolA", { Eb, I1 }, 0 }, 3291 { "rorA", { Eb, I1 }, 0 }, 3292 { "rclA", { Eb, I1 }, 0 }, 3293 { "rcrA", { Eb, I1 }, 0 }, 3294 { "shlA", { Eb, I1 }, 0 }, 3295 { "shrA", { Eb, I1 }, 0 }, 3296 { "shlA", { Eb, I1 }, 0 }, 3297 { "sarA", { Eb, I1 }, 0 }, 3298 }, 3299 /* REG_D1 */ 3300 { 3301 { "rolQ", { Ev, I1 }, 0 }, 3302 { "rorQ", { Ev, I1 }, 0 }, 3303 { "rclQ", { Ev, I1 }, 0 }, 3304 { "rcrQ", { Ev, I1 }, 0 }, 3305 { "shlQ", { Ev, I1 }, 0 }, 3306 { "shrQ", { Ev, I1 }, 0 }, 3307 { "shlQ", { Ev, I1 }, 0 }, 3308 { "sarQ", { Ev, I1 }, 0 }, 3309 }, 3310 /* REG_D2 */ 3311 { 3312 { "rolA", { Eb, CL }, 0 }, 3313 { "rorA", { Eb, CL }, 0 }, 3314 { "rclA", { Eb, CL }, 0 }, 3315 { "rcrA", { Eb, CL }, 0 }, 3316 { "shlA", { Eb, CL }, 0 }, 3317 { "shrA", { Eb, CL }, 0 }, 3318 { "shlA", { Eb, CL }, 0 }, 3319 { "sarA", { Eb, CL }, 0 }, 3320 }, 3321 /* REG_D3 */ 3322 { 3323 { "rolQ", { Ev, CL }, 0 }, 3324 { "rorQ", { Ev, CL }, 0 }, 3325 { "rclQ", { Ev, CL }, 0 }, 3326 { "rcrQ", { Ev, CL }, 0 }, 3327 { "shlQ", { Ev, CL }, 0 }, 3328 { "shrQ", { Ev, CL }, 0 }, 3329 { "shlQ", { Ev, CL }, 0 }, 3330 { "sarQ", { Ev, CL }, 0 }, 3331 }, 3332 /* REG_F6 */ 3333 { 3334 { "testA", { Eb, Ib }, 0 }, 3335 { "testA", { Eb, Ib }, 0 }, 3336 { "notA", { Ebh1 }, 0 }, 3337 { "negA", { Ebh1 }, 0 }, 3338 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */ 3339 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */ 3340 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */ 3341 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */ 3342 }, 3343 /* REG_F7 */ 3344 { 3345 { "testQ", { Ev, Iv }, 0 }, 3346 { "testQ", { Ev, Iv }, 0 }, 3347 { "notQ", { Evh1 }, 0 }, 3348 { "negQ", { Evh1 }, 0 }, 3349 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */ 3350 { "imulQ", { Ev }, 0 }, 3351 { "divQ", { Ev }, 0 }, 3352 { "idivQ", { Ev }, 0 }, 3353 }, 3354 /* REG_FE */ 3355 { 3356 { "incA", { Ebh1 }, 0 }, 3357 { "decA", { Ebh1 }, 0 }, 3358 }, 3359 /* REG_FF */ 3360 { 3361 { "incQ", { Evh1 }, 0 }, 3362 { "decQ", { Evh1 }, 0 }, 3363 { "call{&|}", { NOTRACK, indirEv, BND }, 0 }, 3364 { MOD_TABLE (MOD_FF_REG_3) }, 3365 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 }, 3366 { MOD_TABLE (MOD_FF_REG_5) }, 3367 { "pushU", { stackEv }, 0 }, 3368 { Bad_Opcode }, 3369 }, 3370 /* REG_0F00 */ 3371 { 3372 { "sldtD", { Sv }, 0 }, 3373 { "strD", { Sv }, 0 }, 3374 { "lldt", { Ew }, 0 }, 3375 { "ltr", { Ew }, 0 }, 3376 { "verr", { Ew }, 0 }, 3377 { "verw", { Ew }, 0 }, 3378 { Bad_Opcode }, 3379 { Bad_Opcode }, 3380 }, 3381 /* REG_0F01 */ 3382 { 3383 { MOD_TABLE (MOD_0F01_REG_0) }, 3384 { MOD_TABLE (MOD_0F01_REG_1) }, 3385 { MOD_TABLE (MOD_0F01_REG_2) }, 3386 { MOD_TABLE (MOD_0F01_REG_3) }, 3387 { "smswD", { Sv }, 0 }, 3388 { MOD_TABLE (MOD_0F01_REG_5) }, 3389 { "lmsw", { Ew }, 0 }, 3390 { MOD_TABLE (MOD_0F01_REG_7) }, 3391 }, 3392 /* REG_0F0D */ 3393 { 3394 { "prefetch", { Mb }, 0 }, 3395 { "prefetchw", { Mb }, 0 }, 3396 { "prefetchwt1", { Mb }, 0 }, 3397 { "prefetch", { Mb }, 0 }, 3398 { "prefetch", { Mb }, 0 }, 3399 { "prefetch", { Mb }, 0 }, 3400 { "prefetch", { Mb }, 0 }, 3401 { "prefetch", { Mb }, 0 }, 3402 }, 3403 /* REG_0F18 */ 3404 { 3405 { MOD_TABLE (MOD_0F18_REG_0) }, 3406 { MOD_TABLE (MOD_0F18_REG_1) }, 3407 { MOD_TABLE (MOD_0F18_REG_2) }, 3408 { MOD_TABLE (MOD_0F18_REG_3) }, 3409 { MOD_TABLE (MOD_0F18_REG_4) }, 3410 { MOD_TABLE (MOD_0F18_REG_5) }, 3411 { MOD_TABLE (MOD_0F18_REG_6) }, 3412 { MOD_TABLE (MOD_0F18_REG_7) }, 3413 }, 3414 /* REG_0F1C_MOD_0 */ 3415 { 3416 { "cldemote", { Mb }, 0 }, 3417 { "nopQ", { Ev }, 0 }, 3418 { "nopQ", { Ev }, 0 }, 3419 { "nopQ", { Ev }, 0 }, 3420 { "nopQ", { Ev }, 0 }, 3421 { "nopQ", { Ev }, 0 }, 3422 { "nopQ", { Ev }, 0 }, 3423 { "nopQ", { Ev }, 0 }, 3424 }, 3425 /* REG_0F1E_MOD_3 */ 3426 { 3427 { "nopQ", { Ev }, 0 }, 3428 { "rdsspK", { Rdq }, PREFIX_OPCODE }, 3429 { "nopQ", { Ev }, 0 }, 3430 { "nopQ", { Ev }, 0 }, 3431 { "nopQ", { Ev }, 0 }, 3432 { "nopQ", { Ev }, 0 }, 3433 { "nopQ", { Ev }, 0 }, 3434 { RM_TABLE (RM_0F1E_MOD_3_REG_7) }, 3435 }, 3436 /* REG_0F71 */ 3437 { 3438 { Bad_Opcode }, 3439 { Bad_Opcode }, 3440 { MOD_TABLE (MOD_0F71_REG_2) }, 3441 { Bad_Opcode }, 3442 { MOD_TABLE (MOD_0F71_REG_4) }, 3443 { Bad_Opcode }, 3444 { MOD_TABLE (MOD_0F71_REG_6) }, 3445 }, 3446 /* REG_0F72 */ 3447 { 3448 { Bad_Opcode }, 3449 { Bad_Opcode }, 3450 { MOD_TABLE (MOD_0F72_REG_2) }, 3451 { Bad_Opcode }, 3452 { MOD_TABLE (MOD_0F72_REG_4) }, 3453 { Bad_Opcode }, 3454 { MOD_TABLE (MOD_0F72_REG_6) }, 3455 }, 3456 /* REG_0F73 */ 3457 { 3458 { Bad_Opcode }, 3459 { Bad_Opcode }, 3460 { MOD_TABLE (MOD_0F73_REG_2) }, 3461 { MOD_TABLE (MOD_0F73_REG_3) }, 3462 { Bad_Opcode }, 3463 { Bad_Opcode }, 3464 { MOD_TABLE (MOD_0F73_REG_6) }, 3465 { MOD_TABLE (MOD_0F73_REG_7) }, 3466 }, 3467 /* REG_0FA6 */ 3468 { 3469 { "montmul", { { OP_0f07, 0 } }, 0 }, 3470 { "xsha1", { { OP_0f07, 0 } }, 0 }, 3471 { "xsha256", { { OP_0f07, 0 } }, 0 }, 3472 }, 3473 /* REG_0FA7 */ 3474 { 3475 { "xstore-rng", { { OP_0f07, 0 } }, 0 }, 3476 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 }, 3477 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 }, 3478 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 }, 3479 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 }, 3480 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 }, 3481 }, 3482 /* REG_0FAE */ 3483 { 3484 { MOD_TABLE (MOD_0FAE_REG_0) }, 3485 { MOD_TABLE (MOD_0FAE_REG_1) }, 3486 { MOD_TABLE (MOD_0FAE_REG_2) }, 3487 { MOD_TABLE (MOD_0FAE_REG_3) }, 3488 { MOD_TABLE (MOD_0FAE_REG_4) }, 3489 { MOD_TABLE (MOD_0FAE_REG_5) }, 3490 { MOD_TABLE (MOD_0FAE_REG_6) }, 3491 { MOD_TABLE (MOD_0FAE_REG_7) }, 3492 }, 3493 /* REG_0FBA */ 3494 { 3495 { Bad_Opcode }, 3496 { Bad_Opcode }, 3497 { Bad_Opcode }, 3498 { Bad_Opcode }, 3499 { "btQ", { Ev, Ib }, 0 }, 3500 { "btsQ", { Evh1, Ib }, 0 }, 3501 { "btrQ", { Evh1, Ib }, 0 }, 3502 { "btcQ", { Evh1, Ib }, 0 }, 3503 }, 3504 /* REG_0FC7 */ 3505 { 3506 { Bad_Opcode }, 3507 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 }, 3508 { Bad_Opcode }, 3509 { MOD_TABLE (MOD_0FC7_REG_3) }, 3510 { MOD_TABLE (MOD_0FC7_REG_4) }, 3511 { MOD_TABLE (MOD_0FC7_REG_5) }, 3512 { MOD_TABLE (MOD_0FC7_REG_6) }, 3513 { MOD_TABLE (MOD_0FC7_REG_7) }, 3514 }, 3515 /* REG_VEX_0F71 */ 3516 { 3517 { Bad_Opcode }, 3518 { Bad_Opcode }, 3519 { MOD_TABLE (MOD_VEX_0F71_REG_2) }, 3520 { Bad_Opcode }, 3521 { MOD_TABLE (MOD_VEX_0F71_REG_4) }, 3522 { Bad_Opcode }, 3523 { MOD_TABLE (MOD_VEX_0F71_REG_6) }, 3524 }, 3525 /* REG_VEX_0F72 */ 3526 { 3527 { Bad_Opcode }, 3528 { Bad_Opcode }, 3529 { MOD_TABLE (MOD_VEX_0F72_REG_2) }, 3530 { Bad_Opcode }, 3531 { MOD_TABLE (MOD_VEX_0F72_REG_4) }, 3532 { Bad_Opcode }, 3533 { MOD_TABLE (MOD_VEX_0F72_REG_6) }, 3534 }, 3535 /* REG_VEX_0F73 */ 3536 { 3537 { Bad_Opcode }, 3538 { Bad_Opcode }, 3539 { MOD_TABLE (MOD_VEX_0F73_REG_2) }, 3540 { MOD_TABLE (MOD_VEX_0F73_REG_3) }, 3541 { Bad_Opcode }, 3542 { Bad_Opcode }, 3543 { MOD_TABLE (MOD_VEX_0F73_REG_6) }, 3544 { MOD_TABLE (MOD_VEX_0F73_REG_7) }, 3545 }, 3546 /* REG_VEX_0FAE */ 3547 { 3548 { Bad_Opcode }, 3549 { Bad_Opcode }, 3550 { MOD_TABLE (MOD_VEX_0FAE_REG_2) }, 3551 { MOD_TABLE (MOD_VEX_0FAE_REG_3) }, 3552 }, 3553 /* REG_VEX_0F38F3 */ 3554 { 3555 { Bad_Opcode }, 3556 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) }, 3557 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) }, 3558 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) }, 3559 }, 3560 /* REG_XOP_LWPCB */ 3561 { 3562 { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 }, 3563 { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 }, 3564 }, 3565 /* REG_XOP_LWP */ 3566 { 3567 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 }, 3568 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 }, 3569 }, 3570 /* REG_XOP_TBM_01 */ 3571 { 3572 { Bad_Opcode }, 3573 { "blcfill", { { OP_LWP_E, 0 }, Ev }, 0 }, 3574 { "blsfill", { { OP_LWP_E, 0 }, Ev }, 0 }, 3575 { "blcs", { { OP_LWP_E, 0 }, Ev }, 0 }, 3576 { "tzmsk", { { OP_LWP_E, 0 }, Ev }, 0 }, 3577 { "blcic", { { OP_LWP_E, 0 }, Ev }, 0 }, 3578 { "blsic", { { OP_LWP_E, 0 }, Ev }, 0 }, 3579 { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 }, 3580 }, 3581 /* REG_XOP_TBM_02 */ 3582 { 3583 { Bad_Opcode }, 3584 { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 }, 3585 { Bad_Opcode }, 3586 { Bad_Opcode }, 3587 { Bad_Opcode }, 3588 { Bad_Opcode }, 3589 { "blci", { { OP_LWP_E, 0 }, Ev }, 0 }, 3590 }, 3591 #define NEED_REG_TABLE 3592 #include "i386-dis-evex.h" 3593 #undef NEED_REG_TABLE 3594 }; 3595 3596 static const struct dis386 prefix_table[][4] = { 3597 /* PREFIX_90 */ 3598 { 3599 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 }, 3600 { "pause", { XX }, 0 }, 3601 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 }, 3602 { NULL, { { NULL, 0 } }, PREFIX_IGNORED } 3603 }, 3604 3605 /* PREFIX_MOD_0_0F01_REG_5 */ 3606 { 3607 { Bad_Opcode }, 3608 { "rstorssp", { Mq }, PREFIX_OPCODE }, 3609 }, 3610 3611 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */ 3612 { 3613 { Bad_Opcode }, 3614 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE }, 3615 }, 3616 3617 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */ 3618 { 3619 { Bad_Opcode }, 3620 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE }, 3621 }, 3622 3623 /* PREFIX_0F09 */ 3624 { 3625 { "wbinvd", { XX }, 0 }, 3626 { "wbnoinvd", { XX }, 0 }, 3627 }, 3628 3629 /* PREFIX_0F10 */ 3630 { 3631 { "movups", { XM, EXx }, PREFIX_OPCODE }, 3632 { "movss", { XM, EXd }, PREFIX_OPCODE }, 3633 { "movupd", { XM, EXx }, PREFIX_OPCODE }, 3634 { "movsd", { XM, EXq }, PREFIX_OPCODE }, 3635 }, 3636 3637 /* PREFIX_0F11 */ 3638 { 3639 { "movups", { EXxS, XM }, PREFIX_OPCODE }, 3640 { "movss", { EXdS, XM }, PREFIX_OPCODE }, 3641 { "movupd", { EXxS, XM }, PREFIX_OPCODE }, 3642 { "movsd", { EXqS, XM }, PREFIX_OPCODE }, 3643 }, 3644 3645 /* PREFIX_0F12 */ 3646 { 3647 { MOD_TABLE (MOD_0F12_PREFIX_0) }, 3648 { "movsldup", { XM, EXx }, PREFIX_OPCODE }, 3649 { "movlpd", { XM, EXq }, PREFIX_OPCODE }, 3650 { "movddup", { XM, EXq }, PREFIX_OPCODE }, 3651 }, 3652 3653 /* PREFIX_0F16 */ 3654 { 3655 { MOD_TABLE (MOD_0F16_PREFIX_0) }, 3656 { "movshdup", { XM, EXx }, PREFIX_OPCODE }, 3657 { "movhpd", { XM, EXq }, PREFIX_OPCODE }, 3658 }, 3659 3660 /* PREFIX_0F1A */ 3661 { 3662 { MOD_TABLE (MOD_0F1A_PREFIX_0) }, 3663 { "bndcl", { Gbnd, Ev_bnd }, 0 }, 3664 { "bndmov", { Gbnd, Ebnd }, 0 }, 3665 { "bndcu", { Gbnd, Ev_bnd }, 0 }, 3666 }, 3667 3668 /* PREFIX_0F1B */ 3669 { 3670 { MOD_TABLE (MOD_0F1B_PREFIX_0) }, 3671 { MOD_TABLE (MOD_0F1B_PREFIX_1) }, 3672 { "bndmov", { EbndS, Gbnd }, 0 }, 3673 { "bndcn", { Gbnd, Ev_bnd }, 0 }, 3674 }, 3675 3676 /* PREFIX_0F1C */ 3677 { 3678 { MOD_TABLE (MOD_0F1C_PREFIX_0) }, 3679 { "nopQ", { Ev }, PREFIX_OPCODE }, 3680 { "nopQ", { Ev }, PREFIX_OPCODE }, 3681 { "nopQ", { Ev }, PREFIX_OPCODE }, 3682 }, 3683 3684 /* PREFIX_0F1E */ 3685 { 3686 { "nopQ", { Ev }, PREFIX_OPCODE }, 3687 { MOD_TABLE (MOD_0F1E_PREFIX_1) }, 3688 { "nopQ", { Ev }, PREFIX_OPCODE }, 3689 { "nopQ", { Ev }, PREFIX_OPCODE }, 3690 }, 3691 3692 /* PREFIX_0F2A */ 3693 { 3694 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE }, 3695 { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE }, 3696 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE }, 3697 { "cvtsi2sd%LQ", { XM, Ev }, 0 }, 3698 }, 3699 3700 /* PREFIX_0F2B */ 3701 { 3702 { MOD_TABLE (MOD_0F2B_PREFIX_0) }, 3703 { MOD_TABLE (MOD_0F2B_PREFIX_1) }, 3704 { MOD_TABLE (MOD_0F2B_PREFIX_2) }, 3705 { MOD_TABLE (MOD_0F2B_PREFIX_3) }, 3706 }, 3707 3708 /* PREFIX_0F2C */ 3709 { 3710 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE }, 3711 { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE }, 3712 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE }, 3713 { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE }, 3714 }, 3715 3716 /* PREFIX_0F2D */ 3717 { 3718 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE }, 3719 { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE }, 3720 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE }, 3721 { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE }, 3722 }, 3723 3724 /* PREFIX_0F2E */ 3725 { 3726 { "ucomiss",{ XM, EXd }, 0 }, 3727 { Bad_Opcode }, 3728 { "ucomisd",{ XM, EXq }, 0 }, 3729 }, 3730 3731 /* PREFIX_0F2F */ 3732 { 3733 { "comiss", { XM, EXd }, 0 }, 3734 { Bad_Opcode }, 3735 { "comisd", { XM, EXq }, 0 }, 3736 }, 3737 3738 /* PREFIX_0F51 */ 3739 { 3740 { "sqrtps", { XM, EXx }, PREFIX_OPCODE }, 3741 { "sqrtss", { XM, EXd }, PREFIX_OPCODE }, 3742 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE }, 3743 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE }, 3744 }, 3745 3746 /* PREFIX_0F52 */ 3747 { 3748 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE }, 3749 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE }, 3750 }, 3751 3752 /* PREFIX_0F53 */ 3753 { 3754 { "rcpps", { XM, EXx }, PREFIX_OPCODE }, 3755 { "rcpss", { XM, EXd }, PREFIX_OPCODE }, 3756 }, 3757 3758 /* PREFIX_0F58 */ 3759 { 3760 { "addps", { XM, EXx }, PREFIX_OPCODE }, 3761 { "addss", { XM, EXd }, PREFIX_OPCODE }, 3762 { "addpd", { XM, EXx }, PREFIX_OPCODE }, 3763 { "addsd", { XM, EXq }, PREFIX_OPCODE }, 3764 }, 3765 3766 /* PREFIX_0F59 */ 3767 { 3768 { "mulps", { XM, EXx }, PREFIX_OPCODE }, 3769 { "mulss", { XM, EXd }, PREFIX_OPCODE }, 3770 { "mulpd", { XM, EXx }, PREFIX_OPCODE }, 3771 { "mulsd", { XM, EXq }, PREFIX_OPCODE }, 3772 }, 3773 3774 /* PREFIX_0F5A */ 3775 { 3776 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE }, 3777 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE }, 3778 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE }, 3779 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE }, 3780 }, 3781 3782 /* PREFIX_0F5B */ 3783 { 3784 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE }, 3785 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE }, 3786 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE }, 3787 }, 3788 3789 /* PREFIX_0F5C */ 3790 { 3791 { "subps", { XM, EXx }, PREFIX_OPCODE }, 3792 { "subss", { XM, EXd }, PREFIX_OPCODE }, 3793 { "subpd", { XM, EXx }, PREFIX_OPCODE }, 3794 { "subsd", { XM, EXq }, PREFIX_OPCODE }, 3795 }, 3796 3797 /* PREFIX_0F5D */ 3798 { 3799 { "minps", { XM, EXx }, PREFIX_OPCODE }, 3800 { "minss", { XM, EXd }, PREFIX_OPCODE }, 3801 { "minpd", { XM, EXx }, PREFIX_OPCODE }, 3802 { "minsd", { XM, EXq }, PREFIX_OPCODE }, 3803 }, 3804 3805 /* PREFIX_0F5E */ 3806 { 3807 { "divps", { XM, EXx }, PREFIX_OPCODE }, 3808 { "divss", { XM, EXd }, PREFIX_OPCODE }, 3809 { "divpd", { XM, EXx }, PREFIX_OPCODE }, 3810 { "divsd", { XM, EXq }, PREFIX_OPCODE }, 3811 }, 3812 3813 /* PREFIX_0F5F */ 3814 { 3815 { "maxps", { XM, EXx }, PREFIX_OPCODE }, 3816 { "maxss", { XM, EXd }, PREFIX_OPCODE }, 3817 { "maxpd", { XM, EXx }, PREFIX_OPCODE }, 3818 { "maxsd", { XM, EXq }, PREFIX_OPCODE }, 3819 }, 3820 3821 /* PREFIX_0F60 */ 3822 { 3823 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE }, 3824 { Bad_Opcode }, 3825 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE }, 3826 }, 3827 3828 /* PREFIX_0F61 */ 3829 { 3830 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE }, 3831 { Bad_Opcode }, 3832 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE }, 3833 }, 3834 3835 /* PREFIX_0F62 */ 3836 { 3837 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE }, 3838 { Bad_Opcode }, 3839 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE }, 3840 }, 3841 3842 /* PREFIX_0F6C */ 3843 { 3844 { Bad_Opcode }, 3845 { Bad_Opcode }, 3846 { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE }, 3847 }, 3848 3849 /* PREFIX_0F6D */ 3850 { 3851 { Bad_Opcode }, 3852 { Bad_Opcode }, 3853 { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE }, 3854 }, 3855 3856 /* PREFIX_0F6F */ 3857 { 3858 { "movq", { MX, EM }, PREFIX_OPCODE }, 3859 { "movdqu", { XM, EXx }, PREFIX_OPCODE }, 3860 { "movdqa", { XM, EXx }, PREFIX_OPCODE }, 3861 }, 3862 3863 /* PREFIX_0F70 */ 3864 { 3865 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE }, 3866 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE }, 3867 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE }, 3868 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE }, 3869 }, 3870 3871 /* PREFIX_0F73_REG_3 */ 3872 { 3873 { Bad_Opcode }, 3874 { Bad_Opcode }, 3875 { "psrldq", { XS, Ib }, 0 }, 3876 }, 3877 3878 /* PREFIX_0F73_REG_7 */ 3879 { 3880 { Bad_Opcode }, 3881 { Bad_Opcode }, 3882 { "pslldq", { XS, Ib }, 0 }, 3883 }, 3884 3885 /* PREFIX_0F78 */ 3886 { 3887 {"vmread", { Em, Gm }, 0 }, 3888 { Bad_Opcode }, 3889 {"extrq", { XS, Ib, Ib }, 0 }, 3890 {"insertq", { XM, XS, Ib, Ib }, 0 }, 3891 }, 3892 3893 /* PREFIX_0F79 */ 3894 { 3895 {"vmwrite", { Gm, Em }, 0 }, 3896 { Bad_Opcode }, 3897 {"extrq", { XM, XS }, 0 }, 3898 {"insertq", { XM, XS }, 0 }, 3899 }, 3900 3901 /* PREFIX_0F7C */ 3902 { 3903 { Bad_Opcode }, 3904 { Bad_Opcode }, 3905 { "haddpd", { XM, EXx }, PREFIX_OPCODE }, 3906 { "haddps", { XM, EXx }, PREFIX_OPCODE }, 3907 }, 3908 3909 /* PREFIX_0F7D */ 3910 { 3911 { Bad_Opcode }, 3912 { Bad_Opcode }, 3913 { "hsubpd", { XM, EXx }, PREFIX_OPCODE }, 3914 { "hsubps", { XM, EXx }, PREFIX_OPCODE }, 3915 }, 3916 3917 /* PREFIX_0F7E */ 3918 { 3919 { "movK", { Edq, MX }, PREFIX_OPCODE }, 3920 { "movq", { XM, EXq }, PREFIX_OPCODE }, 3921 { "movK", { Edq, XM }, PREFIX_OPCODE }, 3922 }, 3923 3924 /* PREFIX_0F7F */ 3925 { 3926 { "movq", { EMS, MX }, PREFIX_OPCODE }, 3927 { "movdqu", { EXxS, XM }, PREFIX_OPCODE }, 3928 { "movdqa", { EXxS, XM }, PREFIX_OPCODE }, 3929 }, 3930 3931 /* PREFIX_0FAE_REG_0 */ 3932 { 3933 { Bad_Opcode }, 3934 { "rdfsbase", { Ev }, 0 }, 3935 }, 3936 3937 /* PREFIX_0FAE_REG_1 */ 3938 { 3939 { Bad_Opcode }, 3940 { "rdgsbase", { Ev }, 0 }, 3941 }, 3942 3943 /* PREFIX_0FAE_REG_2 */ 3944 { 3945 { Bad_Opcode }, 3946 { "wrfsbase", { Ev }, 0 }, 3947 }, 3948 3949 /* PREFIX_0FAE_REG_3 */ 3950 { 3951 { Bad_Opcode }, 3952 { "wrgsbase", { Ev }, 0 }, 3953 }, 3954 3955 /* PREFIX_MOD_0_0FAE_REG_4 */ 3956 { 3957 { "xsave", { FXSAVE }, 0 }, 3958 { "ptwrite%LQ", { Edq }, 0 }, 3959 }, 3960 3961 /* PREFIX_MOD_3_0FAE_REG_4 */ 3962 { 3963 { Bad_Opcode }, 3964 { "ptwrite%LQ", { Edq }, 0 }, 3965 }, 3966 3967 /* PREFIX_MOD_0_0FAE_REG_5 */ 3968 { 3969 { "xrstor", { FXSAVE }, PREFIX_OPCODE }, 3970 }, 3971 3972 /* PREFIX_MOD_3_0FAE_REG_5 */ 3973 { 3974 { "lfence", { Skip_MODRM }, 0 }, 3975 { "incsspK", { Rdq }, PREFIX_OPCODE }, 3976 }, 3977 3978 /* PREFIX_MOD_0_0FAE_REG_6 */ 3979 { 3980 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE }, 3981 { "clrssbsy", { Mq }, PREFIX_OPCODE }, 3982 { "clwb", { Mb }, PREFIX_OPCODE }, 3983 }, 3984 3985 /* PREFIX_MOD_1_0FAE_REG_6 */ 3986 { 3987 { RM_TABLE (RM_0FAE_REG_6) }, 3988 { "umonitor", { Eva }, PREFIX_OPCODE }, 3989 { "tpause", { Edq }, PREFIX_OPCODE }, 3990 { "umwait", { Edq }, PREFIX_OPCODE }, 3991 }, 3992 3993 /* PREFIX_0FAE_REG_7 */ 3994 { 3995 { "clflush", { Mb }, 0 }, 3996 { Bad_Opcode }, 3997 { "clflushopt", { Mb }, 0 }, 3998 }, 3999 4000 /* PREFIX_0FB8 */ 4001 { 4002 { Bad_Opcode }, 4003 { "popcntS", { Gv, Ev }, 0 }, 4004 }, 4005 4006 /* PREFIX_0FBC */ 4007 { 4008 { "bsfS", { Gv, Ev }, 0 }, 4009 { "tzcntS", { Gv, Ev }, 0 }, 4010 { "bsfS", { Gv, Ev }, 0 }, 4011 }, 4012 4013 /* PREFIX_0FBD */ 4014 { 4015 { "bsrS", { Gv, Ev }, 0 }, 4016 { "lzcntS", { Gv, Ev }, 0 }, 4017 { "bsrS", { Gv, Ev }, 0 }, 4018 }, 4019 4020 /* PREFIX_0FC2 */ 4021 { 4022 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE }, 4023 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE }, 4024 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE }, 4025 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE }, 4026 }, 4027 4028 /* PREFIX_MOD_0_0FC3 */ 4029 { 4030 { "movntiS", { Ev, Gv }, PREFIX_OPCODE }, 4031 }, 4032 4033 /* PREFIX_MOD_0_0FC7_REG_6 */ 4034 { 4035 { "vmptrld",{ Mq }, 0 }, 4036 { "vmxon", { Mq }, 0 }, 4037 { "vmclear",{ Mq }, 0 }, 4038 }, 4039 4040 /* PREFIX_MOD_3_0FC7_REG_6 */ 4041 { 4042 { "rdrand", { Ev }, 0 }, 4043 { Bad_Opcode }, 4044 { "rdrand", { Ev }, 0 } 4045 }, 4046 4047 /* PREFIX_MOD_3_0FC7_REG_7 */ 4048 { 4049 { "rdseed", { Ev }, 0 }, 4050 { "rdpid", { Em }, 0 }, 4051 { "rdseed", { Ev }, 0 }, 4052 }, 4053 4054 /* PREFIX_0FD0 */ 4055 { 4056 { Bad_Opcode }, 4057 { Bad_Opcode }, 4058 { "addsubpd", { XM, EXx }, 0 }, 4059 { "addsubps", { XM, EXx }, 0 }, 4060 }, 4061 4062 /* PREFIX_0FD6 */ 4063 { 4064 { Bad_Opcode }, 4065 { "movq2dq",{ XM, MS }, 0 }, 4066 { "movq", { EXqS, XM }, 0 }, 4067 { "movdq2q",{ MX, XS }, 0 }, 4068 }, 4069 4070 /* PREFIX_0FE6 */ 4071 { 4072 { Bad_Opcode }, 4073 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE }, 4074 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE }, 4075 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE }, 4076 }, 4077 4078 /* PREFIX_0FE7 */ 4079 { 4080 { "movntq", { Mq, MX }, PREFIX_OPCODE }, 4081 { Bad_Opcode }, 4082 { MOD_TABLE (MOD_0FE7_PREFIX_2) }, 4083 }, 4084 4085 /* PREFIX_0FF0 */ 4086 { 4087 { Bad_Opcode }, 4088 { Bad_Opcode }, 4089 { Bad_Opcode }, 4090 { MOD_TABLE (MOD_0FF0_PREFIX_3) }, 4091 }, 4092 4093 /* PREFIX_0FF7 */ 4094 { 4095 { "maskmovq", { MX, MS }, PREFIX_OPCODE }, 4096 { Bad_Opcode }, 4097 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE }, 4098 }, 4099 4100 /* PREFIX_0F3810 */ 4101 { 4102 { Bad_Opcode }, 4103 { Bad_Opcode }, 4104 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE }, 4105 }, 4106 4107 /* PREFIX_0F3814 */ 4108 { 4109 { Bad_Opcode }, 4110 { Bad_Opcode }, 4111 { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE }, 4112 }, 4113 4114 /* PREFIX_0F3815 */ 4115 { 4116 { Bad_Opcode }, 4117 { Bad_Opcode }, 4118 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE }, 4119 }, 4120 4121 /* PREFIX_0F3817 */ 4122 { 4123 { Bad_Opcode }, 4124 { Bad_Opcode }, 4125 { "ptest", { XM, EXx }, PREFIX_OPCODE }, 4126 }, 4127 4128 /* PREFIX_0F3820 */ 4129 { 4130 { Bad_Opcode }, 4131 { Bad_Opcode }, 4132 { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE }, 4133 }, 4134 4135 /* PREFIX_0F3821 */ 4136 { 4137 { Bad_Opcode }, 4138 { Bad_Opcode }, 4139 { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE }, 4140 }, 4141 4142 /* PREFIX_0F3822 */ 4143 { 4144 { Bad_Opcode }, 4145 { Bad_Opcode }, 4146 { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE }, 4147 }, 4148 4149 /* PREFIX_0F3823 */ 4150 { 4151 { Bad_Opcode }, 4152 { Bad_Opcode }, 4153 { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE }, 4154 }, 4155 4156 /* PREFIX_0F3824 */ 4157 { 4158 { Bad_Opcode }, 4159 { Bad_Opcode }, 4160 { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE }, 4161 }, 4162 4163 /* PREFIX_0F3825 */ 4164 { 4165 { Bad_Opcode }, 4166 { Bad_Opcode }, 4167 { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE }, 4168 }, 4169 4170 /* PREFIX_0F3828 */ 4171 { 4172 { Bad_Opcode }, 4173 { Bad_Opcode }, 4174 { "pmuldq", { XM, EXx }, PREFIX_OPCODE }, 4175 }, 4176 4177 /* PREFIX_0F3829 */ 4178 { 4179 { Bad_Opcode }, 4180 { Bad_Opcode }, 4181 { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE }, 4182 }, 4183 4184 /* PREFIX_0F382A */ 4185 { 4186 { Bad_Opcode }, 4187 { Bad_Opcode }, 4188 { MOD_TABLE (MOD_0F382A_PREFIX_2) }, 4189 }, 4190 4191 /* PREFIX_0F382B */ 4192 { 4193 { Bad_Opcode }, 4194 { Bad_Opcode }, 4195 { "packusdw", { XM, EXx }, PREFIX_OPCODE }, 4196 }, 4197 4198 /* PREFIX_0F3830 */ 4199 { 4200 { Bad_Opcode }, 4201 { Bad_Opcode }, 4202 { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE }, 4203 }, 4204 4205 /* PREFIX_0F3831 */ 4206 { 4207 { Bad_Opcode }, 4208 { Bad_Opcode }, 4209 { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE }, 4210 }, 4211 4212 /* PREFIX_0F3832 */ 4213 { 4214 { Bad_Opcode }, 4215 { Bad_Opcode }, 4216 { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE }, 4217 }, 4218 4219 /* PREFIX_0F3833 */ 4220 { 4221 { Bad_Opcode }, 4222 { Bad_Opcode }, 4223 { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE }, 4224 }, 4225 4226 /* PREFIX_0F3834 */ 4227 { 4228 { Bad_Opcode }, 4229 { Bad_Opcode }, 4230 { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE }, 4231 }, 4232 4233 /* PREFIX_0F3835 */ 4234 { 4235 { Bad_Opcode }, 4236 { Bad_Opcode }, 4237 { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE }, 4238 }, 4239 4240 /* PREFIX_0F3837 */ 4241 { 4242 { Bad_Opcode }, 4243 { Bad_Opcode }, 4244 { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE }, 4245 }, 4246 4247 /* PREFIX_0F3838 */ 4248 { 4249 { Bad_Opcode }, 4250 { Bad_Opcode }, 4251 { "pminsb", { XM, EXx }, PREFIX_OPCODE }, 4252 }, 4253 4254 /* PREFIX_0F3839 */ 4255 { 4256 { Bad_Opcode }, 4257 { Bad_Opcode }, 4258 { "pminsd", { XM, EXx }, PREFIX_OPCODE }, 4259 }, 4260 4261 /* PREFIX_0F383A */ 4262 { 4263 { Bad_Opcode }, 4264 { Bad_Opcode }, 4265 { "pminuw", { XM, EXx }, PREFIX_OPCODE }, 4266 }, 4267 4268 /* PREFIX_0F383B */ 4269 { 4270 { Bad_Opcode }, 4271 { Bad_Opcode }, 4272 { "pminud", { XM, EXx }, PREFIX_OPCODE }, 4273 }, 4274 4275 /* PREFIX_0F383C */ 4276 { 4277 { Bad_Opcode }, 4278 { Bad_Opcode }, 4279 { "pmaxsb", { XM, EXx }, PREFIX_OPCODE }, 4280 }, 4281 4282 /* PREFIX_0F383D */ 4283 { 4284 { Bad_Opcode }, 4285 { Bad_Opcode }, 4286 { "pmaxsd", { XM, EXx }, PREFIX_OPCODE }, 4287 }, 4288 4289 /* PREFIX_0F383E */ 4290 { 4291 { Bad_Opcode }, 4292 { Bad_Opcode }, 4293 { "pmaxuw", { XM, EXx }, PREFIX_OPCODE }, 4294 }, 4295 4296 /* PREFIX_0F383F */ 4297 { 4298 { Bad_Opcode }, 4299 { Bad_Opcode }, 4300 { "pmaxud", { XM, EXx }, PREFIX_OPCODE }, 4301 }, 4302 4303 /* PREFIX_0F3840 */ 4304 { 4305 { Bad_Opcode }, 4306 { Bad_Opcode }, 4307 { "pmulld", { XM, EXx }, PREFIX_OPCODE }, 4308 }, 4309 4310 /* PREFIX_0F3841 */ 4311 { 4312 { Bad_Opcode }, 4313 { Bad_Opcode }, 4314 { "phminposuw", { XM, EXx }, PREFIX_OPCODE }, 4315 }, 4316 4317 /* PREFIX_0F3880 */ 4318 { 4319 { Bad_Opcode }, 4320 { Bad_Opcode }, 4321 { "invept", { Gm, Mo }, PREFIX_OPCODE }, 4322 }, 4323 4324 /* PREFIX_0F3881 */ 4325 { 4326 { Bad_Opcode }, 4327 { Bad_Opcode }, 4328 { "invvpid", { Gm, Mo }, PREFIX_OPCODE }, 4329 }, 4330 4331 /* PREFIX_0F3882 */ 4332 { 4333 { Bad_Opcode }, 4334 { Bad_Opcode }, 4335 { "invpcid", { Gm, M }, PREFIX_OPCODE }, 4336 }, 4337 4338 /* PREFIX_0F38C8 */ 4339 { 4340 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE }, 4341 }, 4342 4343 /* PREFIX_0F38C9 */ 4344 { 4345 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE }, 4346 }, 4347 4348 /* PREFIX_0F38CA */ 4349 { 4350 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE }, 4351 }, 4352 4353 /* PREFIX_0F38CB */ 4354 { 4355 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE }, 4356 }, 4357 4358 /* PREFIX_0F38CC */ 4359 { 4360 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE }, 4361 }, 4362 4363 /* PREFIX_0F38CD */ 4364 { 4365 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE }, 4366 }, 4367 4368 /* PREFIX_0F38CF */ 4369 { 4370 { Bad_Opcode }, 4371 { Bad_Opcode }, 4372 { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE }, 4373 }, 4374 4375 /* PREFIX_0F38DB */ 4376 { 4377 { Bad_Opcode }, 4378 { Bad_Opcode }, 4379 { "aesimc", { XM, EXx }, PREFIX_OPCODE }, 4380 }, 4381 4382 /* PREFIX_0F38DC */ 4383 { 4384 { Bad_Opcode }, 4385 { Bad_Opcode }, 4386 { "aesenc", { XM, EXx }, PREFIX_OPCODE }, 4387 }, 4388 4389 /* PREFIX_0F38DD */ 4390 { 4391 { Bad_Opcode }, 4392 { Bad_Opcode }, 4393 { "aesenclast", { XM, EXx }, PREFIX_OPCODE }, 4394 }, 4395 4396 /* PREFIX_0F38DE */ 4397 { 4398 { Bad_Opcode }, 4399 { Bad_Opcode }, 4400 { "aesdec", { XM, EXx }, PREFIX_OPCODE }, 4401 }, 4402 4403 /* PREFIX_0F38DF */ 4404 { 4405 { Bad_Opcode }, 4406 { Bad_Opcode }, 4407 { "aesdeclast", { XM, EXx }, PREFIX_OPCODE }, 4408 }, 4409 4410 /* PREFIX_0F38F0 */ 4411 { 4412 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE }, 4413 { Bad_Opcode }, 4414 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE }, 4415 { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE }, 4416 }, 4417 4418 /* PREFIX_0F38F1 */ 4419 { 4420 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE }, 4421 { Bad_Opcode }, 4422 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE }, 4423 { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE }, 4424 }, 4425 4426 /* PREFIX_0F38F5 */ 4427 { 4428 { Bad_Opcode }, 4429 { Bad_Opcode }, 4430 { MOD_TABLE (MOD_0F38F5_PREFIX_2) }, 4431 }, 4432 4433 /* PREFIX_0F38F6 */ 4434 { 4435 { MOD_TABLE (MOD_0F38F6_PREFIX_0) }, 4436 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE }, 4437 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE }, 4438 { Bad_Opcode }, 4439 }, 4440 4441 /* PREFIX_0F38F8 */ 4442 { 4443 { Bad_Opcode }, 4444 { Bad_Opcode }, 4445 { MOD_TABLE (MOD_0F38F8_PREFIX_2) }, 4446 }, 4447 4448 /* PREFIX_0F38F9 */ 4449 { 4450 { MOD_TABLE (MOD_0F38F9_PREFIX_0) }, 4451 }, 4452 4453 /* PREFIX_0F3A08 */ 4454 { 4455 { Bad_Opcode }, 4456 { Bad_Opcode }, 4457 { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE }, 4458 }, 4459 4460 /* PREFIX_0F3A09 */ 4461 { 4462 { Bad_Opcode }, 4463 { Bad_Opcode }, 4464 { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE }, 4465 }, 4466 4467 /* PREFIX_0F3A0A */ 4468 { 4469 { Bad_Opcode }, 4470 { Bad_Opcode }, 4471 { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE }, 4472 }, 4473 4474 /* PREFIX_0F3A0B */ 4475 { 4476 { Bad_Opcode }, 4477 { Bad_Opcode }, 4478 { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE }, 4479 }, 4480 4481 /* PREFIX_0F3A0C */ 4482 { 4483 { Bad_Opcode }, 4484 { Bad_Opcode }, 4485 { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE }, 4486 }, 4487 4488 /* PREFIX_0F3A0D */ 4489 { 4490 { Bad_Opcode }, 4491 { Bad_Opcode }, 4492 { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE }, 4493 }, 4494 4495 /* PREFIX_0F3A0E */ 4496 { 4497 { Bad_Opcode }, 4498 { Bad_Opcode }, 4499 { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE }, 4500 }, 4501 4502 /* PREFIX_0F3A14 */ 4503 { 4504 { Bad_Opcode }, 4505 { Bad_Opcode }, 4506 { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE }, 4507 }, 4508 4509 /* PREFIX_0F3A15 */ 4510 { 4511 { Bad_Opcode }, 4512 { Bad_Opcode }, 4513 { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE }, 4514 }, 4515 4516 /* PREFIX_0F3A16 */ 4517 { 4518 { Bad_Opcode }, 4519 { Bad_Opcode }, 4520 { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE }, 4521 }, 4522 4523 /* PREFIX_0F3A17 */ 4524 { 4525 { Bad_Opcode }, 4526 { Bad_Opcode }, 4527 { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE }, 4528 }, 4529 4530 /* PREFIX_0F3A20 */ 4531 { 4532 { Bad_Opcode }, 4533 { Bad_Opcode }, 4534 { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE }, 4535 }, 4536 4537 /* PREFIX_0F3A21 */ 4538 { 4539 { Bad_Opcode }, 4540 { Bad_Opcode }, 4541 { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE }, 4542 }, 4543 4544 /* PREFIX_0F3A22 */ 4545 { 4546 { Bad_Opcode }, 4547 { Bad_Opcode }, 4548 { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE }, 4549 }, 4550 4551 /* PREFIX_0F3A40 */ 4552 { 4553 { Bad_Opcode }, 4554 { Bad_Opcode }, 4555 { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE }, 4556 }, 4557 4558 /* PREFIX_0F3A41 */ 4559 { 4560 { Bad_Opcode }, 4561 { Bad_Opcode }, 4562 { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE }, 4563 }, 4564 4565 /* PREFIX_0F3A42 */ 4566 { 4567 { Bad_Opcode }, 4568 { Bad_Opcode }, 4569 { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE }, 4570 }, 4571 4572 /* PREFIX_0F3A44 */ 4573 { 4574 { Bad_Opcode }, 4575 { Bad_Opcode }, 4576 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE }, 4577 }, 4578 4579 /* PREFIX_0F3A60 */ 4580 { 4581 { Bad_Opcode }, 4582 { Bad_Opcode }, 4583 { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE }, 4584 }, 4585 4586 /* PREFIX_0F3A61 */ 4587 { 4588 { Bad_Opcode }, 4589 { Bad_Opcode }, 4590 { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE }, 4591 }, 4592 4593 /* PREFIX_0F3A62 */ 4594 { 4595 { Bad_Opcode }, 4596 { Bad_Opcode }, 4597 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE }, 4598 }, 4599 4600 /* PREFIX_0F3A63 */ 4601 { 4602 { Bad_Opcode }, 4603 { Bad_Opcode }, 4604 { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE }, 4605 }, 4606 4607 /* PREFIX_0F3ACC */ 4608 { 4609 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE }, 4610 }, 4611 4612 /* PREFIX_0F3ACE */ 4613 { 4614 { Bad_Opcode }, 4615 { Bad_Opcode }, 4616 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE }, 4617 }, 4618 4619 /* PREFIX_0F3ACF */ 4620 { 4621 { Bad_Opcode }, 4622 { Bad_Opcode }, 4623 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE }, 4624 }, 4625 4626 /* PREFIX_0F3ADF */ 4627 { 4628 { Bad_Opcode }, 4629 { Bad_Opcode }, 4630 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE }, 4631 }, 4632 4633 /* PREFIX_VEX_0F10 */ 4634 { 4635 { "vmovups", { XM, EXx }, 0 }, 4636 { "vmovss", { XMVexScalar, VexScalar, EXdScalar }, 0 }, 4637 { "vmovupd", { XM, EXx }, 0 }, 4638 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar }, 0 }, 4639 }, 4640 4641 /* PREFIX_VEX_0F11 */ 4642 { 4643 { "vmovups", { EXxS, XM }, 0 }, 4644 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar }, 0 }, 4645 { "vmovupd", { EXxS, XM }, 0 }, 4646 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar }, 0 }, 4647 }, 4648 4649 /* PREFIX_VEX_0F12 */ 4650 { 4651 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) }, 4652 { "vmovsldup", { XM, EXx }, 0 }, 4653 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) }, 4654 { "vmovddup", { XM, EXymmq }, 0 }, 4655 }, 4656 4657 /* PREFIX_VEX_0F16 */ 4658 { 4659 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) }, 4660 { "vmovshdup", { XM, EXx }, 0 }, 4661 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) }, 4662 }, 4663 4664 /* PREFIX_VEX_0F2A */ 4665 { 4666 { Bad_Opcode }, 4667 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) }, 4668 { Bad_Opcode }, 4669 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) }, 4670 }, 4671 4672 /* PREFIX_VEX_0F2C */ 4673 { 4674 { Bad_Opcode }, 4675 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) }, 4676 { Bad_Opcode }, 4677 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) }, 4678 }, 4679 4680 /* PREFIX_VEX_0F2D */ 4681 { 4682 { Bad_Opcode }, 4683 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) }, 4684 { Bad_Opcode }, 4685 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) }, 4686 }, 4687 4688 /* PREFIX_VEX_0F2E */ 4689 { 4690 { "vucomiss", { XMScalar, EXdScalar }, 0 }, 4691 { Bad_Opcode }, 4692 { "vucomisd", { XMScalar, EXqScalar }, 0 }, 4693 }, 4694 4695 /* PREFIX_VEX_0F2F */ 4696 { 4697 { "vcomiss", { XMScalar, EXdScalar }, 0 }, 4698 { Bad_Opcode }, 4699 { "vcomisd", { XMScalar, EXqScalar }, 0 }, 4700 }, 4701 4702 /* PREFIX_VEX_0F41 */ 4703 { 4704 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) }, 4705 { Bad_Opcode }, 4706 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) }, 4707 }, 4708 4709 /* PREFIX_VEX_0F42 */ 4710 { 4711 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) }, 4712 { Bad_Opcode }, 4713 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) }, 4714 }, 4715 4716 /* PREFIX_VEX_0F44 */ 4717 { 4718 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) }, 4719 { Bad_Opcode }, 4720 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) }, 4721 }, 4722 4723 /* PREFIX_VEX_0F45 */ 4724 { 4725 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) }, 4726 { Bad_Opcode }, 4727 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) }, 4728 }, 4729 4730 /* PREFIX_VEX_0F46 */ 4731 { 4732 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) }, 4733 { Bad_Opcode }, 4734 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) }, 4735 }, 4736 4737 /* PREFIX_VEX_0F47 */ 4738 { 4739 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) }, 4740 { Bad_Opcode }, 4741 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) }, 4742 }, 4743 4744 /* PREFIX_VEX_0F4A */ 4745 { 4746 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) }, 4747 { Bad_Opcode }, 4748 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) }, 4749 }, 4750 4751 /* PREFIX_VEX_0F4B */ 4752 { 4753 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) }, 4754 { Bad_Opcode }, 4755 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) }, 4756 }, 4757 4758 /* PREFIX_VEX_0F51 */ 4759 { 4760 { "vsqrtps", { XM, EXx }, 0 }, 4761 { "vsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4762 { "vsqrtpd", { XM, EXx }, 0 }, 4763 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4764 }, 4765 4766 /* PREFIX_VEX_0F52 */ 4767 { 4768 { "vrsqrtps", { XM, EXx }, 0 }, 4769 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4770 }, 4771 4772 /* PREFIX_VEX_0F53 */ 4773 { 4774 { "vrcpps", { XM, EXx }, 0 }, 4775 { "vrcpss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4776 }, 4777 4778 /* PREFIX_VEX_0F58 */ 4779 { 4780 { "vaddps", { XM, Vex, EXx }, 0 }, 4781 { "vaddss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4782 { "vaddpd", { XM, Vex, EXx }, 0 }, 4783 { "vaddsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4784 }, 4785 4786 /* PREFIX_VEX_0F59 */ 4787 { 4788 { "vmulps", { XM, Vex, EXx }, 0 }, 4789 { "vmulss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4790 { "vmulpd", { XM, Vex, EXx }, 0 }, 4791 { "vmulsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4792 }, 4793 4794 /* PREFIX_VEX_0F5A */ 4795 { 4796 { "vcvtps2pd", { XM, EXxmmq }, 0 }, 4797 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar }, 0 }, 4798 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 }, 4799 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar }, 0 }, 4800 }, 4801 4802 /* PREFIX_VEX_0F5B */ 4803 { 4804 { "vcvtdq2ps", { XM, EXx }, 0 }, 4805 { "vcvttps2dq", { XM, EXx }, 0 }, 4806 { "vcvtps2dq", { XM, EXx }, 0 }, 4807 }, 4808 4809 /* PREFIX_VEX_0F5C */ 4810 { 4811 { "vsubps", { XM, Vex, EXx }, 0 }, 4812 { "vsubss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4813 { "vsubpd", { XM, Vex, EXx }, 0 }, 4814 { "vsubsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4815 }, 4816 4817 /* PREFIX_VEX_0F5D */ 4818 { 4819 { "vminps", { XM, Vex, EXx }, 0 }, 4820 { "vminss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4821 { "vminpd", { XM, Vex, EXx }, 0 }, 4822 { "vminsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4823 }, 4824 4825 /* PREFIX_VEX_0F5E */ 4826 { 4827 { "vdivps", { XM, Vex, EXx }, 0 }, 4828 { "vdivss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4829 { "vdivpd", { XM, Vex, EXx }, 0 }, 4830 { "vdivsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4831 }, 4832 4833 /* PREFIX_VEX_0F5F */ 4834 { 4835 { "vmaxps", { XM, Vex, EXx }, 0 }, 4836 { "vmaxss", { XMScalar, VexScalar, EXdScalar }, 0 }, 4837 { "vmaxpd", { XM, Vex, EXx }, 0 }, 4838 { "vmaxsd", { XMScalar, VexScalar, EXqScalar }, 0 }, 4839 }, 4840 4841 /* PREFIX_VEX_0F60 */ 4842 { 4843 { Bad_Opcode }, 4844 { Bad_Opcode }, 4845 { "vpunpcklbw", { XM, Vex, EXx }, 0 }, 4846 }, 4847 4848 /* PREFIX_VEX_0F61 */ 4849 { 4850 { Bad_Opcode }, 4851 { Bad_Opcode }, 4852 { "vpunpcklwd", { XM, Vex, EXx }, 0 }, 4853 }, 4854 4855 /* PREFIX_VEX_0F62 */ 4856 { 4857 { Bad_Opcode }, 4858 { Bad_Opcode }, 4859 { "vpunpckldq", { XM, Vex, EXx }, 0 }, 4860 }, 4861 4862 /* PREFIX_VEX_0F63 */ 4863 { 4864 { Bad_Opcode }, 4865 { Bad_Opcode }, 4866 { "vpacksswb", { XM, Vex, EXx }, 0 }, 4867 }, 4868 4869 /* PREFIX_VEX_0F64 */ 4870 { 4871 { Bad_Opcode }, 4872 { Bad_Opcode }, 4873 { "vpcmpgtb", { XM, Vex, EXx }, 0 }, 4874 }, 4875 4876 /* PREFIX_VEX_0F65 */ 4877 { 4878 { Bad_Opcode }, 4879 { Bad_Opcode }, 4880 { "vpcmpgtw", { XM, Vex, EXx }, 0 }, 4881 }, 4882 4883 /* PREFIX_VEX_0F66 */ 4884 { 4885 { Bad_Opcode }, 4886 { Bad_Opcode }, 4887 { "vpcmpgtd", { XM, Vex, EXx }, 0 }, 4888 }, 4889 4890 /* PREFIX_VEX_0F67 */ 4891 { 4892 { Bad_Opcode }, 4893 { Bad_Opcode }, 4894 { "vpackuswb", { XM, Vex, EXx }, 0 }, 4895 }, 4896 4897 /* PREFIX_VEX_0F68 */ 4898 { 4899 { Bad_Opcode }, 4900 { Bad_Opcode }, 4901 { "vpunpckhbw", { XM, Vex, EXx }, 0 }, 4902 }, 4903 4904 /* PREFIX_VEX_0F69 */ 4905 { 4906 { Bad_Opcode }, 4907 { Bad_Opcode }, 4908 { "vpunpckhwd", { XM, Vex, EXx }, 0 }, 4909 }, 4910 4911 /* PREFIX_VEX_0F6A */ 4912 { 4913 { Bad_Opcode }, 4914 { Bad_Opcode }, 4915 { "vpunpckhdq", { XM, Vex, EXx }, 0 }, 4916 }, 4917 4918 /* PREFIX_VEX_0F6B */ 4919 { 4920 { Bad_Opcode }, 4921 { Bad_Opcode }, 4922 { "vpackssdw", { XM, Vex, EXx }, 0 }, 4923 }, 4924 4925 /* PREFIX_VEX_0F6C */ 4926 { 4927 { Bad_Opcode }, 4928 { Bad_Opcode }, 4929 { "vpunpcklqdq", { XM, Vex, EXx }, 0 }, 4930 }, 4931 4932 /* PREFIX_VEX_0F6D */ 4933 { 4934 { Bad_Opcode }, 4935 { Bad_Opcode }, 4936 { "vpunpckhqdq", { XM, Vex, EXx }, 0 }, 4937 }, 4938 4939 /* PREFIX_VEX_0F6E */ 4940 { 4941 { Bad_Opcode }, 4942 { Bad_Opcode }, 4943 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) }, 4944 }, 4945 4946 /* PREFIX_VEX_0F6F */ 4947 { 4948 { Bad_Opcode }, 4949 { "vmovdqu", { XM, EXx }, 0 }, 4950 { "vmovdqa", { XM, EXx }, 0 }, 4951 }, 4952 4953 /* PREFIX_VEX_0F70 */ 4954 { 4955 { Bad_Opcode }, 4956 { "vpshufhw", { XM, EXx, Ib }, 0 }, 4957 { "vpshufd", { XM, EXx, Ib }, 0 }, 4958 { "vpshuflw", { XM, EXx, Ib }, 0 }, 4959 }, 4960 4961 /* PREFIX_VEX_0F71_REG_2 */ 4962 { 4963 { Bad_Opcode }, 4964 { Bad_Opcode }, 4965 { "vpsrlw", { Vex, XS, Ib }, 0 }, 4966 }, 4967 4968 /* PREFIX_VEX_0F71_REG_4 */ 4969 { 4970 { Bad_Opcode }, 4971 { Bad_Opcode }, 4972 { "vpsraw", { Vex, XS, Ib }, 0 }, 4973 }, 4974 4975 /* PREFIX_VEX_0F71_REG_6 */ 4976 { 4977 { Bad_Opcode }, 4978 { Bad_Opcode }, 4979 { "vpsllw", { Vex, XS, Ib }, 0 }, 4980 }, 4981 4982 /* PREFIX_VEX_0F72_REG_2 */ 4983 { 4984 { Bad_Opcode }, 4985 { Bad_Opcode }, 4986 { "vpsrld", { Vex, XS, Ib }, 0 }, 4987 }, 4988 4989 /* PREFIX_VEX_0F72_REG_4 */ 4990 { 4991 { Bad_Opcode }, 4992 { Bad_Opcode }, 4993 { "vpsrad", { Vex, XS, Ib }, 0 }, 4994 }, 4995 4996 /* PREFIX_VEX_0F72_REG_6 */ 4997 { 4998 { Bad_Opcode }, 4999 { Bad_Opcode }, 5000 { "vpslld", { Vex, XS, Ib }, 0 }, 5001 }, 5002 5003 /* PREFIX_VEX_0F73_REG_2 */ 5004 { 5005 { Bad_Opcode }, 5006 { Bad_Opcode }, 5007 { "vpsrlq", { Vex, XS, Ib }, 0 }, 5008 }, 5009 5010 /* PREFIX_VEX_0F73_REG_3 */ 5011 { 5012 { Bad_Opcode }, 5013 { Bad_Opcode }, 5014 { "vpsrldq", { Vex, XS, Ib }, 0 }, 5015 }, 5016 5017 /* PREFIX_VEX_0F73_REG_6 */ 5018 { 5019 { Bad_Opcode }, 5020 { Bad_Opcode }, 5021 { "vpsllq", { Vex, XS, Ib }, 0 }, 5022 }, 5023 5024 /* PREFIX_VEX_0F73_REG_7 */ 5025 { 5026 { Bad_Opcode }, 5027 { Bad_Opcode }, 5028 { "vpslldq", { Vex, XS, Ib }, 0 }, 5029 }, 5030 5031 /* PREFIX_VEX_0F74 */ 5032 { 5033 { Bad_Opcode }, 5034 { Bad_Opcode }, 5035 { "vpcmpeqb", { XM, Vex, EXx }, 0 }, 5036 }, 5037 5038 /* PREFIX_VEX_0F75 */ 5039 { 5040 { Bad_Opcode }, 5041 { Bad_Opcode }, 5042 { "vpcmpeqw", { XM, Vex, EXx }, 0 }, 5043 }, 5044 5045 /* PREFIX_VEX_0F76 */ 5046 { 5047 { Bad_Opcode }, 5048 { Bad_Opcode }, 5049 { "vpcmpeqd", { XM, Vex, EXx }, 0 }, 5050 }, 5051 5052 /* PREFIX_VEX_0F77 */ 5053 { 5054 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) }, 5055 }, 5056 5057 /* PREFIX_VEX_0F7C */ 5058 { 5059 { Bad_Opcode }, 5060 { Bad_Opcode }, 5061 { "vhaddpd", { XM, Vex, EXx }, 0 }, 5062 { "vhaddps", { XM, Vex, EXx }, 0 }, 5063 }, 5064 5065 /* PREFIX_VEX_0F7D */ 5066 { 5067 { Bad_Opcode }, 5068 { Bad_Opcode }, 5069 { "vhsubpd", { XM, Vex, EXx }, 0 }, 5070 { "vhsubps", { XM, Vex, EXx }, 0 }, 5071 }, 5072 5073 /* PREFIX_VEX_0F7E */ 5074 { 5075 { Bad_Opcode }, 5076 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) }, 5077 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) }, 5078 }, 5079 5080 /* PREFIX_VEX_0F7F */ 5081 { 5082 { Bad_Opcode }, 5083 { "vmovdqu", { EXxS, XM }, 0 }, 5084 { "vmovdqa", { EXxS, XM }, 0 }, 5085 }, 5086 5087 /* PREFIX_VEX_0F90 */ 5088 { 5089 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) }, 5090 { Bad_Opcode }, 5091 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) }, 5092 }, 5093 5094 /* PREFIX_VEX_0F91 */ 5095 { 5096 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) }, 5097 { Bad_Opcode }, 5098 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) }, 5099 }, 5100 5101 /* PREFIX_VEX_0F92 */ 5102 { 5103 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) }, 5104 { Bad_Opcode }, 5105 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) }, 5106 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) }, 5107 }, 5108 5109 /* PREFIX_VEX_0F93 */ 5110 { 5111 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) }, 5112 { Bad_Opcode }, 5113 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) }, 5114 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) }, 5115 }, 5116 5117 /* PREFIX_VEX_0F98 */ 5118 { 5119 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) }, 5120 { Bad_Opcode }, 5121 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) }, 5122 }, 5123 5124 /* PREFIX_VEX_0F99 */ 5125 { 5126 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) }, 5127 { Bad_Opcode }, 5128 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) }, 5129 }, 5130 5131 /* PREFIX_VEX_0FC2 */ 5132 { 5133 { "vcmpps", { XM, Vex, EXx, VCMP }, 0 }, 5134 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP }, 0 }, 5135 { "vcmppd", { XM, Vex, EXx, VCMP }, 0 }, 5136 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP }, 0 }, 5137 }, 5138 5139 /* PREFIX_VEX_0FC4 */ 5140 { 5141 { Bad_Opcode }, 5142 { Bad_Opcode }, 5143 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) }, 5144 }, 5145 5146 /* PREFIX_VEX_0FC5 */ 5147 { 5148 { Bad_Opcode }, 5149 { Bad_Opcode }, 5150 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) }, 5151 }, 5152 5153 /* PREFIX_VEX_0FD0 */ 5154 { 5155 { Bad_Opcode }, 5156 { Bad_Opcode }, 5157 { "vaddsubpd", { XM, Vex, EXx }, 0 }, 5158 { "vaddsubps", { XM, Vex, EXx }, 0 }, 5159 }, 5160 5161 /* PREFIX_VEX_0FD1 */ 5162 { 5163 { Bad_Opcode }, 5164 { Bad_Opcode }, 5165 { "vpsrlw", { XM, Vex, EXxmm }, 0 }, 5166 }, 5167 5168 /* PREFIX_VEX_0FD2 */ 5169 { 5170 { Bad_Opcode }, 5171 { Bad_Opcode }, 5172 { "vpsrld", { XM, Vex, EXxmm }, 0 }, 5173 }, 5174 5175 /* PREFIX_VEX_0FD3 */ 5176 { 5177 { Bad_Opcode }, 5178 { Bad_Opcode }, 5179 { "vpsrlq", { XM, Vex, EXxmm }, 0 }, 5180 }, 5181 5182 /* PREFIX_VEX_0FD4 */ 5183 { 5184 { Bad_Opcode }, 5185 { Bad_Opcode }, 5186 { "vpaddq", { XM, Vex, EXx }, 0 }, 5187 }, 5188 5189 /* PREFIX_VEX_0FD5 */ 5190 { 5191 { Bad_Opcode }, 5192 { Bad_Opcode }, 5193 { "vpmullw", { XM, Vex, EXx }, 0 }, 5194 }, 5195 5196 /* PREFIX_VEX_0FD6 */ 5197 { 5198 { Bad_Opcode }, 5199 { Bad_Opcode }, 5200 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) }, 5201 }, 5202 5203 /* PREFIX_VEX_0FD7 */ 5204 { 5205 { Bad_Opcode }, 5206 { Bad_Opcode }, 5207 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) }, 5208 }, 5209 5210 /* PREFIX_VEX_0FD8 */ 5211 { 5212 { Bad_Opcode }, 5213 { Bad_Opcode }, 5214 { "vpsubusb", { XM, Vex, EXx }, 0 }, 5215 }, 5216 5217 /* PREFIX_VEX_0FD9 */ 5218 { 5219 { Bad_Opcode }, 5220 { Bad_Opcode }, 5221 { "vpsubusw", { XM, Vex, EXx }, 0 }, 5222 }, 5223 5224 /* PREFIX_VEX_0FDA */ 5225 { 5226 { Bad_Opcode }, 5227 { Bad_Opcode }, 5228 { "vpminub", { XM, Vex, EXx }, 0 }, 5229 }, 5230 5231 /* PREFIX_VEX_0FDB */ 5232 { 5233 { Bad_Opcode }, 5234 { Bad_Opcode }, 5235 { "vpand", { XM, Vex, EXx }, 0 }, 5236 }, 5237 5238 /* PREFIX_VEX_0FDC */ 5239 { 5240 { Bad_Opcode }, 5241 { Bad_Opcode }, 5242 { "vpaddusb", { XM, Vex, EXx }, 0 }, 5243 }, 5244 5245 /* PREFIX_VEX_0FDD */ 5246 { 5247 { Bad_Opcode }, 5248 { Bad_Opcode }, 5249 { "vpaddusw", { XM, Vex, EXx }, 0 }, 5250 }, 5251 5252 /* PREFIX_VEX_0FDE */ 5253 { 5254 { Bad_Opcode }, 5255 { Bad_Opcode }, 5256 { "vpmaxub", { XM, Vex, EXx }, 0 }, 5257 }, 5258 5259 /* PREFIX_VEX_0FDF */ 5260 { 5261 { Bad_Opcode }, 5262 { Bad_Opcode }, 5263 { "vpandn", { XM, Vex, EXx }, 0 }, 5264 }, 5265 5266 /* PREFIX_VEX_0FE0 */ 5267 { 5268 { Bad_Opcode }, 5269 { Bad_Opcode }, 5270 { "vpavgb", { XM, Vex, EXx }, 0 }, 5271 }, 5272 5273 /* PREFIX_VEX_0FE1 */ 5274 { 5275 { Bad_Opcode }, 5276 { Bad_Opcode }, 5277 { "vpsraw", { XM, Vex, EXxmm }, 0 }, 5278 }, 5279 5280 /* PREFIX_VEX_0FE2 */ 5281 { 5282 { Bad_Opcode }, 5283 { Bad_Opcode }, 5284 { "vpsrad", { XM, Vex, EXxmm }, 0 }, 5285 }, 5286 5287 /* PREFIX_VEX_0FE3 */ 5288 { 5289 { Bad_Opcode }, 5290 { Bad_Opcode }, 5291 { "vpavgw", { XM, Vex, EXx }, 0 }, 5292 }, 5293 5294 /* PREFIX_VEX_0FE4 */ 5295 { 5296 { Bad_Opcode }, 5297 { Bad_Opcode }, 5298 { "vpmulhuw", { XM, Vex, EXx }, 0 }, 5299 }, 5300 5301 /* PREFIX_VEX_0FE5 */ 5302 { 5303 { Bad_Opcode }, 5304 { Bad_Opcode }, 5305 { "vpmulhw", { XM, Vex, EXx }, 0 }, 5306 }, 5307 5308 /* PREFIX_VEX_0FE6 */ 5309 { 5310 { Bad_Opcode }, 5311 { "vcvtdq2pd", { XM, EXxmmq }, 0 }, 5312 { "vcvttpd2dq%XY", { XMM, EXx }, 0 }, 5313 { "vcvtpd2dq%XY", { XMM, EXx }, 0 }, 5314 }, 5315 5316 /* PREFIX_VEX_0FE7 */ 5317 { 5318 { Bad_Opcode }, 5319 { Bad_Opcode }, 5320 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) }, 5321 }, 5322 5323 /* PREFIX_VEX_0FE8 */ 5324 { 5325 { Bad_Opcode }, 5326 { Bad_Opcode }, 5327 { "vpsubsb", { XM, Vex, EXx }, 0 }, 5328 }, 5329 5330 /* PREFIX_VEX_0FE9 */ 5331 { 5332 { Bad_Opcode }, 5333 { Bad_Opcode }, 5334 { "vpsubsw", { XM, Vex, EXx }, 0 }, 5335 }, 5336 5337 /* PREFIX_VEX_0FEA */ 5338 { 5339 { Bad_Opcode }, 5340 { Bad_Opcode }, 5341 { "vpminsw", { XM, Vex, EXx }, 0 }, 5342 }, 5343 5344 /* PREFIX_VEX_0FEB */ 5345 { 5346 { Bad_Opcode }, 5347 { Bad_Opcode }, 5348 { "vpor", { XM, Vex, EXx }, 0 }, 5349 }, 5350 5351 /* PREFIX_VEX_0FEC */ 5352 { 5353 { Bad_Opcode }, 5354 { Bad_Opcode }, 5355 { "vpaddsb", { XM, Vex, EXx }, 0 }, 5356 }, 5357 5358 /* PREFIX_VEX_0FED */ 5359 { 5360 { Bad_Opcode }, 5361 { Bad_Opcode }, 5362 { "vpaddsw", { XM, Vex, EXx }, 0 }, 5363 }, 5364 5365 /* PREFIX_VEX_0FEE */ 5366 { 5367 { Bad_Opcode }, 5368 { Bad_Opcode }, 5369 { "vpmaxsw", { XM, Vex, EXx }, 0 }, 5370 }, 5371 5372 /* PREFIX_VEX_0FEF */ 5373 { 5374 { Bad_Opcode }, 5375 { Bad_Opcode }, 5376 { "vpxor", { XM, Vex, EXx }, 0 }, 5377 }, 5378 5379 /* PREFIX_VEX_0FF0 */ 5380 { 5381 { Bad_Opcode }, 5382 { Bad_Opcode }, 5383 { Bad_Opcode }, 5384 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) }, 5385 }, 5386 5387 /* PREFIX_VEX_0FF1 */ 5388 { 5389 { Bad_Opcode }, 5390 { Bad_Opcode }, 5391 { "vpsllw", { XM, Vex, EXxmm }, 0 }, 5392 }, 5393 5394 /* PREFIX_VEX_0FF2 */ 5395 { 5396 { Bad_Opcode }, 5397 { Bad_Opcode }, 5398 { "vpslld", { XM, Vex, EXxmm }, 0 }, 5399 }, 5400 5401 /* PREFIX_VEX_0FF3 */ 5402 { 5403 { Bad_Opcode }, 5404 { Bad_Opcode }, 5405 { "vpsllq", { XM, Vex, EXxmm }, 0 }, 5406 }, 5407 5408 /* PREFIX_VEX_0FF4 */ 5409 { 5410 { Bad_Opcode }, 5411 { Bad_Opcode }, 5412 { "vpmuludq", { XM, Vex, EXx }, 0 }, 5413 }, 5414 5415 /* PREFIX_VEX_0FF5 */ 5416 { 5417 { Bad_Opcode }, 5418 { Bad_Opcode }, 5419 { "vpmaddwd", { XM, Vex, EXx }, 0 }, 5420 }, 5421 5422 /* PREFIX_VEX_0FF6 */ 5423 { 5424 { Bad_Opcode }, 5425 { Bad_Opcode }, 5426 { "vpsadbw", { XM, Vex, EXx }, 0 }, 5427 }, 5428 5429 /* PREFIX_VEX_0FF7 */ 5430 { 5431 { Bad_Opcode }, 5432 { Bad_Opcode }, 5433 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) }, 5434 }, 5435 5436 /* PREFIX_VEX_0FF8 */ 5437 { 5438 { Bad_Opcode }, 5439 { Bad_Opcode }, 5440 { "vpsubb", { XM, Vex, EXx }, 0 }, 5441 }, 5442 5443 /* PREFIX_VEX_0FF9 */ 5444 { 5445 { Bad_Opcode }, 5446 { Bad_Opcode }, 5447 { "vpsubw", { XM, Vex, EXx }, 0 }, 5448 }, 5449 5450 /* PREFIX_VEX_0FFA */ 5451 { 5452 { Bad_Opcode }, 5453 { Bad_Opcode }, 5454 { "vpsubd", { XM, Vex, EXx }, 0 }, 5455 }, 5456 5457 /* PREFIX_VEX_0FFB */ 5458 { 5459 { Bad_Opcode }, 5460 { Bad_Opcode }, 5461 { "vpsubq", { XM, Vex, EXx }, 0 }, 5462 }, 5463 5464 /* PREFIX_VEX_0FFC */ 5465 { 5466 { Bad_Opcode }, 5467 { Bad_Opcode }, 5468 { "vpaddb", { XM, Vex, EXx }, 0 }, 5469 }, 5470 5471 /* PREFIX_VEX_0FFD */ 5472 { 5473 { Bad_Opcode }, 5474 { Bad_Opcode }, 5475 { "vpaddw", { XM, Vex, EXx }, 0 }, 5476 }, 5477 5478 /* PREFIX_VEX_0FFE */ 5479 { 5480 { Bad_Opcode }, 5481 { Bad_Opcode }, 5482 { "vpaddd", { XM, Vex, EXx }, 0 }, 5483 }, 5484 5485 /* PREFIX_VEX_0F3800 */ 5486 { 5487 { Bad_Opcode }, 5488 { Bad_Opcode }, 5489 { "vpshufb", { XM, Vex, EXx }, 0 }, 5490 }, 5491 5492 /* PREFIX_VEX_0F3801 */ 5493 { 5494 { Bad_Opcode }, 5495 { Bad_Opcode }, 5496 { "vphaddw", { XM, Vex, EXx }, 0 }, 5497 }, 5498 5499 /* PREFIX_VEX_0F3802 */ 5500 { 5501 { Bad_Opcode }, 5502 { Bad_Opcode }, 5503 { "vphaddd", { XM, Vex, EXx }, 0 }, 5504 }, 5505 5506 /* PREFIX_VEX_0F3803 */ 5507 { 5508 { Bad_Opcode }, 5509 { Bad_Opcode }, 5510 { "vphaddsw", { XM, Vex, EXx }, 0 }, 5511 }, 5512 5513 /* PREFIX_VEX_0F3804 */ 5514 { 5515 { Bad_Opcode }, 5516 { Bad_Opcode }, 5517 { "vpmaddubsw", { XM, Vex, EXx }, 0 }, 5518 }, 5519 5520 /* PREFIX_VEX_0F3805 */ 5521 { 5522 { Bad_Opcode }, 5523 { Bad_Opcode }, 5524 { "vphsubw", { XM, Vex, EXx }, 0 }, 5525 }, 5526 5527 /* PREFIX_VEX_0F3806 */ 5528 { 5529 { Bad_Opcode }, 5530 { Bad_Opcode }, 5531 { "vphsubd", { XM, Vex, EXx }, 0 }, 5532 }, 5533 5534 /* PREFIX_VEX_0F3807 */ 5535 { 5536 { Bad_Opcode }, 5537 { Bad_Opcode }, 5538 { "vphsubsw", { XM, Vex, EXx }, 0 }, 5539 }, 5540 5541 /* PREFIX_VEX_0F3808 */ 5542 { 5543 { Bad_Opcode }, 5544 { Bad_Opcode }, 5545 { "vpsignb", { XM, Vex, EXx }, 0 }, 5546 }, 5547 5548 /* PREFIX_VEX_0F3809 */ 5549 { 5550 { Bad_Opcode }, 5551 { Bad_Opcode }, 5552 { "vpsignw", { XM, Vex, EXx }, 0 }, 5553 }, 5554 5555 /* PREFIX_VEX_0F380A */ 5556 { 5557 { Bad_Opcode }, 5558 { Bad_Opcode }, 5559 { "vpsignd", { XM, Vex, EXx }, 0 }, 5560 }, 5561 5562 /* PREFIX_VEX_0F380B */ 5563 { 5564 { Bad_Opcode }, 5565 { Bad_Opcode }, 5566 { "vpmulhrsw", { XM, Vex, EXx }, 0 }, 5567 }, 5568 5569 /* PREFIX_VEX_0F380C */ 5570 { 5571 { Bad_Opcode }, 5572 { Bad_Opcode }, 5573 { VEX_W_TABLE (VEX_W_0F380C_P_2) }, 5574 }, 5575 5576 /* PREFIX_VEX_0F380D */ 5577 { 5578 { Bad_Opcode }, 5579 { Bad_Opcode }, 5580 { VEX_W_TABLE (VEX_W_0F380D_P_2) }, 5581 }, 5582 5583 /* PREFIX_VEX_0F380E */ 5584 { 5585 { Bad_Opcode }, 5586 { Bad_Opcode }, 5587 { VEX_W_TABLE (VEX_W_0F380E_P_2) }, 5588 }, 5589 5590 /* PREFIX_VEX_0F380F */ 5591 { 5592 { Bad_Opcode }, 5593 { Bad_Opcode }, 5594 { VEX_W_TABLE (VEX_W_0F380F_P_2) }, 5595 }, 5596 5597 /* PREFIX_VEX_0F3813 */ 5598 { 5599 { Bad_Opcode }, 5600 { Bad_Opcode }, 5601 { "vcvtph2ps", { XM, EXxmmq }, 0 }, 5602 }, 5603 5604 /* PREFIX_VEX_0F3816 */ 5605 { 5606 { Bad_Opcode }, 5607 { Bad_Opcode }, 5608 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) }, 5609 }, 5610 5611 /* PREFIX_VEX_0F3817 */ 5612 { 5613 { Bad_Opcode }, 5614 { Bad_Opcode }, 5615 { "vptest", { XM, EXx }, 0 }, 5616 }, 5617 5618 /* PREFIX_VEX_0F3818 */ 5619 { 5620 { Bad_Opcode }, 5621 { Bad_Opcode }, 5622 { VEX_W_TABLE (VEX_W_0F3818_P_2) }, 5623 }, 5624 5625 /* PREFIX_VEX_0F3819 */ 5626 { 5627 { Bad_Opcode }, 5628 { Bad_Opcode }, 5629 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) }, 5630 }, 5631 5632 /* PREFIX_VEX_0F381A */ 5633 { 5634 { Bad_Opcode }, 5635 { Bad_Opcode }, 5636 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) }, 5637 }, 5638 5639 /* PREFIX_VEX_0F381C */ 5640 { 5641 { Bad_Opcode }, 5642 { Bad_Opcode }, 5643 { "vpabsb", { XM, EXx }, 0 }, 5644 }, 5645 5646 /* PREFIX_VEX_0F381D */ 5647 { 5648 { Bad_Opcode }, 5649 { Bad_Opcode }, 5650 { "vpabsw", { XM, EXx }, 0 }, 5651 }, 5652 5653 /* PREFIX_VEX_0F381E */ 5654 { 5655 { Bad_Opcode }, 5656 { Bad_Opcode }, 5657 { "vpabsd", { XM, EXx }, 0 }, 5658 }, 5659 5660 /* PREFIX_VEX_0F3820 */ 5661 { 5662 { Bad_Opcode }, 5663 { Bad_Opcode }, 5664 { "vpmovsxbw", { XM, EXxmmq }, 0 }, 5665 }, 5666 5667 /* PREFIX_VEX_0F3821 */ 5668 { 5669 { Bad_Opcode }, 5670 { Bad_Opcode }, 5671 { "vpmovsxbd", { XM, EXxmmqd }, 0 }, 5672 }, 5673 5674 /* PREFIX_VEX_0F3822 */ 5675 { 5676 { Bad_Opcode }, 5677 { Bad_Opcode }, 5678 { "vpmovsxbq", { XM, EXxmmdw }, 0 }, 5679 }, 5680 5681 /* PREFIX_VEX_0F3823 */ 5682 { 5683 { Bad_Opcode }, 5684 { Bad_Opcode }, 5685 { "vpmovsxwd", { XM, EXxmmq }, 0 }, 5686 }, 5687 5688 /* PREFIX_VEX_0F3824 */ 5689 { 5690 { Bad_Opcode }, 5691 { Bad_Opcode }, 5692 { "vpmovsxwq", { XM, EXxmmqd }, 0 }, 5693 }, 5694 5695 /* PREFIX_VEX_0F3825 */ 5696 { 5697 { Bad_Opcode }, 5698 { Bad_Opcode }, 5699 { "vpmovsxdq", { XM, EXxmmq }, 0 }, 5700 }, 5701 5702 /* PREFIX_VEX_0F3828 */ 5703 { 5704 { Bad_Opcode }, 5705 { Bad_Opcode }, 5706 { "vpmuldq", { XM, Vex, EXx }, 0 }, 5707 }, 5708 5709 /* PREFIX_VEX_0F3829 */ 5710 { 5711 { Bad_Opcode }, 5712 { Bad_Opcode }, 5713 { "vpcmpeqq", { XM, Vex, EXx }, 0 }, 5714 }, 5715 5716 /* PREFIX_VEX_0F382A */ 5717 { 5718 { Bad_Opcode }, 5719 { Bad_Opcode }, 5720 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) }, 5721 }, 5722 5723 /* PREFIX_VEX_0F382B */ 5724 { 5725 { Bad_Opcode }, 5726 { Bad_Opcode }, 5727 { "vpackusdw", { XM, Vex, EXx }, 0 }, 5728 }, 5729 5730 /* PREFIX_VEX_0F382C */ 5731 { 5732 { Bad_Opcode }, 5733 { Bad_Opcode }, 5734 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) }, 5735 }, 5736 5737 /* PREFIX_VEX_0F382D */ 5738 { 5739 { Bad_Opcode }, 5740 { Bad_Opcode }, 5741 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) }, 5742 }, 5743 5744 /* PREFIX_VEX_0F382E */ 5745 { 5746 { Bad_Opcode }, 5747 { Bad_Opcode }, 5748 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) }, 5749 }, 5750 5751 /* PREFIX_VEX_0F382F */ 5752 { 5753 { Bad_Opcode }, 5754 { Bad_Opcode }, 5755 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) }, 5756 }, 5757 5758 /* PREFIX_VEX_0F3830 */ 5759 { 5760 { Bad_Opcode }, 5761 { Bad_Opcode }, 5762 { "vpmovzxbw", { XM, EXxmmq }, 0 }, 5763 }, 5764 5765 /* PREFIX_VEX_0F3831 */ 5766 { 5767 { Bad_Opcode }, 5768 { Bad_Opcode }, 5769 { "vpmovzxbd", { XM, EXxmmqd }, 0 }, 5770 }, 5771 5772 /* PREFIX_VEX_0F3832 */ 5773 { 5774 { Bad_Opcode }, 5775 { Bad_Opcode }, 5776 { "vpmovzxbq", { XM, EXxmmdw }, 0 }, 5777 }, 5778 5779 /* PREFIX_VEX_0F3833 */ 5780 { 5781 { Bad_Opcode }, 5782 { Bad_Opcode }, 5783 { "vpmovzxwd", { XM, EXxmmq }, 0 }, 5784 }, 5785 5786 /* PREFIX_VEX_0F3834 */ 5787 { 5788 { Bad_Opcode }, 5789 { Bad_Opcode }, 5790 { "vpmovzxwq", { XM, EXxmmqd }, 0 }, 5791 }, 5792 5793 /* PREFIX_VEX_0F3835 */ 5794 { 5795 { Bad_Opcode }, 5796 { Bad_Opcode }, 5797 { "vpmovzxdq", { XM, EXxmmq }, 0 }, 5798 }, 5799 5800 /* PREFIX_VEX_0F3836 */ 5801 { 5802 { Bad_Opcode }, 5803 { Bad_Opcode }, 5804 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) }, 5805 }, 5806 5807 /* PREFIX_VEX_0F3837 */ 5808 { 5809 { Bad_Opcode }, 5810 { Bad_Opcode }, 5811 { "vpcmpgtq", { XM, Vex, EXx }, 0 }, 5812 }, 5813 5814 /* PREFIX_VEX_0F3838 */ 5815 { 5816 { Bad_Opcode }, 5817 { Bad_Opcode }, 5818 { "vpminsb", { XM, Vex, EXx }, 0 }, 5819 }, 5820 5821 /* PREFIX_VEX_0F3839 */ 5822 { 5823 { Bad_Opcode }, 5824 { Bad_Opcode }, 5825 { "vpminsd", { XM, Vex, EXx }, 0 }, 5826 }, 5827 5828 /* PREFIX_VEX_0F383A */ 5829 { 5830 { Bad_Opcode }, 5831 { Bad_Opcode }, 5832 { "vpminuw", { XM, Vex, EXx }, 0 }, 5833 }, 5834 5835 /* PREFIX_VEX_0F383B */ 5836 { 5837 { Bad_Opcode }, 5838 { Bad_Opcode }, 5839 { "vpminud", { XM, Vex, EXx }, 0 }, 5840 }, 5841 5842 /* PREFIX_VEX_0F383C */ 5843 { 5844 { Bad_Opcode }, 5845 { Bad_Opcode }, 5846 { "vpmaxsb", { XM, Vex, EXx }, 0 }, 5847 }, 5848 5849 /* PREFIX_VEX_0F383D */ 5850 { 5851 { Bad_Opcode }, 5852 { Bad_Opcode }, 5853 { "vpmaxsd", { XM, Vex, EXx }, 0 }, 5854 }, 5855 5856 /* PREFIX_VEX_0F383E */ 5857 { 5858 { Bad_Opcode }, 5859 { Bad_Opcode }, 5860 { "vpmaxuw", { XM, Vex, EXx }, 0 }, 5861 }, 5862 5863 /* PREFIX_VEX_0F383F */ 5864 { 5865 { Bad_Opcode }, 5866 { Bad_Opcode }, 5867 { "vpmaxud", { XM, Vex, EXx }, 0 }, 5868 }, 5869 5870 /* PREFIX_VEX_0F3840 */ 5871 { 5872 { Bad_Opcode }, 5873 { Bad_Opcode }, 5874 { "vpmulld", { XM, Vex, EXx }, 0 }, 5875 }, 5876 5877 /* PREFIX_VEX_0F3841 */ 5878 { 5879 { Bad_Opcode }, 5880 { Bad_Opcode }, 5881 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) }, 5882 }, 5883 5884 /* PREFIX_VEX_0F3845 */ 5885 { 5886 { Bad_Opcode }, 5887 { Bad_Opcode }, 5888 { "vpsrlv%LW", { XM, Vex, EXx }, 0 }, 5889 }, 5890 5891 /* PREFIX_VEX_0F3846 */ 5892 { 5893 { Bad_Opcode }, 5894 { Bad_Opcode }, 5895 { VEX_W_TABLE (VEX_W_0F3846_P_2) }, 5896 }, 5897 5898 /* PREFIX_VEX_0F3847 */ 5899 { 5900 { Bad_Opcode }, 5901 { Bad_Opcode }, 5902 { "vpsllv%LW", { XM, Vex, EXx }, 0 }, 5903 }, 5904 5905 /* PREFIX_VEX_0F3858 */ 5906 { 5907 { Bad_Opcode }, 5908 { Bad_Opcode }, 5909 { VEX_W_TABLE (VEX_W_0F3858_P_2) }, 5910 }, 5911 5912 /* PREFIX_VEX_0F3859 */ 5913 { 5914 { Bad_Opcode }, 5915 { Bad_Opcode }, 5916 { VEX_W_TABLE (VEX_W_0F3859_P_2) }, 5917 }, 5918 5919 /* PREFIX_VEX_0F385A */ 5920 { 5921 { Bad_Opcode }, 5922 { Bad_Opcode }, 5923 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) }, 5924 }, 5925 5926 /* PREFIX_VEX_0F3878 */ 5927 { 5928 { Bad_Opcode }, 5929 { Bad_Opcode }, 5930 { VEX_W_TABLE (VEX_W_0F3878_P_2) }, 5931 }, 5932 5933 /* PREFIX_VEX_0F3879 */ 5934 { 5935 { Bad_Opcode }, 5936 { Bad_Opcode }, 5937 { VEX_W_TABLE (VEX_W_0F3879_P_2) }, 5938 }, 5939 5940 /* PREFIX_VEX_0F388C */ 5941 { 5942 { Bad_Opcode }, 5943 { Bad_Opcode }, 5944 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) }, 5945 }, 5946 5947 /* PREFIX_VEX_0F388E */ 5948 { 5949 { Bad_Opcode }, 5950 { Bad_Opcode }, 5951 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) }, 5952 }, 5953 5954 /* PREFIX_VEX_0F3890 */ 5955 { 5956 { Bad_Opcode }, 5957 { Bad_Opcode }, 5958 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 }, 5959 }, 5960 5961 /* PREFIX_VEX_0F3891 */ 5962 { 5963 { Bad_Opcode }, 5964 { Bad_Opcode }, 5965 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 }, 5966 }, 5967 5968 /* PREFIX_VEX_0F3892 */ 5969 { 5970 { Bad_Opcode }, 5971 { Bad_Opcode }, 5972 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 }, 5973 }, 5974 5975 /* PREFIX_VEX_0F3893 */ 5976 { 5977 { Bad_Opcode }, 5978 { Bad_Opcode }, 5979 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 }, 5980 }, 5981 5982 /* PREFIX_VEX_0F3896 */ 5983 { 5984 { Bad_Opcode }, 5985 { Bad_Opcode }, 5986 { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 }, 5987 }, 5988 5989 /* PREFIX_VEX_0F3897 */ 5990 { 5991 { Bad_Opcode }, 5992 { Bad_Opcode }, 5993 { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 }, 5994 }, 5995 5996 /* PREFIX_VEX_0F3898 */ 5997 { 5998 { Bad_Opcode }, 5999 { Bad_Opcode }, 6000 { "vfmadd132p%XW", { XM, Vex, EXx }, 0 }, 6001 }, 6002 6003 /* PREFIX_VEX_0F3899 */ 6004 { 6005 { Bad_Opcode }, 6006 { Bad_Opcode }, 6007 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6008 }, 6009 6010 /* PREFIX_VEX_0F389A */ 6011 { 6012 { Bad_Opcode }, 6013 { Bad_Opcode }, 6014 { "vfmsub132p%XW", { XM, Vex, EXx }, 0 }, 6015 }, 6016 6017 /* PREFIX_VEX_0F389B */ 6018 { 6019 { Bad_Opcode }, 6020 { Bad_Opcode }, 6021 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6022 }, 6023 6024 /* PREFIX_VEX_0F389C */ 6025 { 6026 { Bad_Opcode }, 6027 { Bad_Opcode }, 6028 { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 }, 6029 }, 6030 6031 /* PREFIX_VEX_0F389D */ 6032 { 6033 { Bad_Opcode }, 6034 { Bad_Opcode }, 6035 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6036 }, 6037 6038 /* PREFIX_VEX_0F389E */ 6039 { 6040 { Bad_Opcode }, 6041 { Bad_Opcode }, 6042 { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 }, 6043 }, 6044 6045 /* PREFIX_VEX_0F389F */ 6046 { 6047 { Bad_Opcode }, 6048 { Bad_Opcode }, 6049 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6050 }, 6051 6052 /* PREFIX_VEX_0F38A6 */ 6053 { 6054 { Bad_Opcode }, 6055 { Bad_Opcode }, 6056 { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 }, 6057 { Bad_Opcode }, 6058 }, 6059 6060 /* PREFIX_VEX_0F38A7 */ 6061 { 6062 { Bad_Opcode }, 6063 { Bad_Opcode }, 6064 { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 }, 6065 }, 6066 6067 /* PREFIX_VEX_0F38A8 */ 6068 { 6069 { Bad_Opcode }, 6070 { Bad_Opcode }, 6071 { "vfmadd213p%XW", { XM, Vex, EXx }, 0 }, 6072 }, 6073 6074 /* PREFIX_VEX_0F38A9 */ 6075 { 6076 { Bad_Opcode }, 6077 { Bad_Opcode }, 6078 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6079 }, 6080 6081 /* PREFIX_VEX_0F38AA */ 6082 { 6083 { Bad_Opcode }, 6084 { Bad_Opcode }, 6085 { "vfmsub213p%XW", { XM, Vex, EXx }, 0 }, 6086 }, 6087 6088 /* PREFIX_VEX_0F38AB */ 6089 { 6090 { Bad_Opcode }, 6091 { Bad_Opcode }, 6092 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6093 }, 6094 6095 /* PREFIX_VEX_0F38AC */ 6096 { 6097 { Bad_Opcode }, 6098 { Bad_Opcode }, 6099 { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 }, 6100 }, 6101 6102 /* PREFIX_VEX_0F38AD */ 6103 { 6104 { Bad_Opcode }, 6105 { Bad_Opcode }, 6106 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6107 }, 6108 6109 /* PREFIX_VEX_0F38AE */ 6110 { 6111 { Bad_Opcode }, 6112 { Bad_Opcode }, 6113 { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 }, 6114 }, 6115 6116 /* PREFIX_VEX_0F38AF */ 6117 { 6118 { Bad_Opcode }, 6119 { Bad_Opcode }, 6120 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6121 }, 6122 6123 /* PREFIX_VEX_0F38B6 */ 6124 { 6125 { Bad_Opcode }, 6126 { Bad_Opcode }, 6127 { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 }, 6128 }, 6129 6130 /* PREFIX_VEX_0F38B7 */ 6131 { 6132 { Bad_Opcode }, 6133 { Bad_Opcode }, 6134 { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 }, 6135 }, 6136 6137 /* PREFIX_VEX_0F38B8 */ 6138 { 6139 { Bad_Opcode }, 6140 { Bad_Opcode }, 6141 { "vfmadd231p%XW", { XM, Vex, EXx }, 0 }, 6142 }, 6143 6144 /* PREFIX_VEX_0F38B9 */ 6145 { 6146 { Bad_Opcode }, 6147 { Bad_Opcode }, 6148 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6149 }, 6150 6151 /* PREFIX_VEX_0F38BA */ 6152 { 6153 { Bad_Opcode }, 6154 { Bad_Opcode }, 6155 { "vfmsub231p%XW", { XM, Vex, EXx }, 0 }, 6156 }, 6157 6158 /* PREFIX_VEX_0F38BB */ 6159 { 6160 { Bad_Opcode }, 6161 { Bad_Opcode }, 6162 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6163 }, 6164 6165 /* PREFIX_VEX_0F38BC */ 6166 { 6167 { Bad_Opcode }, 6168 { Bad_Opcode }, 6169 { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 }, 6170 }, 6171 6172 /* PREFIX_VEX_0F38BD */ 6173 { 6174 { Bad_Opcode }, 6175 { Bad_Opcode }, 6176 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6177 }, 6178 6179 /* PREFIX_VEX_0F38BE */ 6180 { 6181 { Bad_Opcode }, 6182 { Bad_Opcode }, 6183 { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 }, 6184 }, 6185 6186 /* PREFIX_VEX_0F38BF */ 6187 { 6188 { Bad_Opcode }, 6189 { Bad_Opcode }, 6190 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 }, 6191 }, 6192 6193 /* PREFIX_VEX_0F38CF */ 6194 { 6195 { Bad_Opcode }, 6196 { Bad_Opcode }, 6197 { VEX_W_TABLE (VEX_W_0F38CF_P_2) }, 6198 }, 6199 6200 /* PREFIX_VEX_0F38DB */ 6201 { 6202 { Bad_Opcode }, 6203 { Bad_Opcode }, 6204 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) }, 6205 }, 6206 6207 /* PREFIX_VEX_0F38DC */ 6208 { 6209 { Bad_Opcode }, 6210 { Bad_Opcode }, 6211 { "vaesenc", { XM, Vex, EXx }, 0 }, 6212 }, 6213 6214 /* PREFIX_VEX_0F38DD */ 6215 { 6216 { Bad_Opcode }, 6217 { Bad_Opcode }, 6218 { "vaesenclast", { XM, Vex, EXx }, 0 }, 6219 }, 6220 6221 /* PREFIX_VEX_0F38DE */ 6222 { 6223 { Bad_Opcode }, 6224 { Bad_Opcode }, 6225 { "vaesdec", { XM, Vex, EXx }, 0 }, 6226 }, 6227 6228 /* PREFIX_VEX_0F38DF */ 6229 { 6230 { Bad_Opcode }, 6231 { Bad_Opcode }, 6232 { "vaesdeclast", { XM, Vex, EXx }, 0 }, 6233 }, 6234 6235 /* PREFIX_VEX_0F38F2 */ 6236 { 6237 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) }, 6238 }, 6239 6240 /* PREFIX_VEX_0F38F3_REG_1 */ 6241 { 6242 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) }, 6243 }, 6244 6245 /* PREFIX_VEX_0F38F3_REG_2 */ 6246 { 6247 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) }, 6248 }, 6249 6250 /* PREFIX_VEX_0F38F3_REG_3 */ 6251 { 6252 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) }, 6253 }, 6254 6255 /* PREFIX_VEX_0F38F5 */ 6256 { 6257 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) }, 6258 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) }, 6259 { Bad_Opcode }, 6260 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) }, 6261 }, 6262 6263 /* PREFIX_VEX_0F38F6 */ 6264 { 6265 { Bad_Opcode }, 6266 { Bad_Opcode }, 6267 { Bad_Opcode }, 6268 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) }, 6269 }, 6270 6271 /* PREFIX_VEX_0F38F7 */ 6272 { 6273 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) }, 6274 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) }, 6275 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) }, 6276 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) }, 6277 }, 6278 6279 /* PREFIX_VEX_0F3A00 */ 6280 { 6281 { Bad_Opcode }, 6282 { Bad_Opcode }, 6283 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) }, 6284 }, 6285 6286 /* PREFIX_VEX_0F3A01 */ 6287 { 6288 { Bad_Opcode }, 6289 { Bad_Opcode }, 6290 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) }, 6291 }, 6292 6293 /* PREFIX_VEX_0F3A02 */ 6294 { 6295 { Bad_Opcode }, 6296 { Bad_Opcode }, 6297 { VEX_W_TABLE (VEX_W_0F3A02_P_2) }, 6298 }, 6299 6300 /* PREFIX_VEX_0F3A04 */ 6301 { 6302 { Bad_Opcode }, 6303 { Bad_Opcode }, 6304 { VEX_W_TABLE (VEX_W_0F3A04_P_2) }, 6305 }, 6306 6307 /* PREFIX_VEX_0F3A05 */ 6308 { 6309 { Bad_Opcode }, 6310 { Bad_Opcode }, 6311 { VEX_W_TABLE (VEX_W_0F3A05_P_2) }, 6312 }, 6313 6314 /* PREFIX_VEX_0F3A06 */ 6315 { 6316 { Bad_Opcode }, 6317 { Bad_Opcode }, 6318 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) }, 6319 }, 6320 6321 /* PREFIX_VEX_0F3A08 */ 6322 { 6323 { Bad_Opcode }, 6324 { Bad_Opcode }, 6325 { "vroundps", { XM, EXx, Ib }, 0 }, 6326 }, 6327 6328 /* PREFIX_VEX_0F3A09 */ 6329 { 6330 { Bad_Opcode }, 6331 { Bad_Opcode }, 6332 { "vroundpd", { XM, EXx, Ib }, 0 }, 6333 }, 6334 6335 /* PREFIX_VEX_0F3A0A */ 6336 { 6337 { Bad_Opcode }, 6338 { Bad_Opcode }, 6339 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib }, 0 }, 6340 }, 6341 6342 /* PREFIX_VEX_0F3A0B */ 6343 { 6344 { Bad_Opcode }, 6345 { Bad_Opcode }, 6346 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib }, 0 }, 6347 }, 6348 6349 /* PREFIX_VEX_0F3A0C */ 6350 { 6351 { Bad_Opcode }, 6352 { Bad_Opcode }, 6353 { "vblendps", { XM, Vex, EXx, Ib }, 0 }, 6354 }, 6355 6356 /* PREFIX_VEX_0F3A0D */ 6357 { 6358 { Bad_Opcode }, 6359 { Bad_Opcode }, 6360 { "vblendpd", { XM, Vex, EXx, Ib }, 0 }, 6361 }, 6362 6363 /* PREFIX_VEX_0F3A0E */ 6364 { 6365 { Bad_Opcode }, 6366 { Bad_Opcode }, 6367 { "vpblendw", { XM, Vex, EXx, Ib }, 0 }, 6368 }, 6369 6370 /* PREFIX_VEX_0F3A0F */ 6371 { 6372 { Bad_Opcode }, 6373 { Bad_Opcode }, 6374 { "vpalignr", { XM, Vex, EXx, Ib }, 0 }, 6375 }, 6376 6377 /* PREFIX_VEX_0F3A14 */ 6378 { 6379 { Bad_Opcode }, 6380 { Bad_Opcode }, 6381 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) }, 6382 }, 6383 6384 /* PREFIX_VEX_0F3A15 */ 6385 { 6386 { Bad_Opcode }, 6387 { Bad_Opcode }, 6388 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) }, 6389 }, 6390 6391 /* PREFIX_VEX_0F3A16 */ 6392 { 6393 { Bad_Opcode }, 6394 { Bad_Opcode }, 6395 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) }, 6396 }, 6397 6398 /* PREFIX_VEX_0F3A17 */ 6399 { 6400 { Bad_Opcode }, 6401 { Bad_Opcode }, 6402 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) }, 6403 }, 6404 6405 /* PREFIX_VEX_0F3A18 */ 6406 { 6407 { Bad_Opcode }, 6408 { Bad_Opcode }, 6409 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) }, 6410 }, 6411 6412 /* PREFIX_VEX_0F3A19 */ 6413 { 6414 { Bad_Opcode }, 6415 { Bad_Opcode }, 6416 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) }, 6417 }, 6418 6419 /* PREFIX_VEX_0F3A1D */ 6420 { 6421 { Bad_Opcode }, 6422 { Bad_Opcode }, 6423 { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 }, 6424 }, 6425 6426 /* PREFIX_VEX_0F3A20 */ 6427 { 6428 { Bad_Opcode }, 6429 { Bad_Opcode }, 6430 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) }, 6431 }, 6432 6433 /* PREFIX_VEX_0F3A21 */ 6434 { 6435 { Bad_Opcode }, 6436 { Bad_Opcode }, 6437 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) }, 6438 }, 6439 6440 /* PREFIX_VEX_0F3A22 */ 6441 { 6442 { Bad_Opcode }, 6443 { Bad_Opcode }, 6444 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) }, 6445 }, 6446 6447 /* PREFIX_VEX_0F3A30 */ 6448 { 6449 { Bad_Opcode }, 6450 { Bad_Opcode }, 6451 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) }, 6452 }, 6453 6454 /* PREFIX_VEX_0F3A31 */ 6455 { 6456 { Bad_Opcode }, 6457 { Bad_Opcode }, 6458 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) }, 6459 }, 6460 6461 /* PREFIX_VEX_0F3A32 */ 6462 { 6463 { Bad_Opcode }, 6464 { Bad_Opcode }, 6465 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) }, 6466 }, 6467 6468 /* PREFIX_VEX_0F3A33 */ 6469 { 6470 { Bad_Opcode }, 6471 { Bad_Opcode }, 6472 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) }, 6473 }, 6474 6475 /* PREFIX_VEX_0F3A38 */ 6476 { 6477 { Bad_Opcode }, 6478 { Bad_Opcode }, 6479 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) }, 6480 }, 6481 6482 /* PREFIX_VEX_0F3A39 */ 6483 { 6484 { Bad_Opcode }, 6485 { Bad_Opcode }, 6486 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) }, 6487 }, 6488 6489 /* PREFIX_VEX_0F3A40 */ 6490 { 6491 { Bad_Opcode }, 6492 { Bad_Opcode }, 6493 { "vdpps", { XM, Vex, EXx, Ib }, 0 }, 6494 }, 6495 6496 /* PREFIX_VEX_0F3A41 */ 6497 { 6498 { Bad_Opcode }, 6499 { Bad_Opcode }, 6500 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) }, 6501 }, 6502 6503 /* PREFIX_VEX_0F3A42 */ 6504 { 6505 { Bad_Opcode }, 6506 { Bad_Opcode }, 6507 { "vmpsadbw", { XM, Vex, EXx, Ib }, 0 }, 6508 }, 6509 6510 /* PREFIX_VEX_0F3A44 */ 6511 { 6512 { Bad_Opcode }, 6513 { Bad_Opcode }, 6514 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, 0 }, 6515 }, 6516 6517 /* PREFIX_VEX_0F3A46 */ 6518 { 6519 { Bad_Opcode }, 6520 { Bad_Opcode }, 6521 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) }, 6522 }, 6523 6524 /* PREFIX_VEX_0F3A48 */ 6525 { 6526 { Bad_Opcode }, 6527 { Bad_Opcode }, 6528 { VEX_W_TABLE (VEX_W_0F3A48_P_2) }, 6529 }, 6530 6531 /* PREFIX_VEX_0F3A49 */ 6532 { 6533 { Bad_Opcode }, 6534 { Bad_Opcode }, 6535 { VEX_W_TABLE (VEX_W_0F3A49_P_2) }, 6536 }, 6537 6538 /* PREFIX_VEX_0F3A4A */ 6539 { 6540 { Bad_Opcode }, 6541 { Bad_Opcode }, 6542 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) }, 6543 }, 6544 6545 /* PREFIX_VEX_0F3A4B */ 6546 { 6547 { Bad_Opcode }, 6548 { Bad_Opcode }, 6549 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) }, 6550 }, 6551 6552 /* PREFIX_VEX_0F3A4C */ 6553 { 6554 { Bad_Opcode }, 6555 { Bad_Opcode }, 6556 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) }, 6557 }, 6558 6559 /* PREFIX_VEX_0F3A5C */ 6560 { 6561 { Bad_Opcode }, 6562 { Bad_Opcode }, 6563 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6564 }, 6565 6566 /* PREFIX_VEX_0F3A5D */ 6567 { 6568 { Bad_Opcode }, 6569 { Bad_Opcode }, 6570 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6571 }, 6572 6573 /* PREFIX_VEX_0F3A5E */ 6574 { 6575 { Bad_Opcode }, 6576 { Bad_Opcode }, 6577 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6578 }, 6579 6580 /* PREFIX_VEX_0F3A5F */ 6581 { 6582 { Bad_Opcode }, 6583 { Bad_Opcode }, 6584 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6585 }, 6586 6587 /* PREFIX_VEX_0F3A60 */ 6588 { 6589 { Bad_Opcode }, 6590 { Bad_Opcode }, 6591 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) }, 6592 { Bad_Opcode }, 6593 }, 6594 6595 /* PREFIX_VEX_0F3A61 */ 6596 { 6597 { Bad_Opcode }, 6598 { Bad_Opcode }, 6599 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) }, 6600 }, 6601 6602 /* PREFIX_VEX_0F3A62 */ 6603 { 6604 { Bad_Opcode }, 6605 { Bad_Opcode }, 6606 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) }, 6607 }, 6608 6609 /* PREFIX_VEX_0F3A63 */ 6610 { 6611 { Bad_Opcode }, 6612 { Bad_Opcode }, 6613 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) }, 6614 }, 6615 6616 /* PREFIX_VEX_0F3A68 */ 6617 { 6618 { Bad_Opcode }, 6619 { Bad_Opcode }, 6620 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6621 }, 6622 6623 /* PREFIX_VEX_0F3A69 */ 6624 { 6625 { Bad_Opcode }, 6626 { Bad_Opcode }, 6627 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6628 }, 6629 6630 /* PREFIX_VEX_0F3A6A */ 6631 { 6632 { Bad_Opcode }, 6633 { Bad_Opcode }, 6634 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) }, 6635 }, 6636 6637 /* PREFIX_VEX_0F3A6B */ 6638 { 6639 { Bad_Opcode }, 6640 { Bad_Opcode }, 6641 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) }, 6642 }, 6643 6644 /* PREFIX_VEX_0F3A6C */ 6645 { 6646 { Bad_Opcode }, 6647 { Bad_Opcode }, 6648 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6649 }, 6650 6651 /* PREFIX_VEX_0F3A6D */ 6652 { 6653 { Bad_Opcode }, 6654 { Bad_Opcode }, 6655 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6656 }, 6657 6658 /* PREFIX_VEX_0F3A6E */ 6659 { 6660 { Bad_Opcode }, 6661 { Bad_Opcode }, 6662 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) }, 6663 }, 6664 6665 /* PREFIX_VEX_0F3A6F */ 6666 { 6667 { Bad_Opcode }, 6668 { Bad_Opcode }, 6669 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) }, 6670 }, 6671 6672 /* PREFIX_VEX_0F3A78 */ 6673 { 6674 { Bad_Opcode }, 6675 { Bad_Opcode }, 6676 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6677 }, 6678 6679 /* PREFIX_VEX_0F3A79 */ 6680 { 6681 { Bad_Opcode }, 6682 { Bad_Opcode }, 6683 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6684 }, 6685 6686 /* PREFIX_VEX_0F3A7A */ 6687 { 6688 { Bad_Opcode }, 6689 { Bad_Opcode }, 6690 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) }, 6691 }, 6692 6693 /* PREFIX_VEX_0F3A7B */ 6694 { 6695 { Bad_Opcode }, 6696 { Bad_Opcode }, 6697 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) }, 6698 }, 6699 6700 /* PREFIX_VEX_0F3A7C */ 6701 { 6702 { Bad_Opcode }, 6703 { Bad_Opcode }, 6704 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6705 { Bad_Opcode }, 6706 }, 6707 6708 /* PREFIX_VEX_0F3A7D */ 6709 { 6710 { Bad_Opcode }, 6711 { Bad_Opcode }, 6712 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 6713 }, 6714 6715 /* PREFIX_VEX_0F3A7E */ 6716 { 6717 { Bad_Opcode }, 6718 { Bad_Opcode }, 6719 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) }, 6720 }, 6721 6722 /* PREFIX_VEX_0F3A7F */ 6723 { 6724 { Bad_Opcode }, 6725 { Bad_Opcode }, 6726 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) }, 6727 }, 6728 6729 /* PREFIX_VEX_0F3ACE */ 6730 { 6731 { Bad_Opcode }, 6732 { Bad_Opcode }, 6733 { VEX_W_TABLE (VEX_W_0F3ACE_P_2) }, 6734 }, 6735 6736 /* PREFIX_VEX_0F3ACF */ 6737 { 6738 { Bad_Opcode }, 6739 { Bad_Opcode }, 6740 { VEX_W_TABLE (VEX_W_0F3ACF_P_2) }, 6741 }, 6742 6743 /* PREFIX_VEX_0F3ADF */ 6744 { 6745 { Bad_Opcode }, 6746 { Bad_Opcode }, 6747 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) }, 6748 }, 6749 6750 /* PREFIX_VEX_0F3AF0 */ 6751 { 6752 { Bad_Opcode }, 6753 { Bad_Opcode }, 6754 { Bad_Opcode }, 6755 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) }, 6756 }, 6757 6758 #define NEED_PREFIX_TABLE 6759 #include "i386-dis-evex.h" 6760 #undef NEED_PREFIX_TABLE 6761 }; 6762 6763 static const struct dis386 x86_64_table[][2] = { 6764 /* X86_64_06 */ 6765 { 6766 { "pushP", { es }, 0 }, 6767 }, 6768 6769 /* X86_64_07 */ 6770 { 6771 { "popP", { es }, 0 }, 6772 }, 6773 6774 /* X86_64_0D */ 6775 { 6776 { "pushP", { cs }, 0 }, 6777 }, 6778 6779 /* X86_64_16 */ 6780 { 6781 { "pushP", { ss }, 0 }, 6782 }, 6783 6784 /* X86_64_17 */ 6785 { 6786 { "popP", { ss }, 0 }, 6787 }, 6788 6789 /* X86_64_1E */ 6790 { 6791 { "pushP", { ds }, 0 }, 6792 }, 6793 6794 /* X86_64_1F */ 6795 { 6796 { "popP", { ds }, 0 }, 6797 }, 6798 6799 /* X86_64_27 */ 6800 { 6801 { "daa", { XX }, 0 }, 6802 }, 6803 6804 /* X86_64_2F */ 6805 { 6806 { "das", { XX }, 0 }, 6807 }, 6808 6809 /* X86_64_37 */ 6810 { 6811 { "aaa", { XX }, 0 }, 6812 }, 6813 6814 /* X86_64_3F */ 6815 { 6816 { "aas", { XX }, 0 }, 6817 }, 6818 6819 /* X86_64_60 */ 6820 { 6821 { "pushaP", { XX }, 0 }, 6822 }, 6823 6824 /* X86_64_61 */ 6825 { 6826 { "popaP", { XX }, 0 }, 6827 }, 6828 6829 /* X86_64_62 */ 6830 { 6831 { MOD_TABLE (MOD_62_32BIT) }, 6832 { EVEX_TABLE (EVEX_0F) }, 6833 }, 6834 6835 /* X86_64_63 */ 6836 { 6837 { "arpl", { Ew, Gw }, 0 }, 6838 { "movs{lq|xd}", { Gv, Ed }, 0 }, 6839 }, 6840 6841 /* X86_64_6D */ 6842 { 6843 { "ins{R|}", { Yzr, indirDX }, 0 }, 6844 { "ins{G|}", { Yzr, indirDX }, 0 }, 6845 }, 6846 6847 /* X86_64_6F */ 6848 { 6849 { "outs{R|}", { indirDXr, Xz }, 0 }, 6850 { "outs{G|}", { indirDXr, Xz }, 0 }, 6851 }, 6852 6853 /* X86_64_82 */ 6854 { 6855 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */ 6856 { REG_TABLE (REG_80) }, 6857 }, 6858 6859 /* X86_64_9A */ 6860 { 6861 { "Jcall{T|}", { Ap }, 0 }, 6862 }, 6863 6864 /* X86_64_C4 */ 6865 { 6866 { MOD_TABLE (MOD_C4_32BIT) }, 6867 { VEX_C4_TABLE (VEX_0F) }, 6868 }, 6869 6870 /* X86_64_C5 */ 6871 { 6872 { MOD_TABLE (MOD_C5_32BIT) }, 6873 { VEX_C5_TABLE (VEX_0F) }, 6874 }, 6875 6876 /* X86_64_CE */ 6877 { 6878 { "into", { XX }, 0 }, 6879 }, 6880 6881 /* X86_64_D4 */ 6882 { 6883 { "aam", { Ib }, 0 }, 6884 }, 6885 6886 /* X86_64_D5 */ 6887 { 6888 { "aad", { Ib }, 0 }, 6889 }, 6890 6891 /* X86_64_E8 */ 6892 { 6893 { "callP", { Jv, BND }, 0 }, 6894 { "call@", { Jv, BND }, 0 } 6895 }, 6896 6897 /* X86_64_E9 */ 6898 { 6899 { "jmpP", { Jv, BND }, 0 }, 6900 { "jmp@", { Jv, BND }, 0 } 6901 }, 6902 6903 /* X86_64_EA */ 6904 { 6905 { "Jjmp{T|}", { Ap }, 0 }, 6906 }, 6907 6908 /* X86_64_0F01_REG_0 */ 6909 { 6910 { "sgdt{Q|IQ}", { M }, 0 }, 6911 { "sgdt", { M }, 0 }, 6912 }, 6913 6914 /* X86_64_0F01_REG_1 */ 6915 { 6916 { "sidt{Q|IQ}", { M }, 0 }, 6917 { "sidt", { M }, 0 }, 6918 }, 6919 6920 /* X86_64_0F01_REG_2 */ 6921 { 6922 { "lgdt{Q|Q}", { M }, 0 }, 6923 { "lgdt", { M }, 0 }, 6924 }, 6925 6926 /* X86_64_0F01_REG_3 */ 6927 { 6928 { "lidt{Q|Q}", { M }, 0 }, 6929 { "lidt", { M }, 0 }, 6930 }, 6931 }; 6932 6933 static const struct dis386 three_byte_table[][256] = { 6934 6935 /* THREE_BYTE_0F38 */ 6936 { 6937 /* 00 */ 6938 { "pshufb", { MX, EM }, PREFIX_OPCODE }, 6939 { "phaddw", { MX, EM }, PREFIX_OPCODE }, 6940 { "phaddd", { MX, EM }, PREFIX_OPCODE }, 6941 { "phaddsw", { MX, EM }, PREFIX_OPCODE }, 6942 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE }, 6943 { "phsubw", { MX, EM }, PREFIX_OPCODE }, 6944 { "phsubd", { MX, EM }, PREFIX_OPCODE }, 6945 { "phsubsw", { MX, EM }, PREFIX_OPCODE }, 6946 /* 08 */ 6947 { "psignb", { MX, EM }, PREFIX_OPCODE }, 6948 { "psignw", { MX, EM }, PREFIX_OPCODE }, 6949 { "psignd", { MX, EM }, PREFIX_OPCODE }, 6950 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE }, 6951 { Bad_Opcode }, 6952 { Bad_Opcode }, 6953 { Bad_Opcode }, 6954 { Bad_Opcode }, 6955 /* 10 */ 6956 { PREFIX_TABLE (PREFIX_0F3810) }, 6957 { Bad_Opcode }, 6958 { Bad_Opcode }, 6959 { Bad_Opcode }, 6960 { PREFIX_TABLE (PREFIX_0F3814) }, 6961 { PREFIX_TABLE (PREFIX_0F3815) }, 6962 { Bad_Opcode }, 6963 { PREFIX_TABLE (PREFIX_0F3817) }, 6964 /* 18 */ 6965 { Bad_Opcode }, 6966 { Bad_Opcode }, 6967 { Bad_Opcode }, 6968 { Bad_Opcode }, 6969 { "pabsb", { MX, EM }, PREFIX_OPCODE }, 6970 { "pabsw", { MX, EM }, PREFIX_OPCODE }, 6971 { "pabsd", { MX, EM }, PREFIX_OPCODE }, 6972 { Bad_Opcode }, 6973 /* 20 */ 6974 { PREFIX_TABLE (PREFIX_0F3820) }, 6975 { PREFIX_TABLE (PREFIX_0F3821) }, 6976 { PREFIX_TABLE (PREFIX_0F3822) }, 6977 { PREFIX_TABLE (PREFIX_0F3823) }, 6978 { PREFIX_TABLE (PREFIX_0F3824) }, 6979 { PREFIX_TABLE (PREFIX_0F3825) }, 6980 { Bad_Opcode }, 6981 { Bad_Opcode }, 6982 /* 28 */ 6983 { PREFIX_TABLE (PREFIX_0F3828) }, 6984 { PREFIX_TABLE (PREFIX_0F3829) }, 6985 { PREFIX_TABLE (PREFIX_0F382A) }, 6986 { PREFIX_TABLE (PREFIX_0F382B) }, 6987 { Bad_Opcode }, 6988 { Bad_Opcode }, 6989 { Bad_Opcode }, 6990 { Bad_Opcode }, 6991 /* 30 */ 6992 { PREFIX_TABLE (PREFIX_0F3830) }, 6993 { PREFIX_TABLE (PREFIX_0F3831) }, 6994 { PREFIX_TABLE (PREFIX_0F3832) }, 6995 { PREFIX_TABLE (PREFIX_0F3833) }, 6996 { PREFIX_TABLE (PREFIX_0F3834) }, 6997 { PREFIX_TABLE (PREFIX_0F3835) }, 6998 { Bad_Opcode }, 6999 { PREFIX_TABLE (PREFIX_0F3837) }, 7000 /* 38 */ 7001 { PREFIX_TABLE (PREFIX_0F3838) }, 7002 { PREFIX_TABLE (PREFIX_0F3839) }, 7003 { PREFIX_TABLE (PREFIX_0F383A) }, 7004 { PREFIX_TABLE (PREFIX_0F383B) }, 7005 { PREFIX_TABLE (PREFIX_0F383C) }, 7006 { PREFIX_TABLE (PREFIX_0F383D) }, 7007 { PREFIX_TABLE (PREFIX_0F383E) }, 7008 { PREFIX_TABLE (PREFIX_0F383F) }, 7009 /* 40 */ 7010 { PREFIX_TABLE (PREFIX_0F3840) }, 7011 { PREFIX_TABLE (PREFIX_0F3841) }, 7012 { Bad_Opcode }, 7013 { Bad_Opcode }, 7014 { Bad_Opcode }, 7015 { Bad_Opcode }, 7016 { Bad_Opcode }, 7017 { Bad_Opcode }, 7018 /* 48 */ 7019 { Bad_Opcode }, 7020 { Bad_Opcode }, 7021 { Bad_Opcode }, 7022 { Bad_Opcode }, 7023 { Bad_Opcode }, 7024 { Bad_Opcode }, 7025 { Bad_Opcode }, 7026 { Bad_Opcode }, 7027 /* 50 */ 7028 { Bad_Opcode }, 7029 { Bad_Opcode }, 7030 { Bad_Opcode }, 7031 { Bad_Opcode }, 7032 { Bad_Opcode }, 7033 { Bad_Opcode }, 7034 { Bad_Opcode }, 7035 { Bad_Opcode }, 7036 /* 58 */ 7037 { Bad_Opcode }, 7038 { Bad_Opcode }, 7039 { Bad_Opcode }, 7040 { Bad_Opcode }, 7041 { Bad_Opcode }, 7042 { Bad_Opcode }, 7043 { Bad_Opcode }, 7044 { Bad_Opcode }, 7045 /* 60 */ 7046 { Bad_Opcode }, 7047 { Bad_Opcode }, 7048 { Bad_Opcode }, 7049 { Bad_Opcode }, 7050 { Bad_Opcode }, 7051 { Bad_Opcode }, 7052 { Bad_Opcode }, 7053 { Bad_Opcode }, 7054 /* 68 */ 7055 { Bad_Opcode }, 7056 { Bad_Opcode }, 7057 { Bad_Opcode }, 7058 { Bad_Opcode }, 7059 { Bad_Opcode }, 7060 { Bad_Opcode }, 7061 { Bad_Opcode }, 7062 { Bad_Opcode }, 7063 /* 70 */ 7064 { Bad_Opcode }, 7065 { Bad_Opcode }, 7066 { Bad_Opcode }, 7067 { Bad_Opcode }, 7068 { Bad_Opcode }, 7069 { Bad_Opcode }, 7070 { Bad_Opcode }, 7071 { Bad_Opcode }, 7072 /* 78 */ 7073 { Bad_Opcode }, 7074 { Bad_Opcode }, 7075 { Bad_Opcode }, 7076 { Bad_Opcode }, 7077 { Bad_Opcode }, 7078 { Bad_Opcode }, 7079 { Bad_Opcode }, 7080 { Bad_Opcode }, 7081 /* 80 */ 7082 { PREFIX_TABLE (PREFIX_0F3880) }, 7083 { PREFIX_TABLE (PREFIX_0F3881) }, 7084 { PREFIX_TABLE (PREFIX_0F3882) }, 7085 { Bad_Opcode }, 7086 { Bad_Opcode }, 7087 { Bad_Opcode }, 7088 { Bad_Opcode }, 7089 { Bad_Opcode }, 7090 /* 88 */ 7091 { Bad_Opcode }, 7092 { Bad_Opcode }, 7093 { Bad_Opcode }, 7094 { Bad_Opcode }, 7095 { Bad_Opcode }, 7096 { Bad_Opcode }, 7097 { Bad_Opcode }, 7098 { Bad_Opcode }, 7099 /* 90 */ 7100 { Bad_Opcode }, 7101 { Bad_Opcode }, 7102 { Bad_Opcode }, 7103 { Bad_Opcode }, 7104 { Bad_Opcode }, 7105 { Bad_Opcode }, 7106 { Bad_Opcode }, 7107 { Bad_Opcode }, 7108 /* 98 */ 7109 { Bad_Opcode }, 7110 { Bad_Opcode }, 7111 { Bad_Opcode }, 7112 { Bad_Opcode }, 7113 { Bad_Opcode }, 7114 { Bad_Opcode }, 7115 { Bad_Opcode }, 7116 { Bad_Opcode }, 7117 /* a0 */ 7118 { Bad_Opcode }, 7119 { Bad_Opcode }, 7120 { Bad_Opcode }, 7121 { Bad_Opcode }, 7122 { Bad_Opcode }, 7123 { Bad_Opcode }, 7124 { Bad_Opcode }, 7125 { Bad_Opcode }, 7126 /* a8 */ 7127 { Bad_Opcode }, 7128 { Bad_Opcode }, 7129 { Bad_Opcode }, 7130 { Bad_Opcode }, 7131 { Bad_Opcode }, 7132 { Bad_Opcode }, 7133 { Bad_Opcode }, 7134 { Bad_Opcode }, 7135 /* b0 */ 7136 { Bad_Opcode }, 7137 { Bad_Opcode }, 7138 { Bad_Opcode }, 7139 { Bad_Opcode }, 7140 { Bad_Opcode }, 7141 { Bad_Opcode }, 7142 { Bad_Opcode }, 7143 { Bad_Opcode }, 7144 /* b8 */ 7145 { Bad_Opcode }, 7146 { Bad_Opcode }, 7147 { Bad_Opcode }, 7148 { Bad_Opcode }, 7149 { Bad_Opcode }, 7150 { Bad_Opcode }, 7151 { Bad_Opcode }, 7152 { Bad_Opcode }, 7153 /* c0 */ 7154 { Bad_Opcode }, 7155 { Bad_Opcode }, 7156 { Bad_Opcode }, 7157 { Bad_Opcode }, 7158 { Bad_Opcode }, 7159 { Bad_Opcode }, 7160 { Bad_Opcode }, 7161 { Bad_Opcode }, 7162 /* c8 */ 7163 { PREFIX_TABLE (PREFIX_0F38C8) }, 7164 { PREFIX_TABLE (PREFIX_0F38C9) }, 7165 { PREFIX_TABLE (PREFIX_0F38CA) }, 7166 { PREFIX_TABLE (PREFIX_0F38CB) }, 7167 { PREFIX_TABLE (PREFIX_0F38CC) }, 7168 { PREFIX_TABLE (PREFIX_0F38CD) }, 7169 { Bad_Opcode }, 7170 { PREFIX_TABLE (PREFIX_0F38CF) }, 7171 /* d0 */ 7172 { Bad_Opcode }, 7173 { Bad_Opcode }, 7174 { Bad_Opcode }, 7175 { Bad_Opcode }, 7176 { Bad_Opcode }, 7177 { Bad_Opcode }, 7178 { Bad_Opcode }, 7179 { Bad_Opcode }, 7180 /* d8 */ 7181 { Bad_Opcode }, 7182 { Bad_Opcode }, 7183 { Bad_Opcode }, 7184 { PREFIX_TABLE (PREFIX_0F38DB) }, 7185 { PREFIX_TABLE (PREFIX_0F38DC) }, 7186 { PREFIX_TABLE (PREFIX_0F38DD) }, 7187 { PREFIX_TABLE (PREFIX_0F38DE) }, 7188 { PREFIX_TABLE (PREFIX_0F38DF) }, 7189 /* e0 */ 7190 { Bad_Opcode }, 7191 { Bad_Opcode }, 7192 { Bad_Opcode }, 7193 { Bad_Opcode }, 7194 { Bad_Opcode }, 7195 { Bad_Opcode }, 7196 { Bad_Opcode }, 7197 { Bad_Opcode }, 7198 /* e8 */ 7199 { Bad_Opcode }, 7200 { Bad_Opcode }, 7201 { Bad_Opcode }, 7202 { Bad_Opcode }, 7203 { Bad_Opcode }, 7204 { Bad_Opcode }, 7205 { Bad_Opcode }, 7206 { Bad_Opcode }, 7207 /* f0 */ 7208 { PREFIX_TABLE (PREFIX_0F38F0) }, 7209 { PREFIX_TABLE (PREFIX_0F38F1) }, 7210 { Bad_Opcode }, 7211 { Bad_Opcode }, 7212 { Bad_Opcode }, 7213 { PREFIX_TABLE (PREFIX_0F38F5) }, 7214 { PREFIX_TABLE (PREFIX_0F38F6) }, 7215 { Bad_Opcode }, 7216 /* f8 */ 7217 { PREFIX_TABLE (PREFIX_0F38F8) }, 7218 { PREFIX_TABLE (PREFIX_0F38F9) }, 7219 { Bad_Opcode }, 7220 { Bad_Opcode }, 7221 { Bad_Opcode }, 7222 { Bad_Opcode }, 7223 { Bad_Opcode }, 7224 { Bad_Opcode }, 7225 }, 7226 /* THREE_BYTE_0F3A */ 7227 { 7228 /* 00 */ 7229 { Bad_Opcode }, 7230 { Bad_Opcode }, 7231 { Bad_Opcode }, 7232 { Bad_Opcode }, 7233 { Bad_Opcode }, 7234 { Bad_Opcode }, 7235 { Bad_Opcode }, 7236 { Bad_Opcode }, 7237 /* 08 */ 7238 { PREFIX_TABLE (PREFIX_0F3A08) }, 7239 { PREFIX_TABLE (PREFIX_0F3A09) }, 7240 { PREFIX_TABLE (PREFIX_0F3A0A) }, 7241 { PREFIX_TABLE (PREFIX_0F3A0B) }, 7242 { PREFIX_TABLE (PREFIX_0F3A0C) }, 7243 { PREFIX_TABLE (PREFIX_0F3A0D) }, 7244 { PREFIX_TABLE (PREFIX_0F3A0E) }, 7245 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE }, 7246 /* 10 */ 7247 { Bad_Opcode }, 7248 { Bad_Opcode }, 7249 { Bad_Opcode }, 7250 { Bad_Opcode }, 7251 { PREFIX_TABLE (PREFIX_0F3A14) }, 7252 { PREFIX_TABLE (PREFIX_0F3A15) }, 7253 { PREFIX_TABLE (PREFIX_0F3A16) }, 7254 { PREFIX_TABLE (PREFIX_0F3A17) }, 7255 /* 18 */ 7256 { Bad_Opcode }, 7257 { Bad_Opcode }, 7258 { Bad_Opcode }, 7259 { Bad_Opcode }, 7260 { Bad_Opcode }, 7261 { Bad_Opcode }, 7262 { Bad_Opcode }, 7263 { Bad_Opcode }, 7264 /* 20 */ 7265 { PREFIX_TABLE (PREFIX_0F3A20) }, 7266 { PREFIX_TABLE (PREFIX_0F3A21) }, 7267 { PREFIX_TABLE (PREFIX_0F3A22) }, 7268 { Bad_Opcode }, 7269 { Bad_Opcode }, 7270 { Bad_Opcode }, 7271 { Bad_Opcode }, 7272 { Bad_Opcode }, 7273 /* 28 */ 7274 { Bad_Opcode }, 7275 { Bad_Opcode }, 7276 { Bad_Opcode }, 7277 { Bad_Opcode }, 7278 { Bad_Opcode }, 7279 { Bad_Opcode }, 7280 { Bad_Opcode }, 7281 { Bad_Opcode }, 7282 /* 30 */ 7283 { Bad_Opcode }, 7284 { Bad_Opcode }, 7285 { Bad_Opcode }, 7286 { Bad_Opcode }, 7287 { Bad_Opcode }, 7288 { Bad_Opcode }, 7289 { Bad_Opcode }, 7290 { Bad_Opcode }, 7291 /* 38 */ 7292 { Bad_Opcode }, 7293 { Bad_Opcode }, 7294 { Bad_Opcode }, 7295 { Bad_Opcode }, 7296 { Bad_Opcode }, 7297 { Bad_Opcode }, 7298 { Bad_Opcode }, 7299 { Bad_Opcode }, 7300 /* 40 */ 7301 { PREFIX_TABLE (PREFIX_0F3A40) }, 7302 { PREFIX_TABLE (PREFIX_0F3A41) }, 7303 { PREFIX_TABLE (PREFIX_0F3A42) }, 7304 { Bad_Opcode }, 7305 { PREFIX_TABLE (PREFIX_0F3A44) }, 7306 { Bad_Opcode }, 7307 { Bad_Opcode }, 7308 { Bad_Opcode }, 7309 /* 48 */ 7310 { Bad_Opcode }, 7311 { Bad_Opcode }, 7312 { Bad_Opcode }, 7313 { Bad_Opcode }, 7314 { Bad_Opcode }, 7315 { Bad_Opcode }, 7316 { Bad_Opcode }, 7317 { Bad_Opcode }, 7318 /* 50 */ 7319 { Bad_Opcode }, 7320 { Bad_Opcode }, 7321 { Bad_Opcode }, 7322 { Bad_Opcode }, 7323 { Bad_Opcode }, 7324 { Bad_Opcode }, 7325 { Bad_Opcode }, 7326 { Bad_Opcode }, 7327 /* 58 */ 7328 { Bad_Opcode }, 7329 { Bad_Opcode }, 7330 { Bad_Opcode }, 7331 { Bad_Opcode }, 7332 { Bad_Opcode }, 7333 { Bad_Opcode }, 7334 { Bad_Opcode }, 7335 { Bad_Opcode }, 7336 /* 60 */ 7337 { PREFIX_TABLE (PREFIX_0F3A60) }, 7338 { PREFIX_TABLE (PREFIX_0F3A61) }, 7339 { PREFIX_TABLE (PREFIX_0F3A62) }, 7340 { PREFIX_TABLE (PREFIX_0F3A63) }, 7341 { Bad_Opcode }, 7342 { Bad_Opcode }, 7343 { Bad_Opcode }, 7344 { Bad_Opcode }, 7345 /* 68 */ 7346 { Bad_Opcode }, 7347 { Bad_Opcode }, 7348 { Bad_Opcode }, 7349 { Bad_Opcode }, 7350 { Bad_Opcode }, 7351 { Bad_Opcode }, 7352 { Bad_Opcode }, 7353 { Bad_Opcode }, 7354 /* 70 */ 7355 { Bad_Opcode }, 7356 { Bad_Opcode }, 7357 { Bad_Opcode }, 7358 { Bad_Opcode }, 7359 { Bad_Opcode }, 7360 { Bad_Opcode }, 7361 { Bad_Opcode }, 7362 { Bad_Opcode }, 7363 /* 78 */ 7364 { Bad_Opcode }, 7365 { Bad_Opcode }, 7366 { Bad_Opcode }, 7367 { Bad_Opcode }, 7368 { Bad_Opcode }, 7369 { Bad_Opcode }, 7370 { Bad_Opcode }, 7371 { Bad_Opcode }, 7372 /* 80 */ 7373 { Bad_Opcode }, 7374 { Bad_Opcode }, 7375 { Bad_Opcode }, 7376 { Bad_Opcode }, 7377 { Bad_Opcode }, 7378 { Bad_Opcode }, 7379 { Bad_Opcode }, 7380 { Bad_Opcode }, 7381 /* 88 */ 7382 { Bad_Opcode }, 7383 { Bad_Opcode }, 7384 { Bad_Opcode }, 7385 { Bad_Opcode }, 7386 { Bad_Opcode }, 7387 { Bad_Opcode }, 7388 { Bad_Opcode }, 7389 { Bad_Opcode }, 7390 /* 90 */ 7391 { Bad_Opcode }, 7392 { Bad_Opcode }, 7393 { Bad_Opcode }, 7394 { Bad_Opcode }, 7395 { Bad_Opcode }, 7396 { Bad_Opcode }, 7397 { Bad_Opcode }, 7398 { Bad_Opcode }, 7399 /* 98 */ 7400 { Bad_Opcode }, 7401 { Bad_Opcode }, 7402 { Bad_Opcode }, 7403 { Bad_Opcode }, 7404 { Bad_Opcode }, 7405 { Bad_Opcode }, 7406 { Bad_Opcode }, 7407 { Bad_Opcode }, 7408 /* a0 */ 7409 { Bad_Opcode }, 7410 { Bad_Opcode }, 7411 { Bad_Opcode }, 7412 { Bad_Opcode }, 7413 { Bad_Opcode }, 7414 { Bad_Opcode }, 7415 { Bad_Opcode }, 7416 { Bad_Opcode }, 7417 /* a8 */ 7418 { Bad_Opcode }, 7419 { Bad_Opcode }, 7420 { Bad_Opcode }, 7421 { Bad_Opcode }, 7422 { Bad_Opcode }, 7423 { Bad_Opcode }, 7424 { Bad_Opcode }, 7425 { Bad_Opcode }, 7426 /* b0 */ 7427 { Bad_Opcode }, 7428 { Bad_Opcode }, 7429 { Bad_Opcode }, 7430 { Bad_Opcode }, 7431 { Bad_Opcode }, 7432 { Bad_Opcode }, 7433 { Bad_Opcode }, 7434 { Bad_Opcode }, 7435 /* b8 */ 7436 { Bad_Opcode }, 7437 { Bad_Opcode }, 7438 { Bad_Opcode }, 7439 { Bad_Opcode }, 7440 { Bad_Opcode }, 7441 { Bad_Opcode }, 7442 { Bad_Opcode }, 7443 { Bad_Opcode }, 7444 /* c0 */ 7445 { Bad_Opcode }, 7446 { Bad_Opcode }, 7447 { Bad_Opcode }, 7448 { Bad_Opcode }, 7449 { Bad_Opcode }, 7450 { Bad_Opcode }, 7451 { Bad_Opcode }, 7452 { Bad_Opcode }, 7453 /* c8 */ 7454 { Bad_Opcode }, 7455 { Bad_Opcode }, 7456 { Bad_Opcode }, 7457 { Bad_Opcode }, 7458 { PREFIX_TABLE (PREFIX_0F3ACC) }, 7459 { Bad_Opcode }, 7460 { PREFIX_TABLE (PREFIX_0F3ACE) }, 7461 { PREFIX_TABLE (PREFIX_0F3ACF) }, 7462 /* d0 */ 7463 { Bad_Opcode }, 7464 { Bad_Opcode }, 7465 { Bad_Opcode }, 7466 { Bad_Opcode }, 7467 { Bad_Opcode }, 7468 { Bad_Opcode }, 7469 { Bad_Opcode }, 7470 { Bad_Opcode }, 7471 /* d8 */ 7472 { Bad_Opcode }, 7473 { Bad_Opcode }, 7474 { Bad_Opcode }, 7475 { Bad_Opcode }, 7476 { Bad_Opcode }, 7477 { Bad_Opcode }, 7478 { Bad_Opcode }, 7479 { PREFIX_TABLE (PREFIX_0F3ADF) }, 7480 /* e0 */ 7481 { Bad_Opcode }, 7482 { Bad_Opcode }, 7483 { Bad_Opcode }, 7484 { Bad_Opcode }, 7485 { Bad_Opcode }, 7486 { Bad_Opcode }, 7487 { Bad_Opcode }, 7488 { Bad_Opcode }, 7489 /* e8 */ 7490 { Bad_Opcode }, 7491 { Bad_Opcode }, 7492 { Bad_Opcode }, 7493 { Bad_Opcode }, 7494 { Bad_Opcode }, 7495 { Bad_Opcode }, 7496 { Bad_Opcode }, 7497 { Bad_Opcode }, 7498 /* f0 */ 7499 { Bad_Opcode }, 7500 { Bad_Opcode }, 7501 { Bad_Opcode }, 7502 { Bad_Opcode }, 7503 { Bad_Opcode }, 7504 { Bad_Opcode }, 7505 { Bad_Opcode }, 7506 { Bad_Opcode }, 7507 /* f8 */ 7508 { Bad_Opcode }, 7509 { Bad_Opcode }, 7510 { Bad_Opcode }, 7511 { Bad_Opcode }, 7512 { Bad_Opcode }, 7513 { Bad_Opcode }, 7514 { Bad_Opcode }, 7515 { Bad_Opcode }, 7516 }, 7517 }; 7518 7519 static const struct dis386 xop_table[][256] = { 7520 /* XOP_08 */ 7521 { 7522 /* 00 */ 7523 { Bad_Opcode }, 7524 { Bad_Opcode }, 7525 { Bad_Opcode }, 7526 { Bad_Opcode }, 7527 { Bad_Opcode }, 7528 { Bad_Opcode }, 7529 { Bad_Opcode }, 7530 { Bad_Opcode }, 7531 /* 08 */ 7532 { Bad_Opcode }, 7533 { Bad_Opcode }, 7534 { Bad_Opcode }, 7535 { Bad_Opcode }, 7536 { Bad_Opcode }, 7537 { Bad_Opcode }, 7538 { Bad_Opcode }, 7539 { Bad_Opcode }, 7540 /* 10 */ 7541 { Bad_Opcode }, 7542 { Bad_Opcode }, 7543 { Bad_Opcode }, 7544 { Bad_Opcode }, 7545 { Bad_Opcode }, 7546 { Bad_Opcode }, 7547 { Bad_Opcode }, 7548 { Bad_Opcode }, 7549 /* 18 */ 7550 { Bad_Opcode }, 7551 { Bad_Opcode }, 7552 { Bad_Opcode }, 7553 { Bad_Opcode }, 7554 { Bad_Opcode }, 7555 { Bad_Opcode }, 7556 { Bad_Opcode }, 7557 { Bad_Opcode }, 7558 /* 20 */ 7559 { Bad_Opcode }, 7560 { Bad_Opcode }, 7561 { Bad_Opcode }, 7562 { Bad_Opcode }, 7563 { Bad_Opcode }, 7564 { Bad_Opcode }, 7565 { Bad_Opcode }, 7566 { Bad_Opcode }, 7567 /* 28 */ 7568 { Bad_Opcode }, 7569 { Bad_Opcode }, 7570 { Bad_Opcode }, 7571 { Bad_Opcode }, 7572 { Bad_Opcode }, 7573 { Bad_Opcode }, 7574 { Bad_Opcode }, 7575 { Bad_Opcode }, 7576 /* 30 */ 7577 { Bad_Opcode }, 7578 { Bad_Opcode }, 7579 { Bad_Opcode }, 7580 { Bad_Opcode }, 7581 { Bad_Opcode }, 7582 { Bad_Opcode }, 7583 { Bad_Opcode }, 7584 { Bad_Opcode }, 7585 /* 38 */ 7586 { Bad_Opcode }, 7587 { Bad_Opcode }, 7588 { Bad_Opcode }, 7589 { Bad_Opcode }, 7590 { Bad_Opcode }, 7591 { Bad_Opcode }, 7592 { Bad_Opcode }, 7593 { Bad_Opcode }, 7594 /* 40 */ 7595 { Bad_Opcode }, 7596 { Bad_Opcode }, 7597 { Bad_Opcode }, 7598 { Bad_Opcode }, 7599 { Bad_Opcode }, 7600 { Bad_Opcode }, 7601 { Bad_Opcode }, 7602 { Bad_Opcode }, 7603 /* 48 */ 7604 { Bad_Opcode }, 7605 { Bad_Opcode }, 7606 { Bad_Opcode }, 7607 { Bad_Opcode }, 7608 { Bad_Opcode }, 7609 { Bad_Opcode }, 7610 { Bad_Opcode }, 7611 { Bad_Opcode }, 7612 /* 50 */ 7613 { Bad_Opcode }, 7614 { Bad_Opcode }, 7615 { Bad_Opcode }, 7616 { Bad_Opcode }, 7617 { Bad_Opcode }, 7618 { Bad_Opcode }, 7619 { Bad_Opcode }, 7620 { Bad_Opcode }, 7621 /* 58 */ 7622 { Bad_Opcode }, 7623 { Bad_Opcode }, 7624 { Bad_Opcode }, 7625 { Bad_Opcode }, 7626 { Bad_Opcode }, 7627 { Bad_Opcode }, 7628 { Bad_Opcode }, 7629 { Bad_Opcode }, 7630 /* 60 */ 7631 { Bad_Opcode }, 7632 { Bad_Opcode }, 7633 { Bad_Opcode }, 7634 { Bad_Opcode }, 7635 { Bad_Opcode }, 7636 { Bad_Opcode }, 7637 { Bad_Opcode }, 7638 { Bad_Opcode }, 7639 /* 68 */ 7640 { Bad_Opcode }, 7641 { Bad_Opcode }, 7642 { Bad_Opcode }, 7643 { Bad_Opcode }, 7644 { Bad_Opcode }, 7645 { Bad_Opcode }, 7646 { Bad_Opcode }, 7647 { Bad_Opcode }, 7648 /* 70 */ 7649 { Bad_Opcode }, 7650 { Bad_Opcode }, 7651 { Bad_Opcode }, 7652 { Bad_Opcode }, 7653 { Bad_Opcode }, 7654 { Bad_Opcode }, 7655 { Bad_Opcode }, 7656 { Bad_Opcode }, 7657 /* 78 */ 7658 { Bad_Opcode }, 7659 { Bad_Opcode }, 7660 { Bad_Opcode }, 7661 { Bad_Opcode }, 7662 { Bad_Opcode }, 7663 { Bad_Opcode }, 7664 { Bad_Opcode }, 7665 { Bad_Opcode }, 7666 /* 80 */ 7667 { Bad_Opcode }, 7668 { Bad_Opcode }, 7669 { Bad_Opcode }, 7670 { Bad_Opcode }, 7671 { Bad_Opcode }, 7672 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7673 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7674 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7675 /* 88 */ 7676 { Bad_Opcode }, 7677 { Bad_Opcode }, 7678 { Bad_Opcode }, 7679 { Bad_Opcode }, 7680 { Bad_Opcode }, 7681 { Bad_Opcode }, 7682 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7683 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7684 /* 90 */ 7685 { Bad_Opcode }, 7686 { Bad_Opcode }, 7687 { Bad_Opcode }, 7688 { Bad_Opcode }, 7689 { Bad_Opcode }, 7690 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7691 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7692 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7693 /* 98 */ 7694 { Bad_Opcode }, 7695 { Bad_Opcode }, 7696 { Bad_Opcode }, 7697 { Bad_Opcode }, 7698 { Bad_Opcode }, 7699 { Bad_Opcode }, 7700 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7701 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7702 /* a0 */ 7703 { Bad_Opcode }, 7704 { Bad_Opcode }, 7705 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7706 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7707 { Bad_Opcode }, 7708 { Bad_Opcode }, 7709 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7710 { Bad_Opcode }, 7711 /* a8 */ 7712 { Bad_Opcode }, 7713 { Bad_Opcode }, 7714 { Bad_Opcode }, 7715 { Bad_Opcode }, 7716 { Bad_Opcode }, 7717 { Bad_Opcode }, 7718 { Bad_Opcode }, 7719 { Bad_Opcode }, 7720 /* b0 */ 7721 { Bad_Opcode }, 7722 { Bad_Opcode }, 7723 { Bad_Opcode }, 7724 { Bad_Opcode }, 7725 { Bad_Opcode }, 7726 { Bad_Opcode }, 7727 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 }, 7728 { Bad_Opcode }, 7729 /* b8 */ 7730 { Bad_Opcode }, 7731 { Bad_Opcode }, 7732 { Bad_Opcode }, 7733 { Bad_Opcode }, 7734 { Bad_Opcode }, 7735 { Bad_Opcode }, 7736 { Bad_Opcode }, 7737 { Bad_Opcode }, 7738 /* c0 */ 7739 { "vprotb", { XM, Vex_2src_1, Ib }, 0 }, 7740 { "vprotw", { XM, Vex_2src_1, Ib }, 0 }, 7741 { "vprotd", { XM, Vex_2src_1, Ib }, 0 }, 7742 { "vprotq", { XM, Vex_2src_1, Ib }, 0 }, 7743 { Bad_Opcode }, 7744 { Bad_Opcode }, 7745 { Bad_Opcode }, 7746 { Bad_Opcode }, 7747 /* c8 */ 7748 { Bad_Opcode }, 7749 { Bad_Opcode }, 7750 { Bad_Opcode }, 7751 { Bad_Opcode }, 7752 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) }, 7753 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) }, 7754 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) }, 7755 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) }, 7756 /* d0 */ 7757 { Bad_Opcode }, 7758 { Bad_Opcode }, 7759 { Bad_Opcode }, 7760 { Bad_Opcode }, 7761 { Bad_Opcode }, 7762 { Bad_Opcode }, 7763 { Bad_Opcode }, 7764 { Bad_Opcode }, 7765 /* d8 */ 7766 { Bad_Opcode }, 7767 { Bad_Opcode }, 7768 { Bad_Opcode }, 7769 { Bad_Opcode }, 7770 { Bad_Opcode }, 7771 { Bad_Opcode }, 7772 { Bad_Opcode }, 7773 { Bad_Opcode }, 7774 /* e0 */ 7775 { Bad_Opcode }, 7776 { Bad_Opcode }, 7777 { Bad_Opcode }, 7778 { Bad_Opcode }, 7779 { Bad_Opcode }, 7780 { Bad_Opcode }, 7781 { Bad_Opcode }, 7782 { Bad_Opcode }, 7783 /* e8 */ 7784 { Bad_Opcode }, 7785 { Bad_Opcode }, 7786 { Bad_Opcode }, 7787 { Bad_Opcode }, 7788 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) }, 7789 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) }, 7790 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) }, 7791 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) }, 7792 /* f0 */ 7793 { Bad_Opcode }, 7794 { Bad_Opcode }, 7795 { Bad_Opcode }, 7796 { Bad_Opcode }, 7797 { Bad_Opcode }, 7798 { Bad_Opcode }, 7799 { Bad_Opcode }, 7800 { Bad_Opcode }, 7801 /* f8 */ 7802 { Bad_Opcode }, 7803 { Bad_Opcode }, 7804 { Bad_Opcode }, 7805 { Bad_Opcode }, 7806 { Bad_Opcode }, 7807 { Bad_Opcode }, 7808 { Bad_Opcode }, 7809 { Bad_Opcode }, 7810 }, 7811 /* XOP_09 */ 7812 { 7813 /* 00 */ 7814 { Bad_Opcode }, 7815 { REG_TABLE (REG_XOP_TBM_01) }, 7816 { REG_TABLE (REG_XOP_TBM_02) }, 7817 { Bad_Opcode }, 7818 { Bad_Opcode }, 7819 { Bad_Opcode }, 7820 { Bad_Opcode }, 7821 { Bad_Opcode }, 7822 /* 08 */ 7823 { Bad_Opcode }, 7824 { Bad_Opcode }, 7825 { Bad_Opcode }, 7826 { Bad_Opcode }, 7827 { Bad_Opcode }, 7828 { Bad_Opcode }, 7829 { Bad_Opcode }, 7830 { Bad_Opcode }, 7831 /* 10 */ 7832 { Bad_Opcode }, 7833 { Bad_Opcode }, 7834 { REG_TABLE (REG_XOP_LWPCB) }, 7835 { Bad_Opcode }, 7836 { Bad_Opcode }, 7837 { Bad_Opcode }, 7838 { Bad_Opcode }, 7839 { Bad_Opcode }, 7840 /* 18 */ 7841 { Bad_Opcode }, 7842 { Bad_Opcode }, 7843 { Bad_Opcode }, 7844 { Bad_Opcode }, 7845 { Bad_Opcode }, 7846 { Bad_Opcode }, 7847 { Bad_Opcode }, 7848 { Bad_Opcode }, 7849 /* 20 */ 7850 { Bad_Opcode }, 7851 { Bad_Opcode }, 7852 { Bad_Opcode }, 7853 { Bad_Opcode }, 7854 { Bad_Opcode }, 7855 { Bad_Opcode }, 7856 { Bad_Opcode }, 7857 { Bad_Opcode }, 7858 /* 28 */ 7859 { Bad_Opcode }, 7860 { Bad_Opcode }, 7861 { Bad_Opcode }, 7862 { Bad_Opcode }, 7863 { Bad_Opcode }, 7864 { Bad_Opcode }, 7865 { Bad_Opcode }, 7866 { Bad_Opcode }, 7867 /* 30 */ 7868 { Bad_Opcode }, 7869 { Bad_Opcode }, 7870 { Bad_Opcode }, 7871 { Bad_Opcode }, 7872 { Bad_Opcode }, 7873 { Bad_Opcode }, 7874 { Bad_Opcode }, 7875 { Bad_Opcode }, 7876 /* 38 */ 7877 { Bad_Opcode }, 7878 { Bad_Opcode }, 7879 { Bad_Opcode }, 7880 { Bad_Opcode }, 7881 { Bad_Opcode }, 7882 { Bad_Opcode }, 7883 { Bad_Opcode }, 7884 { Bad_Opcode }, 7885 /* 40 */ 7886 { Bad_Opcode }, 7887 { Bad_Opcode }, 7888 { Bad_Opcode }, 7889 { Bad_Opcode }, 7890 { Bad_Opcode }, 7891 { Bad_Opcode }, 7892 { Bad_Opcode }, 7893 { Bad_Opcode }, 7894 /* 48 */ 7895 { Bad_Opcode }, 7896 { Bad_Opcode }, 7897 { Bad_Opcode }, 7898 { Bad_Opcode }, 7899 { Bad_Opcode }, 7900 { Bad_Opcode }, 7901 { Bad_Opcode }, 7902 { Bad_Opcode }, 7903 /* 50 */ 7904 { Bad_Opcode }, 7905 { Bad_Opcode }, 7906 { Bad_Opcode }, 7907 { Bad_Opcode }, 7908 { Bad_Opcode }, 7909 { Bad_Opcode }, 7910 { Bad_Opcode }, 7911 { Bad_Opcode }, 7912 /* 58 */ 7913 { Bad_Opcode }, 7914 { Bad_Opcode }, 7915 { Bad_Opcode }, 7916 { Bad_Opcode }, 7917 { Bad_Opcode }, 7918 { Bad_Opcode }, 7919 { Bad_Opcode }, 7920 { Bad_Opcode }, 7921 /* 60 */ 7922 { Bad_Opcode }, 7923 { Bad_Opcode }, 7924 { Bad_Opcode }, 7925 { Bad_Opcode }, 7926 { Bad_Opcode }, 7927 { Bad_Opcode }, 7928 { Bad_Opcode }, 7929 { Bad_Opcode }, 7930 /* 68 */ 7931 { Bad_Opcode }, 7932 { Bad_Opcode }, 7933 { Bad_Opcode }, 7934 { Bad_Opcode }, 7935 { Bad_Opcode }, 7936 { Bad_Opcode }, 7937 { Bad_Opcode }, 7938 { Bad_Opcode }, 7939 /* 70 */ 7940 { Bad_Opcode }, 7941 { Bad_Opcode }, 7942 { Bad_Opcode }, 7943 { Bad_Opcode }, 7944 { Bad_Opcode }, 7945 { Bad_Opcode }, 7946 { Bad_Opcode }, 7947 { Bad_Opcode }, 7948 /* 78 */ 7949 { Bad_Opcode }, 7950 { Bad_Opcode }, 7951 { Bad_Opcode }, 7952 { Bad_Opcode }, 7953 { Bad_Opcode }, 7954 { Bad_Opcode }, 7955 { Bad_Opcode }, 7956 { Bad_Opcode }, 7957 /* 80 */ 7958 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) }, 7959 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) }, 7960 { "vfrczss", { XM, EXd }, 0 }, 7961 { "vfrczsd", { XM, EXq }, 0 }, 7962 { Bad_Opcode }, 7963 { Bad_Opcode }, 7964 { Bad_Opcode }, 7965 { Bad_Opcode }, 7966 /* 88 */ 7967 { Bad_Opcode }, 7968 { Bad_Opcode }, 7969 { Bad_Opcode }, 7970 { Bad_Opcode }, 7971 { Bad_Opcode }, 7972 { Bad_Opcode }, 7973 { Bad_Opcode }, 7974 { Bad_Opcode }, 7975 /* 90 */ 7976 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7977 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7978 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7979 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7980 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7981 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7982 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7983 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7984 /* 98 */ 7985 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7986 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7987 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7988 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 }, 0 }, 7989 { Bad_Opcode }, 7990 { Bad_Opcode }, 7991 { Bad_Opcode }, 7992 { Bad_Opcode }, 7993 /* a0 */ 7994 { Bad_Opcode }, 7995 { Bad_Opcode }, 7996 { Bad_Opcode }, 7997 { Bad_Opcode }, 7998 { Bad_Opcode }, 7999 { Bad_Opcode }, 8000 { Bad_Opcode }, 8001 { Bad_Opcode }, 8002 /* a8 */ 8003 { Bad_Opcode }, 8004 { Bad_Opcode }, 8005 { Bad_Opcode }, 8006 { Bad_Opcode }, 8007 { Bad_Opcode }, 8008 { Bad_Opcode }, 8009 { Bad_Opcode }, 8010 { Bad_Opcode }, 8011 /* b0 */ 8012 { Bad_Opcode }, 8013 { Bad_Opcode }, 8014 { Bad_Opcode }, 8015 { Bad_Opcode }, 8016 { Bad_Opcode }, 8017 { Bad_Opcode }, 8018 { Bad_Opcode }, 8019 { Bad_Opcode }, 8020 /* b8 */ 8021 { Bad_Opcode }, 8022 { Bad_Opcode }, 8023 { Bad_Opcode }, 8024 { Bad_Opcode }, 8025 { Bad_Opcode }, 8026 { Bad_Opcode }, 8027 { Bad_Opcode }, 8028 { Bad_Opcode }, 8029 /* c0 */ 8030 { Bad_Opcode }, 8031 { "vphaddbw", { XM, EXxmm }, 0 }, 8032 { "vphaddbd", { XM, EXxmm }, 0 }, 8033 { "vphaddbq", { XM, EXxmm }, 0 }, 8034 { Bad_Opcode }, 8035 { Bad_Opcode }, 8036 { "vphaddwd", { XM, EXxmm }, 0 }, 8037 { "vphaddwq", { XM, EXxmm }, 0 }, 8038 /* c8 */ 8039 { Bad_Opcode }, 8040 { Bad_Opcode }, 8041 { Bad_Opcode }, 8042 { "vphadddq", { XM, EXxmm }, 0 }, 8043 { Bad_Opcode }, 8044 { Bad_Opcode }, 8045 { Bad_Opcode }, 8046 { Bad_Opcode }, 8047 /* d0 */ 8048 { Bad_Opcode }, 8049 { "vphaddubw", { XM, EXxmm }, 0 }, 8050 { "vphaddubd", { XM, EXxmm }, 0 }, 8051 { "vphaddubq", { XM, EXxmm }, 0 }, 8052 { Bad_Opcode }, 8053 { Bad_Opcode }, 8054 { "vphadduwd", { XM, EXxmm }, 0 }, 8055 { "vphadduwq", { XM, EXxmm }, 0 }, 8056 /* d8 */ 8057 { Bad_Opcode }, 8058 { Bad_Opcode }, 8059 { Bad_Opcode }, 8060 { "vphaddudq", { XM, EXxmm }, 0 }, 8061 { Bad_Opcode }, 8062 { Bad_Opcode }, 8063 { Bad_Opcode }, 8064 { Bad_Opcode }, 8065 /* e0 */ 8066 { Bad_Opcode }, 8067 { "vphsubbw", { XM, EXxmm }, 0 }, 8068 { "vphsubwd", { XM, EXxmm }, 0 }, 8069 { "vphsubdq", { XM, EXxmm }, 0 }, 8070 { Bad_Opcode }, 8071 { Bad_Opcode }, 8072 { Bad_Opcode }, 8073 { Bad_Opcode }, 8074 /* e8 */ 8075 { Bad_Opcode }, 8076 { Bad_Opcode }, 8077 { Bad_Opcode }, 8078 { Bad_Opcode }, 8079 { Bad_Opcode }, 8080 { Bad_Opcode }, 8081 { Bad_Opcode }, 8082 { Bad_Opcode }, 8083 /* f0 */ 8084 { Bad_Opcode }, 8085 { Bad_Opcode }, 8086 { Bad_Opcode }, 8087 { Bad_Opcode }, 8088 { Bad_Opcode }, 8089 { Bad_Opcode }, 8090 { Bad_Opcode }, 8091 { Bad_Opcode }, 8092 /* f8 */ 8093 { Bad_Opcode }, 8094 { Bad_Opcode }, 8095 { Bad_Opcode }, 8096 { Bad_Opcode }, 8097 { Bad_Opcode }, 8098 { Bad_Opcode }, 8099 { Bad_Opcode }, 8100 { Bad_Opcode }, 8101 }, 8102 /* XOP_0A */ 8103 { 8104 /* 00 */ 8105 { Bad_Opcode }, 8106 { Bad_Opcode }, 8107 { Bad_Opcode }, 8108 { Bad_Opcode }, 8109 { Bad_Opcode }, 8110 { Bad_Opcode }, 8111 { Bad_Opcode }, 8112 { Bad_Opcode }, 8113 /* 08 */ 8114 { Bad_Opcode }, 8115 { Bad_Opcode }, 8116 { Bad_Opcode }, 8117 { Bad_Opcode }, 8118 { Bad_Opcode }, 8119 { Bad_Opcode }, 8120 { Bad_Opcode }, 8121 { Bad_Opcode }, 8122 /* 10 */ 8123 { "bextr", { Gv, Ev, Iq }, 0 }, 8124 { Bad_Opcode }, 8125 { REG_TABLE (REG_XOP_LWP) }, 8126 { Bad_Opcode }, 8127 { Bad_Opcode }, 8128 { Bad_Opcode }, 8129 { Bad_Opcode }, 8130 { Bad_Opcode }, 8131 /* 18 */ 8132 { Bad_Opcode }, 8133 { Bad_Opcode }, 8134 { Bad_Opcode }, 8135 { Bad_Opcode }, 8136 { Bad_Opcode }, 8137 { Bad_Opcode }, 8138 { Bad_Opcode }, 8139 { Bad_Opcode }, 8140 /* 20 */ 8141 { Bad_Opcode }, 8142 { Bad_Opcode }, 8143 { Bad_Opcode }, 8144 { Bad_Opcode }, 8145 { Bad_Opcode }, 8146 { Bad_Opcode }, 8147 { Bad_Opcode }, 8148 { Bad_Opcode }, 8149 /* 28 */ 8150 { Bad_Opcode }, 8151 { Bad_Opcode }, 8152 { Bad_Opcode }, 8153 { Bad_Opcode }, 8154 { Bad_Opcode }, 8155 { Bad_Opcode }, 8156 { Bad_Opcode }, 8157 { Bad_Opcode }, 8158 /* 30 */ 8159 { Bad_Opcode }, 8160 { Bad_Opcode }, 8161 { Bad_Opcode }, 8162 { Bad_Opcode }, 8163 { Bad_Opcode }, 8164 { Bad_Opcode }, 8165 { Bad_Opcode }, 8166 { Bad_Opcode }, 8167 /* 38 */ 8168 { Bad_Opcode }, 8169 { Bad_Opcode }, 8170 { Bad_Opcode }, 8171 { Bad_Opcode }, 8172 { Bad_Opcode }, 8173 { Bad_Opcode }, 8174 { Bad_Opcode }, 8175 { Bad_Opcode }, 8176 /* 40 */ 8177 { Bad_Opcode }, 8178 { Bad_Opcode }, 8179 { Bad_Opcode }, 8180 { Bad_Opcode }, 8181 { Bad_Opcode }, 8182 { Bad_Opcode }, 8183 { Bad_Opcode }, 8184 { Bad_Opcode }, 8185 /* 48 */ 8186 { Bad_Opcode }, 8187 { Bad_Opcode }, 8188 { Bad_Opcode }, 8189 { Bad_Opcode }, 8190 { Bad_Opcode }, 8191 { Bad_Opcode }, 8192 { Bad_Opcode }, 8193 { Bad_Opcode }, 8194 /* 50 */ 8195 { Bad_Opcode }, 8196 { Bad_Opcode }, 8197 { Bad_Opcode }, 8198 { Bad_Opcode }, 8199 { Bad_Opcode }, 8200 { Bad_Opcode }, 8201 { Bad_Opcode }, 8202 { Bad_Opcode }, 8203 /* 58 */ 8204 { Bad_Opcode }, 8205 { Bad_Opcode }, 8206 { Bad_Opcode }, 8207 { Bad_Opcode }, 8208 { Bad_Opcode }, 8209 { Bad_Opcode }, 8210 { Bad_Opcode }, 8211 { Bad_Opcode }, 8212 /* 60 */ 8213 { Bad_Opcode }, 8214 { Bad_Opcode }, 8215 { Bad_Opcode }, 8216 { Bad_Opcode }, 8217 { Bad_Opcode }, 8218 { Bad_Opcode }, 8219 { Bad_Opcode }, 8220 { Bad_Opcode }, 8221 /* 68 */ 8222 { Bad_Opcode }, 8223 { Bad_Opcode }, 8224 { Bad_Opcode }, 8225 { Bad_Opcode }, 8226 { Bad_Opcode }, 8227 { Bad_Opcode }, 8228 { Bad_Opcode }, 8229 { Bad_Opcode }, 8230 /* 70 */ 8231 { Bad_Opcode }, 8232 { Bad_Opcode }, 8233 { Bad_Opcode }, 8234 { Bad_Opcode }, 8235 { Bad_Opcode }, 8236 { Bad_Opcode }, 8237 { Bad_Opcode }, 8238 { Bad_Opcode }, 8239 /* 78 */ 8240 { Bad_Opcode }, 8241 { Bad_Opcode }, 8242 { Bad_Opcode }, 8243 { Bad_Opcode }, 8244 { Bad_Opcode }, 8245 { Bad_Opcode }, 8246 { Bad_Opcode }, 8247 { Bad_Opcode }, 8248 /* 80 */ 8249 { Bad_Opcode }, 8250 { Bad_Opcode }, 8251 { Bad_Opcode }, 8252 { Bad_Opcode }, 8253 { Bad_Opcode }, 8254 { Bad_Opcode }, 8255 { Bad_Opcode }, 8256 { Bad_Opcode }, 8257 /* 88 */ 8258 { Bad_Opcode }, 8259 { Bad_Opcode }, 8260 { Bad_Opcode }, 8261 { Bad_Opcode }, 8262 { Bad_Opcode }, 8263 { Bad_Opcode }, 8264 { Bad_Opcode }, 8265 { Bad_Opcode }, 8266 /* 90 */ 8267 { Bad_Opcode }, 8268 { Bad_Opcode }, 8269 { Bad_Opcode }, 8270 { Bad_Opcode }, 8271 { Bad_Opcode }, 8272 { Bad_Opcode }, 8273 { Bad_Opcode }, 8274 { Bad_Opcode }, 8275 /* 98 */ 8276 { Bad_Opcode }, 8277 { Bad_Opcode }, 8278 { Bad_Opcode }, 8279 { Bad_Opcode }, 8280 { Bad_Opcode }, 8281 { Bad_Opcode }, 8282 { Bad_Opcode }, 8283 { Bad_Opcode }, 8284 /* a0 */ 8285 { Bad_Opcode }, 8286 { Bad_Opcode }, 8287 { Bad_Opcode }, 8288 { Bad_Opcode }, 8289 { Bad_Opcode }, 8290 { Bad_Opcode }, 8291 { Bad_Opcode }, 8292 { Bad_Opcode }, 8293 /* a8 */ 8294 { Bad_Opcode }, 8295 { Bad_Opcode }, 8296 { Bad_Opcode }, 8297 { Bad_Opcode }, 8298 { Bad_Opcode }, 8299 { Bad_Opcode }, 8300 { Bad_Opcode }, 8301 { Bad_Opcode }, 8302 /* b0 */ 8303 { Bad_Opcode }, 8304 { Bad_Opcode }, 8305 { Bad_Opcode }, 8306 { Bad_Opcode }, 8307 { Bad_Opcode }, 8308 { Bad_Opcode }, 8309 { Bad_Opcode }, 8310 { Bad_Opcode }, 8311 /* b8 */ 8312 { Bad_Opcode }, 8313 { Bad_Opcode }, 8314 { Bad_Opcode }, 8315 { Bad_Opcode }, 8316 { Bad_Opcode }, 8317 { Bad_Opcode }, 8318 { Bad_Opcode }, 8319 { Bad_Opcode }, 8320 /* c0 */ 8321 { Bad_Opcode }, 8322 { Bad_Opcode }, 8323 { Bad_Opcode }, 8324 { Bad_Opcode }, 8325 { Bad_Opcode }, 8326 { Bad_Opcode }, 8327 { Bad_Opcode }, 8328 { Bad_Opcode }, 8329 /* c8 */ 8330 { Bad_Opcode }, 8331 { Bad_Opcode }, 8332 { Bad_Opcode }, 8333 { Bad_Opcode }, 8334 { Bad_Opcode }, 8335 { Bad_Opcode }, 8336 { Bad_Opcode }, 8337 { Bad_Opcode }, 8338 /* d0 */ 8339 { Bad_Opcode }, 8340 { Bad_Opcode }, 8341 { Bad_Opcode }, 8342 { Bad_Opcode }, 8343 { Bad_Opcode }, 8344 { Bad_Opcode }, 8345 { Bad_Opcode }, 8346 { Bad_Opcode }, 8347 /* d8 */ 8348 { Bad_Opcode }, 8349 { Bad_Opcode }, 8350 { Bad_Opcode }, 8351 { Bad_Opcode }, 8352 { Bad_Opcode }, 8353 { Bad_Opcode }, 8354 { Bad_Opcode }, 8355 { Bad_Opcode }, 8356 /* e0 */ 8357 { Bad_Opcode }, 8358 { Bad_Opcode }, 8359 { Bad_Opcode }, 8360 { Bad_Opcode }, 8361 { Bad_Opcode }, 8362 { Bad_Opcode }, 8363 { Bad_Opcode }, 8364 { Bad_Opcode }, 8365 /* e8 */ 8366 { Bad_Opcode }, 8367 { Bad_Opcode }, 8368 { Bad_Opcode }, 8369 { Bad_Opcode }, 8370 { Bad_Opcode }, 8371 { Bad_Opcode }, 8372 { Bad_Opcode }, 8373 { Bad_Opcode }, 8374 /* f0 */ 8375 { Bad_Opcode }, 8376 { Bad_Opcode }, 8377 { Bad_Opcode }, 8378 { Bad_Opcode }, 8379 { Bad_Opcode }, 8380 { Bad_Opcode }, 8381 { Bad_Opcode }, 8382 { Bad_Opcode }, 8383 /* f8 */ 8384 { Bad_Opcode }, 8385 { Bad_Opcode }, 8386 { Bad_Opcode }, 8387 { Bad_Opcode }, 8388 { Bad_Opcode }, 8389 { Bad_Opcode }, 8390 { Bad_Opcode }, 8391 { Bad_Opcode }, 8392 }, 8393 }; 8394 8395 static const struct dis386 vex_table[][256] = { 8396 /* VEX_0F */ 8397 { 8398 /* 00 */ 8399 { Bad_Opcode }, 8400 { Bad_Opcode }, 8401 { Bad_Opcode }, 8402 { Bad_Opcode }, 8403 { Bad_Opcode }, 8404 { Bad_Opcode }, 8405 { Bad_Opcode }, 8406 { Bad_Opcode }, 8407 /* 08 */ 8408 { Bad_Opcode }, 8409 { Bad_Opcode }, 8410 { Bad_Opcode }, 8411 { Bad_Opcode }, 8412 { Bad_Opcode }, 8413 { Bad_Opcode }, 8414 { Bad_Opcode }, 8415 { Bad_Opcode }, 8416 /* 10 */ 8417 { PREFIX_TABLE (PREFIX_VEX_0F10) }, 8418 { PREFIX_TABLE (PREFIX_VEX_0F11) }, 8419 { PREFIX_TABLE (PREFIX_VEX_0F12) }, 8420 { MOD_TABLE (MOD_VEX_0F13) }, 8421 { "vunpcklpX", { XM, Vex, EXx }, 0 }, 8422 { "vunpckhpX", { XM, Vex, EXx }, 0 }, 8423 { PREFIX_TABLE (PREFIX_VEX_0F16) }, 8424 { MOD_TABLE (MOD_VEX_0F17) }, 8425 /* 18 */ 8426 { Bad_Opcode }, 8427 { Bad_Opcode }, 8428 { Bad_Opcode }, 8429 { Bad_Opcode }, 8430 { Bad_Opcode }, 8431 { Bad_Opcode }, 8432 { Bad_Opcode }, 8433 { Bad_Opcode }, 8434 /* 20 */ 8435 { Bad_Opcode }, 8436 { Bad_Opcode }, 8437 { Bad_Opcode }, 8438 { Bad_Opcode }, 8439 { Bad_Opcode }, 8440 { Bad_Opcode }, 8441 { Bad_Opcode }, 8442 { Bad_Opcode }, 8443 /* 28 */ 8444 { "vmovapX", { XM, EXx }, 0 }, 8445 { "vmovapX", { EXxS, XM }, 0 }, 8446 { PREFIX_TABLE (PREFIX_VEX_0F2A) }, 8447 { MOD_TABLE (MOD_VEX_0F2B) }, 8448 { PREFIX_TABLE (PREFIX_VEX_0F2C) }, 8449 { PREFIX_TABLE (PREFIX_VEX_0F2D) }, 8450 { PREFIX_TABLE (PREFIX_VEX_0F2E) }, 8451 { PREFIX_TABLE (PREFIX_VEX_0F2F) }, 8452 /* 30 */ 8453 { Bad_Opcode }, 8454 { Bad_Opcode }, 8455 { Bad_Opcode }, 8456 { Bad_Opcode }, 8457 { Bad_Opcode }, 8458 { Bad_Opcode }, 8459 { Bad_Opcode }, 8460 { Bad_Opcode }, 8461 /* 38 */ 8462 { Bad_Opcode }, 8463 { Bad_Opcode }, 8464 { Bad_Opcode }, 8465 { Bad_Opcode }, 8466 { Bad_Opcode }, 8467 { Bad_Opcode }, 8468 { Bad_Opcode }, 8469 { Bad_Opcode }, 8470 /* 40 */ 8471 { Bad_Opcode }, 8472 { PREFIX_TABLE (PREFIX_VEX_0F41) }, 8473 { PREFIX_TABLE (PREFIX_VEX_0F42) }, 8474 { Bad_Opcode }, 8475 { PREFIX_TABLE (PREFIX_VEX_0F44) }, 8476 { PREFIX_TABLE (PREFIX_VEX_0F45) }, 8477 { PREFIX_TABLE (PREFIX_VEX_0F46) }, 8478 { PREFIX_TABLE (PREFIX_VEX_0F47) }, 8479 /* 48 */ 8480 { Bad_Opcode }, 8481 { Bad_Opcode }, 8482 { PREFIX_TABLE (PREFIX_VEX_0F4A) }, 8483 { PREFIX_TABLE (PREFIX_VEX_0F4B) }, 8484 { Bad_Opcode }, 8485 { Bad_Opcode }, 8486 { Bad_Opcode }, 8487 { Bad_Opcode }, 8488 /* 50 */ 8489 { MOD_TABLE (MOD_VEX_0F50) }, 8490 { PREFIX_TABLE (PREFIX_VEX_0F51) }, 8491 { PREFIX_TABLE (PREFIX_VEX_0F52) }, 8492 { PREFIX_TABLE (PREFIX_VEX_0F53) }, 8493 { "vandpX", { XM, Vex, EXx }, 0 }, 8494 { "vandnpX", { XM, Vex, EXx }, 0 }, 8495 { "vorpX", { XM, Vex, EXx }, 0 }, 8496 { "vxorpX", { XM, Vex, EXx }, 0 }, 8497 /* 58 */ 8498 { PREFIX_TABLE (PREFIX_VEX_0F58) }, 8499 { PREFIX_TABLE (PREFIX_VEX_0F59) }, 8500 { PREFIX_TABLE (PREFIX_VEX_0F5A) }, 8501 { PREFIX_TABLE (PREFIX_VEX_0F5B) }, 8502 { PREFIX_TABLE (PREFIX_VEX_0F5C) }, 8503 { PREFIX_TABLE (PREFIX_VEX_0F5D) }, 8504 { PREFIX_TABLE (PREFIX_VEX_0F5E) }, 8505 { PREFIX_TABLE (PREFIX_VEX_0F5F) }, 8506 /* 60 */ 8507 { PREFIX_TABLE (PREFIX_VEX_0F60) }, 8508 { PREFIX_TABLE (PREFIX_VEX_0F61) }, 8509 { PREFIX_TABLE (PREFIX_VEX_0F62) }, 8510 { PREFIX_TABLE (PREFIX_VEX_0F63) }, 8511 { PREFIX_TABLE (PREFIX_VEX_0F64) }, 8512 { PREFIX_TABLE (PREFIX_VEX_0F65) }, 8513 { PREFIX_TABLE (PREFIX_VEX_0F66) }, 8514 { PREFIX_TABLE (PREFIX_VEX_0F67) }, 8515 /* 68 */ 8516 { PREFIX_TABLE (PREFIX_VEX_0F68) }, 8517 { PREFIX_TABLE (PREFIX_VEX_0F69) }, 8518 { PREFIX_TABLE (PREFIX_VEX_0F6A) }, 8519 { PREFIX_TABLE (PREFIX_VEX_0F6B) }, 8520 { PREFIX_TABLE (PREFIX_VEX_0F6C) }, 8521 { PREFIX_TABLE (PREFIX_VEX_0F6D) }, 8522 { PREFIX_TABLE (PREFIX_VEX_0F6E) }, 8523 { PREFIX_TABLE (PREFIX_VEX_0F6F) }, 8524 /* 70 */ 8525 { PREFIX_TABLE (PREFIX_VEX_0F70) }, 8526 { REG_TABLE (REG_VEX_0F71) }, 8527 { REG_TABLE (REG_VEX_0F72) }, 8528 { REG_TABLE (REG_VEX_0F73) }, 8529 { PREFIX_TABLE (PREFIX_VEX_0F74) }, 8530 { PREFIX_TABLE (PREFIX_VEX_0F75) }, 8531 { PREFIX_TABLE (PREFIX_VEX_0F76) }, 8532 { PREFIX_TABLE (PREFIX_VEX_0F77) }, 8533 /* 78 */ 8534 { Bad_Opcode }, 8535 { Bad_Opcode }, 8536 { Bad_Opcode }, 8537 { Bad_Opcode }, 8538 { PREFIX_TABLE (PREFIX_VEX_0F7C) }, 8539 { PREFIX_TABLE (PREFIX_VEX_0F7D) }, 8540 { PREFIX_TABLE (PREFIX_VEX_0F7E) }, 8541 { PREFIX_TABLE (PREFIX_VEX_0F7F) }, 8542 /* 80 */ 8543 { Bad_Opcode }, 8544 { Bad_Opcode }, 8545 { Bad_Opcode }, 8546 { Bad_Opcode }, 8547 { Bad_Opcode }, 8548 { Bad_Opcode }, 8549 { Bad_Opcode }, 8550 { Bad_Opcode }, 8551 /* 88 */ 8552 { Bad_Opcode }, 8553 { Bad_Opcode }, 8554 { Bad_Opcode }, 8555 { Bad_Opcode }, 8556 { Bad_Opcode }, 8557 { Bad_Opcode }, 8558 { Bad_Opcode }, 8559 { Bad_Opcode }, 8560 /* 90 */ 8561 { PREFIX_TABLE (PREFIX_VEX_0F90) }, 8562 { PREFIX_TABLE (PREFIX_VEX_0F91) }, 8563 { PREFIX_TABLE (PREFIX_VEX_0F92) }, 8564 { PREFIX_TABLE (PREFIX_VEX_0F93) }, 8565 { Bad_Opcode }, 8566 { Bad_Opcode }, 8567 { Bad_Opcode }, 8568 { Bad_Opcode }, 8569 /* 98 */ 8570 { PREFIX_TABLE (PREFIX_VEX_0F98) }, 8571 { PREFIX_TABLE (PREFIX_VEX_0F99) }, 8572 { Bad_Opcode }, 8573 { Bad_Opcode }, 8574 { Bad_Opcode }, 8575 { Bad_Opcode }, 8576 { Bad_Opcode }, 8577 { Bad_Opcode }, 8578 /* a0 */ 8579 { Bad_Opcode }, 8580 { Bad_Opcode }, 8581 { Bad_Opcode }, 8582 { Bad_Opcode }, 8583 { Bad_Opcode }, 8584 { Bad_Opcode }, 8585 { Bad_Opcode }, 8586 { Bad_Opcode }, 8587 /* a8 */ 8588 { Bad_Opcode }, 8589 { Bad_Opcode }, 8590 { Bad_Opcode }, 8591 { Bad_Opcode }, 8592 { Bad_Opcode }, 8593 { Bad_Opcode }, 8594 { REG_TABLE (REG_VEX_0FAE) }, 8595 { Bad_Opcode }, 8596 /* b0 */ 8597 { Bad_Opcode }, 8598 { Bad_Opcode }, 8599 { Bad_Opcode }, 8600 { Bad_Opcode }, 8601 { Bad_Opcode }, 8602 { Bad_Opcode }, 8603 { Bad_Opcode }, 8604 { Bad_Opcode }, 8605 /* b8 */ 8606 { Bad_Opcode }, 8607 { Bad_Opcode }, 8608 { Bad_Opcode }, 8609 { Bad_Opcode }, 8610 { Bad_Opcode }, 8611 { Bad_Opcode }, 8612 { Bad_Opcode }, 8613 { Bad_Opcode }, 8614 /* c0 */ 8615 { Bad_Opcode }, 8616 { Bad_Opcode }, 8617 { PREFIX_TABLE (PREFIX_VEX_0FC2) }, 8618 { Bad_Opcode }, 8619 { PREFIX_TABLE (PREFIX_VEX_0FC4) }, 8620 { PREFIX_TABLE (PREFIX_VEX_0FC5) }, 8621 { "vshufpX", { XM, Vex, EXx, Ib }, 0 }, 8622 { Bad_Opcode }, 8623 /* c8 */ 8624 { Bad_Opcode }, 8625 { Bad_Opcode }, 8626 { Bad_Opcode }, 8627 { Bad_Opcode }, 8628 { Bad_Opcode }, 8629 { Bad_Opcode }, 8630 { Bad_Opcode }, 8631 { Bad_Opcode }, 8632 /* d0 */ 8633 { PREFIX_TABLE (PREFIX_VEX_0FD0) }, 8634 { PREFIX_TABLE (PREFIX_VEX_0FD1) }, 8635 { PREFIX_TABLE (PREFIX_VEX_0FD2) }, 8636 { PREFIX_TABLE (PREFIX_VEX_0FD3) }, 8637 { PREFIX_TABLE (PREFIX_VEX_0FD4) }, 8638 { PREFIX_TABLE (PREFIX_VEX_0FD5) }, 8639 { PREFIX_TABLE (PREFIX_VEX_0FD6) }, 8640 { PREFIX_TABLE (PREFIX_VEX_0FD7) }, 8641 /* d8 */ 8642 { PREFIX_TABLE (PREFIX_VEX_0FD8) }, 8643 { PREFIX_TABLE (PREFIX_VEX_0FD9) }, 8644 { PREFIX_TABLE (PREFIX_VEX_0FDA) }, 8645 { PREFIX_TABLE (PREFIX_VEX_0FDB) }, 8646 { PREFIX_TABLE (PREFIX_VEX_0FDC) }, 8647 { PREFIX_TABLE (PREFIX_VEX_0FDD) }, 8648 { PREFIX_TABLE (PREFIX_VEX_0FDE) }, 8649 { PREFIX_TABLE (PREFIX_VEX_0FDF) }, 8650 /* e0 */ 8651 { PREFIX_TABLE (PREFIX_VEX_0FE0) }, 8652 { PREFIX_TABLE (PREFIX_VEX_0FE1) }, 8653 { PREFIX_TABLE (PREFIX_VEX_0FE2) }, 8654 { PREFIX_TABLE (PREFIX_VEX_0FE3) }, 8655 { PREFIX_TABLE (PREFIX_VEX_0FE4) }, 8656 { PREFIX_TABLE (PREFIX_VEX_0FE5) }, 8657 { PREFIX_TABLE (PREFIX_VEX_0FE6) }, 8658 { PREFIX_TABLE (PREFIX_VEX_0FE7) }, 8659 /* e8 */ 8660 { PREFIX_TABLE (PREFIX_VEX_0FE8) }, 8661 { PREFIX_TABLE (PREFIX_VEX_0FE9) }, 8662 { PREFIX_TABLE (PREFIX_VEX_0FEA) }, 8663 { PREFIX_TABLE (PREFIX_VEX_0FEB) }, 8664 { PREFIX_TABLE (PREFIX_VEX_0FEC) }, 8665 { PREFIX_TABLE (PREFIX_VEX_0FED) }, 8666 { PREFIX_TABLE (PREFIX_VEX_0FEE) }, 8667 { PREFIX_TABLE (PREFIX_VEX_0FEF) }, 8668 /* f0 */ 8669 { PREFIX_TABLE (PREFIX_VEX_0FF0) }, 8670 { PREFIX_TABLE (PREFIX_VEX_0FF1) }, 8671 { PREFIX_TABLE (PREFIX_VEX_0FF2) }, 8672 { PREFIX_TABLE (PREFIX_VEX_0FF3) }, 8673 { PREFIX_TABLE (PREFIX_VEX_0FF4) }, 8674 { PREFIX_TABLE (PREFIX_VEX_0FF5) }, 8675 { PREFIX_TABLE (PREFIX_VEX_0FF6) }, 8676 { PREFIX_TABLE (PREFIX_VEX_0FF7) }, 8677 /* f8 */ 8678 { PREFIX_TABLE (PREFIX_VEX_0FF8) }, 8679 { PREFIX_TABLE (PREFIX_VEX_0FF9) }, 8680 { PREFIX_TABLE (PREFIX_VEX_0FFA) }, 8681 { PREFIX_TABLE (PREFIX_VEX_0FFB) }, 8682 { PREFIX_TABLE (PREFIX_VEX_0FFC) }, 8683 { PREFIX_TABLE (PREFIX_VEX_0FFD) }, 8684 { PREFIX_TABLE (PREFIX_VEX_0FFE) }, 8685 { Bad_Opcode }, 8686 }, 8687 /* VEX_0F38 */ 8688 { 8689 /* 00 */ 8690 { PREFIX_TABLE (PREFIX_VEX_0F3800) }, 8691 { PREFIX_TABLE (PREFIX_VEX_0F3801) }, 8692 { PREFIX_TABLE (PREFIX_VEX_0F3802) }, 8693 { PREFIX_TABLE (PREFIX_VEX_0F3803) }, 8694 { PREFIX_TABLE (PREFIX_VEX_0F3804) }, 8695 { PREFIX_TABLE (PREFIX_VEX_0F3805) }, 8696 { PREFIX_TABLE (PREFIX_VEX_0F3806) }, 8697 { PREFIX_TABLE (PREFIX_VEX_0F3807) }, 8698 /* 08 */ 8699 { PREFIX_TABLE (PREFIX_VEX_0F3808) }, 8700 { PREFIX_TABLE (PREFIX_VEX_0F3809) }, 8701 { PREFIX_TABLE (PREFIX_VEX_0F380A) }, 8702 { PREFIX_TABLE (PREFIX_VEX_0F380B) }, 8703 { PREFIX_TABLE (PREFIX_VEX_0F380C) }, 8704 { PREFIX_TABLE (PREFIX_VEX_0F380D) }, 8705 { PREFIX_TABLE (PREFIX_VEX_0F380E) }, 8706 { PREFIX_TABLE (PREFIX_VEX_0F380F) }, 8707 /* 10 */ 8708 { Bad_Opcode }, 8709 { Bad_Opcode }, 8710 { Bad_Opcode }, 8711 { PREFIX_TABLE (PREFIX_VEX_0F3813) }, 8712 { Bad_Opcode }, 8713 { Bad_Opcode }, 8714 { PREFIX_TABLE (PREFIX_VEX_0F3816) }, 8715 { PREFIX_TABLE (PREFIX_VEX_0F3817) }, 8716 /* 18 */ 8717 { PREFIX_TABLE (PREFIX_VEX_0F3818) }, 8718 { PREFIX_TABLE (PREFIX_VEX_0F3819) }, 8719 { PREFIX_TABLE (PREFIX_VEX_0F381A) }, 8720 { Bad_Opcode }, 8721 { PREFIX_TABLE (PREFIX_VEX_0F381C) }, 8722 { PREFIX_TABLE (PREFIX_VEX_0F381D) }, 8723 { PREFIX_TABLE (PREFIX_VEX_0F381E) }, 8724 { Bad_Opcode }, 8725 /* 20 */ 8726 { PREFIX_TABLE (PREFIX_VEX_0F3820) }, 8727 { PREFIX_TABLE (PREFIX_VEX_0F3821) }, 8728 { PREFIX_TABLE (PREFIX_VEX_0F3822) }, 8729 { PREFIX_TABLE (PREFIX_VEX_0F3823) }, 8730 { PREFIX_TABLE (PREFIX_VEX_0F3824) }, 8731 { PREFIX_TABLE (PREFIX_VEX_0F3825) }, 8732 { Bad_Opcode }, 8733 { Bad_Opcode }, 8734 /* 28 */ 8735 { PREFIX_TABLE (PREFIX_VEX_0F3828) }, 8736 { PREFIX_TABLE (PREFIX_VEX_0F3829) }, 8737 { PREFIX_TABLE (PREFIX_VEX_0F382A) }, 8738 { PREFIX_TABLE (PREFIX_VEX_0F382B) }, 8739 { PREFIX_TABLE (PREFIX_VEX_0F382C) }, 8740 { PREFIX_TABLE (PREFIX_VEX_0F382D) }, 8741 { PREFIX_TABLE (PREFIX_VEX_0F382E) }, 8742 { PREFIX_TABLE (PREFIX_VEX_0F382F) }, 8743 /* 30 */ 8744 { PREFIX_TABLE (PREFIX_VEX_0F3830) }, 8745 { PREFIX_TABLE (PREFIX_VEX_0F3831) }, 8746 { PREFIX_TABLE (PREFIX_VEX_0F3832) }, 8747 { PREFIX_TABLE (PREFIX_VEX_0F3833) }, 8748 { PREFIX_TABLE (PREFIX_VEX_0F3834) }, 8749 { PREFIX_TABLE (PREFIX_VEX_0F3835) }, 8750 { PREFIX_TABLE (PREFIX_VEX_0F3836) }, 8751 { PREFIX_TABLE (PREFIX_VEX_0F3837) }, 8752 /* 38 */ 8753 { PREFIX_TABLE (PREFIX_VEX_0F3838) }, 8754 { PREFIX_TABLE (PREFIX_VEX_0F3839) }, 8755 { PREFIX_TABLE (PREFIX_VEX_0F383A) }, 8756 { PREFIX_TABLE (PREFIX_VEX_0F383B) }, 8757 { PREFIX_TABLE (PREFIX_VEX_0F383C) }, 8758 { PREFIX_TABLE (PREFIX_VEX_0F383D) }, 8759 { PREFIX_TABLE (PREFIX_VEX_0F383E) }, 8760 { PREFIX_TABLE (PREFIX_VEX_0F383F) }, 8761 /* 40 */ 8762 { PREFIX_TABLE (PREFIX_VEX_0F3840) }, 8763 { PREFIX_TABLE (PREFIX_VEX_0F3841) }, 8764 { Bad_Opcode }, 8765 { Bad_Opcode }, 8766 { Bad_Opcode }, 8767 { PREFIX_TABLE (PREFIX_VEX_0F3845) }, 8768 { PREFIX_TABLE (PREFIX_VEX_0F3846) }, 8769 { PREFIX_TABLE (PREFIX_VEX_0F3847) }, 8770 /* 48 */ 8771 { Bad_Opcode }, 8772 { Bad_Opcode }, 8773 { Bad_Opcode }, 8774 { Bad_Opcode }, 8775 { Bad_Opcode }, 8776 { Bad_Opcode }, 8777 { Bad_Opcode }, 8778 { Bad_Opcode }, 8779 /* 50 */ 8780 { Bad_Opcode }, 8781 { Bad_Opcode }, 8782 { Bad_Opcode }, 8783 { Bad_Opcode }, 8784 { Bad_Opcode }, 8785 { Bad_Opcode }, 8786 { Bad_Opcode }, 8787 { Bad_Opcode }, 8788 /* 58 */ 8789 { PREFIX_TABLE (PREFIX_VEX_0F3858) }, 8790 { PREFIX_TABLE (PREFIX_VEX_0F3859) }, 8791 { PREFIX_TABLE (PREFIX_VEX_0F385A) }, 8792 { Bad_Opcode }, 8793 { Bad_Opcode }, 8794 { Bad_Opcode }, 8795 { Bad_Opcode }, 8796 { Bad_Opcode }, 8797 /* 60 */ 8798 { Bad_Opcode }, 8799 { Bad_Opcode }, 8800 { Bad_Opcode }, 8801 { Bad_Opcode }, 8802 { Bad_Opcode }, 8803 { Bad_Opcode }, 8804 { Bad_Opcode }, 8805 { Bad_Opcode }, 8806 /* 68 */ 8807 { Bad_Opcode }, 8808 { Bad_Opcode }, 8809 { Bad_Opcode }, 8810 { Bad_Opcode }, 8811 { Bad_Opcode }, 8812 { Bad_Opcode }, 8813 { Bad_Opcode }, 8814 { Bad_Opcode }, 8815 /* 70 */ 8816 { Bad_Opcode }, 8817 { Bad_Opcode }, 8818 { Bad_Opcode }, 8819 { Bad_Opcode }, 8820 { Bad_Opcode }, 8821 { Bad_Opcode }, 8822 { Bad_Opcode }, 8823 { Bad_Opcode }, 8824 /* 78 */ 8825 { PREFIX_TABLE (PREFIX_VEX_0F3878) }, 8826 { PREFIX_TABLE (PREFIX_VEX_0F3879) }, 8827 { Bad_Opcode }, 8828 { Bad_Opcode }, 8829 { Bad_Opcode }, 8830 { Bad_Opcode }, 8831 { Bad_Opcode }, 8832 { Bad_Opcode }, 8833 /* 80 */ 8834 { Bad_Opcode }, 8835 { Bad_Opcode }, 8836 { Bad_Opcode }, 8837 { Bad_Opcode }, 8838 { Bad_Opcode }, 8839 { Bad_Opcode }, 8840 { Bad_Opcode }, 8841 { Bad_Opcode }, 8842 /* 88 */ 8843 { Bad_Opcode }, 8844 { Bad_Opcode }, 8845 { Bad_Opcode }, 8846 { Bad_Opcode }, 8847 { PREFIX_TABLE (PREFIX_VEX_0F388C) }, 8848 { Bad_Opcode }, 8849 { PREFIX_TABLE (PREFIX_VEX_0F388E) }, 8850 { Bad_Opcode }, 8851 /* 90 */ 8852 { PREFIX_TABLE (PREFIX_VEX_0F3890) }, 8853 { PREFIX_TABLE (PREFIX_VEX_0F3891) }, 8854 { PREFIX_TABLE (PREFIX_VEX_0F3892) }, 8855 { PREFIX_TABLE (PREFIX_VEX_0F3893) }, 8856 { Bad_Opcode }, 8857 { Bad_Opcode }, 8858 { PREFIX_TABLE (PREFIX_VEX_0F3896) }, 8859 { PREFIX_TABLE (PREFIX_VEX_0F3897) }, 8860 /* 98 */ 8861 { PREFIX_TABLE (PREFIX_VEX_0F3898) }, 8862 { PREFIX_TABLE (PREFIX_VEX_0F3899) }, 8863 { PREFIX_TABLE (PREFIX_VEX_0F389A) }, 8864 { PREFIX_TABLE (PREFIX_VEX_0F389B) }, 8865 { PREFIX_TABLE (PREFIX_VEX_0F389C) }, 8866 { PREFIX_TABLE (PREFIX_VEX_0F389D) }, 8867 { PREFIX_TABLE (PREFIX_VEX_0F389E) }, 8868 { PREFIX_TABLE (PREFIX_VEX_0F389F) }, 8869 /* a0 */ 8870 { Bad_Opcode }, 8871 { Bad_Opcode }, 8872 { Bad_Opcode }, 8873 { Bad_Opcode }, 8874 { Bad_Opcode }, 8875 { Bad_Opcode }, 8876 { PREFIX_TABLE (PREFIX_VEX_0F38A6) }, 8877 { PREFIX_TABLE (PREFIX_VEX_0F38A7) }, 8878 /* a8 */ 8879 { PREFIX_TABLE (PREFIX_VEX_0F38A8) }, 8880 { PREFIX_TABLE (PREFIX_VEX_0F38A9) }, 8881 { PREFIX_TABLE (PREFIX_VEX_0F38AA) }, 8882 { PREFIX_TABLE (PREFIX_VEX_0F38AB) }, 8883 { PREFIX_TABLE (PREFIX_VEX_0F38AC) }, 8884 { PREFIX_TABLE (PREFIX_VEX_0F38AD) }, 8885 { PREFIX_TABLE (PREFIX_VEX_0F38AE) }, 8886 { PREFIX_TABLE (PREFIX_VEX_0F38AF) }, 8887 /* b0 */ 8888 { Bad_Opcode }, 8889 { Bad_Opcode }, 8890 { Bad_Opcode }, 8891 { Bad_Opcode }, 8892 { Bad_Opcode }, 8893 { Bad_Opcode }, 8894 { PREFIX_TABLE (PREFIX_VEX_0F38B6) }, 8895 { PREFIX_TABLE (PREFIX_VEX_0F38B7) }, 8896 /* b8 */ 8897 { PREFIX_TABLE (PREFIX_VEX_0F38B8) }, 8898 { PREFIX_TABLE (PREFIX_VEX_0F38B9) }, 8899 { PREFIX_TABLE (PREFIX_VEX_0F38BA) }, 8900 { PREFIX_TABLE (PREFIX_VEX_0F38BB) }, 8901 { PREFIX_TABLE (PREFIX_VEX_0F38BC) }, 8902 { PREFIX_TABLE (PREFIX_VEX_0F38BD) }, 8903 { PREFIX_TABLE (PREFIX_VEX_0F38BE) }, 8904 { PREFIX_TABLE (PREFIX_VEX_0F38BF) }, 8905 /* c0 */ 8906 { Bad_Opcode }, 8907 { Bad_Opcode }, 8908 { Bad_Opcode }, 8909 { Bad_Opcode }, 8910 { Bad_Opcode }, 8911 { Bad_Opcode }, 8912 { Bad_Opcode }, 8913 { Bad_Opcode }, 8914 /* c8 */ 8915 { Bad_Opcode }, 8916 { Bad_Opcode }, 8917 { Bad_Opcode }, 8918 { Bad_Opcode }, 8919 { Bad_Opcode }, 8920 { Bad_Opcode }, 8921 { Bad_Opcode }, 8922 { PREFIX_TABLE (PREFIX_VEX_0F38CF) }, 8923 /* d0 */ 8924 { Bad_Opcode }, 8925 { Bad_Opcode }, 8926 { Bad_Opcode }, 8927 { Bad_Opcode }, 8928 { Bad_Opcode }, 8929 { Bad_Opcode }, 8930 { Bad_Opcode }, 8931 { Bad_Opcode }, 8932 /* d8 */ 8933 { Bad_Opcode }, 8934 { Bad_Opcode }, 8935 { Bad_Opcode }, 8936 { PREFIX_TABLE (PREFIX_VEX_0F38DB) }, 8937 { PREFIX_TABLE (PREFIX_VEX_0F38DC) }, 8938 { PREFIX_TABLE (PREFIX_VEX_0F38DD) }, 8939 { PREFIX_TABLE (PREFIX_VEX_0F38DE) }, 8940 { PREFIX_TABLE (PREFIX_VEX_0F38DF) }, 8941 /* e0 */ 8942 { Bad_Opcode }, 8943 { Bad_Opcode }, 8944 { Bad_Opcode }, 8945 { Bad_Opcode }, 8946 { Bad_Opcode }, 8947 { Bad_Opcode }, 8948 { Bad_Opcode }, 8949 { Bad_Opcode }, 8950 /* e8 */ 8951 { Bad_Opcode }, 8952 { Bad_Opcode }, 8953 { Bad_Opcode }, 8954 { Bad_Opcode }, 8955 { Bad_Opcode }, 8956 { Bad_Opcode }, 8957 { Bad_Opcode }, 8958 { Bad_Opcode }, 8959 /* f0 */ 8960 { Bad_Opcode }, 8961 { Bad_Opcode }, 8962 { PREFIX_TABLE (PREFIX_VEX_0F38F2) }, 8963 { REG_TABLE (REG_VEX_0F38F3) }, 8964 { Bad_Opcode }, 8965 { PREFIX_TABLE (PREFIX_VEX_0F38F5) }, 8966 { PREFIX_TABLE (PREFIX_VEX_0F38F6) }, 8967 { PREFIX_TABLE (PREFIX_VEX_0F38F7) }, 8968 /* f8 */ 8969 { Bad_Opcode }, 8970 { Bad_Opcode }, 8971 { Bad_Opcode }, 8972 { Bad_Opcode }, 8973 { Bad_Opcode }, 8974 { Bad_Opcode }, 8975 { Bad_Opcode }, 8976 { Bad_Opcode }, 8977 }, 8978 /* VEX_0F3A */ 8979 { 8980 /* 00 */ 8981 { PREFIX_TABLE (PREFIX_VEX_0F3A00) }, 8982 { PREFIX_TABLE (PREFIX_VEX_0F3A01) }, 8983 { PREFIX_TABLE (PREFIX_VEX_0F3A02) }, 8984 { Bad_Opcode }, 8985 { PREFIX_TABLE (PREFIX_VEX_0F3A04) }, 8986 { PREFIX_TABLE (PREFIX_VEX_0F3A05) }, 8987 { PREFIX_TABLE (PREFIX_VEX_0F3A06) }, 8988 { Bad_Opcode }, 8989 /* 08 */ 8990 { PREFIX_TABLE (PREFIX_VEX_0F3A08) }, 8991 { PREFIX_TABLE (PREFIX_VEX_0F3A09) }, 8992 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) }, 8993 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) }, 8994 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) }, 8995 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) }, 8996 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) }, 8997 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) }, 8998 /* 10 */ 8999 { Bad_Opcode }, 9000 { Bad_Opcode }, 9001 { Bad_Opcode }, 9002 { Bad_Opcode }, 9003 { PREFIX_TABLE (PREFIX_VEX_0F3A14) }, 9004 { PREFIX_TABLE (PREFIX_VEX_0F3A15) }, 9005 { PREFIX_TABLE (PREFIX_VEX_0F3A16) }, 9006 { PREFIX_TABLE (PREFIX_VEX_0F3A17) }, 9007 /* 18 */ 9008 { PREFIX_TABLE (PREFIX_VEX_0F3A18) }, 9009 { PREFIX_TABLE (PREFIX_VEX_0F3A19) }, 9010 { Bad_Opcode }, 9011 { Bad_Opcode }, 9012 { Bad_Opcode }, 9013 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) }, 9014 { Bad_Opcode }, 9015 { Bad_Opcode }, 9016 /* 20 */ 9017 { PREFIX_TABLE (PREFIX_VEX_0F3A20) }, 9018 { PREFIX_TABLE (PREFIX_VEX_0F3A21) }, 9019 { PREFIX_TABLE (PREFIX_VEX_0F3A22) }, 9020 { Bad_Opcode }, 9021 { Bad_Opcode }, 9022 { Bad_Opcode }, 9023 { Bad_Opcode }, 9024 { Bad_Opcode }, 9025 /* 28 */ 9026 { Bad_Opcode }, 9027 { Bad_Opcode }, 9028 { Bad_Opcode }, 9029 { Bad_Opcode }, 9030 { Bad_Opcode }, 9031 { Bad_Opcode }, 9032 { Bad_Opcode }, 9033 { Bad_Opcode }, 9034 /* 30 */ 9035 { PREFIX_TABLE (PREFIX_VEX_0F3A30) }, 9036 { PREFIX_TABLE (PREFIX_VEX_0F3A31) }, 9037 { PREFIX_TABLE (PREFIX_VEX_0F3A32) }, 9038 { PREFIX_TABLE (PREFIX_VEX_0F3A33) }, 9039 { Bad_Opcode }, 9040 { Bad_Opcode }, 9041 { Bad_Opcode }, 9042 { Bad_Opcode }, 9043 /* 38 */ 9044 { PREFIX_TABLE (PREFIX_VEX_0F3A38) }, 9045 { PREFIX_TABLE (PREFIX_VEX_0F3A39) }, 9046 { Bad_Opcode }, 9047 { Bad_Opcode }, 9048 { Bad_Opcode }, 9049 { Bad_Opcode }, 9050 { Bad_Opcode }, 9051 { Bad_Opcode }, 9052 /* 40 */ 9053 { PREFIX_TABLE (PREFIX_VEX_0F3A40) }, 9054 { PREFIX_TABLE (PREFIX_VEX_0F3A41) }, 9055 { PREFIX_TABLE (PREFIX_VEX_0F3A42) }, 9056 { Bad_Opcode }, 9057 { PREFIX_TABLE (PREFIX_VEX_0F3A44) }, 9058 { Bad_Opcode }, 9059 { PREFIX_TABLE (PREFIX_VEX_0F3A46) }, 9060 { Bad_Opcode }, 9061 /* 48 */ 9062 { PREFIX_TABLE (PREFIX_VEX_0F3A48) }, 9063 { PREFIX_TABLE (PREFIX_VEX_0F3A49) }, 9064 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) }, 9065 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) }, 9066 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) }, 9067 { Bad_Opcode }, 9068 { Bad_Opcode }, 9069 { Bad_Opcode }, 9070 /* 50 */ 9071 { Bad_Opcode }, 9072 { Bad_Opcode }, 9073 { Bad_Opcode }, 9074 { Bad_Opcode }, 9075 { Bad_Opcode }, 9076 { Bad_Opcode }, 9077 { Bad_Opcode }, 9078 { Bad_Opcode }, 9079 /* 58 */ 9080 { Bad_Opcode }, 9081 { Bad_Opcode }, 9082 { Bad_Opcode }, 9083 { Bad_Opcode }, 9084 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) }, 9085 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) }, 9086 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) }, 9087 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) }, 9088 /* 60 */ 9089 { PREFIX_TABLE (PREFIX_VEX_0F3A60) }, 9090 { PREFIX_TABLE (PREFIX_VEX_0F3A61) }, 9091 { PREFIX_TABLE (PREFIX_VEX_0F3A62) }, 9092 { PREFIX_TABLE (PREFIX_VEX_0F3A63) }, 9093 { Bad_Opcode }, 9094 { Bad_Opcode }, 9095 { Bad_Opcode }, 9096 { Bad_Opcode }, 9097 /* 68 */ 9098 { PREFIX_TABLE (PREFIX_VEX_0F3A68) }, 9099 { PREFIX_TABLE (PREFIX_VEX_0F3A69) }, 9100 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) }, 9101 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) }, 9102 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) }, 9103 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) }, 9104 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) }, 9105 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) }, 9106 /* 70 */ 9107 { Bad_Opcode }, 9108 { Bad_Opcode }, 9109 { Bad_Opcode }, 9110 { Bad_Opcode }, 9111 { Bad_Opcode }, 9112 { Bad_Opcode }, 9113 { Bad_Opcode }, 9114 { Bad_Opcode }, 9115 /* 78 */ 9116 { PREFIX_TABLE (PREFIX_VEX_0F3A78) }, 9117 { PREFIX_TABLE (PREFIX_VEX_0F3A79) }, 9118 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) }, 9119 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) }, 9120 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) }, 9121 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) }, 9122 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) }, 9123 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) }, 9124 /* 80 */ 9125 { Bad_Opcode }, 9126 { Bad_Opcode }, 9127 { Bad_Opcode }, 9128 { Bad_Opcode }, 9129 { Bad_Opcode }, 9130 { Bad_Opcode }, 9131 { Bad_Opcode }, 9132 { Bad_Opcode }, 9133 /* 88 */ 9134 { Bad_Opcode }, 9135 { Bad_Opcode }, 9136 { Bad_Opcode }, 9137 { Bad_Opcode }, 9138 { Bad_Opcode }, 9139 { Bad_Opcode }, 9140 { Bad_Opcode }, 9141 { Bad_Opcode }, 9142 /* 90 */ 9143 { Bad_Opcode }, 9144 { Bad_Opcode }, 9145 { Bad_Opcode }, 9146 { Bad_Opcode }, 9147 { Bad_Opcode }, 9148 { Bad_Opcode }, 9149 { Bad_Opcode }, 9150 { Bad_Opcode }, 9151 /* 98 */ 9152 { Bad_Opcode }, 9153 { Bad_Opcode }, 9154 { Bad_Opcode }, 9155 { Bad_Opcode }, 9156 { Bad_Opcode }, 9157 { Bad_Opcode }, 9158 { Bad_Opcode }, 9159 { Bad_Opcode }, 9160 /* a0 */ 9161 { Bad_Opcode }, 9162 { Bad_Opcode }, 9163 { Bad_Opcode }, 9164 { Bad_Opcode }, 9165 { Bad_Opcode }, 9166 { Bad_Opcode }, 9167 { Bad_Opcode }, 9168 { Bad_Opcode }, 9169 /* a8 */ 9170 { Bad_Opcode }, 9171 { Bad_Opcode }, 9172 { Bad_Opcode }, 9173 { Bad_Opcode }, 9174 { Bad_Opcode }, 9175 { Bad_Opcode }, 9176 { Bad_Opcode }, 9177 { Bad_Opcode }, 9178 /* b0 */ 9179 { Bad_Opcode }, 9180 { Bad_Opcode }, 9181 { Bad_Opcode }, 9182 { Bad_Opcode }, 9183 { Bad_Opcode }, 9184 { Bad_Opcode }, 9185 { Bad_Opcode }, 9186 { Bad_Opcode }, 9187 /* b8 */ 9188 { Bad_Opcode }, 9189 { Bad_Opcode }, 9190 { Bad_Opcode }, 9191 { Bad_Opcode }, 9192 { Bad_Opcode }, 9193 { Bad_Opcode }, 9194 { Bad_Opcode }, 9195 { Bad_Opcode }, 9196 /* c0 */ 9197 { Bad_Opcode }, 9198 { Bad_Opcode }, 9199 { Bad_Opcode }, 9200 { Bad_Opcode }, 9201 { Bad_Opcode }, 9202 { Bad_Opcode }, 9203 { Bad_Opcode }, 9204 { Bad_Opcode }, 9205 /* c8 */ 9206 { Bad_Opcode }, 9207 { Bad_Opcode }, 9208 { Bad_Opcode }, 9209 { Bad_Opcode }, 9210 { Bad_Opcode }, 9211 { Bad_Opcode }, 9212 { PREFIX_TABLE(PREFIX_VEX_0F3ACE) }, 9213 { PREFIX_TABLE(PREFIX_VEX_0F3ACF) }, 9214 /* d0 */ 9215 { Bad_Opcode }, 9216 { Bad_Opcode }, 9217 { Bad_Opcode }, 9218 { Bad_Opcode }, 9219 { Bad_Opcode }, 9220 { Bad_Opcode }, 9221 { Bad_Opcode }, 9222 { Bad_Opcode }, 9223 /* d8 */ 9224 { Bad_Opcode }, 9225 { Bad_Opcode }, 9226 { Bad_Opcode }, 9227 { Bad_Opcode }, 9228 { Bad_Opcode }, 9229 { Bad_Opcode }, 9230 { Bad_Opcode }, 9231 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) }, 9232 /* e0 */ 9233 { Bad_Opcode }, 9234 { Bad_Opcode }, 9235 { Bad_Opcode }, 9236 { Bad_Opcode }, 9237 { Bad_Opcode }, 9238 { Bad_Opcode }, 9239 { Bad_Opcode }, 9240 { Bad_Opcode }, 9241 /* e8 */ 9242 { Bad_Opcode }, 9243 { Bad_Opcode }, 9244 { Bad_Opcode }, 9245 { Bad_Opcode }, 9246 { Bad_Opcode }, 9247 { Bad_Opcode }, 9248 { Bad_Opcode }, 9249 { Bad_Opcode }, 9250 /* f0 */ 9251 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) }, 9252 { Bad_Opcode }, 9253 { Bad_Opcode }, 9254 { Bad_Opcode }, 9255 { Bad_Opcode }, 9256 { Bad_Opcode }, 9257 { Bad_Opcode }, 9258 { Bad_Opcode }, 9259 /* f8 */ 9260 { Bad_Opcode }, 9261 { Bad_Opcode }, 9262 { Bad_Opcode }, 9263 { Bad_Opcode }, 9264 { Bad_Opcode }, 9265 { Bad_Opcode }, 9266 { Bad_Opcode }, 9267 { Bad_Opcode }, 9268 }, 9269 }; 9270 9271 #define NEED_OPCODE_TABLE 9272 #include "i386-dis-evex.h" 9273 #undef NEED_OPCODE_TABLE 9274 static const struct dis386 vex_len_table[][2] = { 9275 /* VEX_LEN_0F12_P_0_M_0 */ 9276 { 9277 { "vmovlps", { XM, Vex128, EXq }, 0 }, 9278 }, 9279 9280 /* VEX_LEN_0F12_P_0_M_1 */ 9281 { 9282 { "vmovhlps", { XM, Vex128, EXq }, 0 }, 9283 }, 9284 9285 /* VEX_LEN_0F12_P_2 */ 9286 { 9287 { "vmovlpd", { XM, Vex128, EXq }, 0 }, 9288 }, 9289 9290 /* VEX_LEN_0F13_M_0 */ 9291 { 9292 { "vmovlpX", { EXq, XM }, 0 }, 9293 }, 9294 9295 /* VEX_LEN_0F16_P_0_M_0 */ 9296 { 9297 { "vmovhps", { XM, Vex128, EXq }, 0 }, 9298 }, 9299 9300 /* VEX_LEN_0F16_P_0_M_1 */ 9301 { 9302 { "vmovlhps", { XM, Vex128, EXq }, 0 }, 9303 }, 9304 9305 /* VEX_LEN_0F16_P_2 */ 9306 { 9307 { "vmovhpd", { XM, Vex128, EXq }, 0 }, 9308 }, 9309 9310 /* VEX_LEN_0F17_M_0 */ 9311 { 9312 { "vmovhpX", { EXq, XM }, 0 }, 9313 }, 9314 9315 /* VEX_LEN_0F2A_P_1 */ 9316 { 9317 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 }, 9318 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 }, 9319 }, 9320 9321 /* VEX_LEN_0F2A_P_3 */ 9322 { 9323 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 }, 9324 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 }, 9325 }, 9326 9327 /* VEX_LEN_0F2C_P_1 */ 9328 { 9329 { "vcvttss2si", { Gv, EXdScalar }, 0 }, 9330 { "vcvttss2si", { Gv, EXdScalar }, 0 }, 9331 }, 9332 9333 /* VEX_LEN_0F2C_P_3 */ 9334 { 9335 { "vcvttsd2si", { Gv, EXqScalar }, 0 }, 9336 { "vcvttsd2si", { Gv, EXqScalar }, 0 }, 9337 }, 9338 9339 /* VEX_LEN_0F2D_P_1 */ 9340 { 9341 { "vcvtss2si", { Gv, EXdScalar }, 0 }, 9342 { "vcvtss2si", { Gv, EXdScalar }, 0 }, 9343 }, 9344 9345 /* VEX_LEN_0F2D_P_3 */ 9346 { 9347 { "vcvtsd2si", { Gv, EXqScalar }, 0 }, 9348 { "vcvtsd2si", { Gv, EXqScalar }, 0 }, 9349 }, 9350 9351 /* VEX_LEN_0F41_P_0 */ 9352 { 9353 { Bad_Opcode }, 9354 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) }, 9355 }, 9356 /* VEX_LEN_0F41_P_2 */ 9357 { 9358 { Bad_Opcode }, 9359 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) }, 9360 }, 9361 /* VEX_LEN_0F42_P_0 */ 9362 { 9363 { Bad_Opcode }, 9364 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) }, 9365 }, 9366 /* VEX_LEN_0F42_P_2 */ 9367 { 9368 { Bad_Opcode }, 9369 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) }, 9370 }, 9371 /* VEX_LEN_0F44_P_0 */ 9372 { 9373 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) }, 9374 }, 9375 /* VEX_LEN_0F44_P_2 */ 9376 { 9377 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) }, 9378 }, 9379 /* VEX_LEN_0F45_P_0 */ 9380 { 9381 { Bad_Opcode }, 9382 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) }, 9383 }, 9384 /* VEX_LEN_0F45_P_2 */ 9385 { 9386 { Bad_Opcode }, 9387 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) }, 9388 }, 9389 /* VEX_LEN_0F46_P_0 */ 9390 { 9391 { Bad_Opcode }, 9392 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) }, 9393 }, 9394 /* VEX_LEN_0F46_P_2 */ 9395 { 9396 { Bad_Opcode }, 9397 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) }, 9398 }, 9399 /* VEX_LEN_0F47_P_0 */ 9400 { 9401 { Bad_Opcode }, 9402 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) }, 9403 }, 9404 /* VEX_LEN_0F47_P_2 */ 9405 { 9406 { Bad_Opcode }, 9407 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) }, 9408 }, 9409 /* VEX_LEN_0F4A_P_0 */ 9410 { 9411 { Bad_Opcode }, 9412 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) }, 9413 }, 9414 /* VEX_LEN_0F4A_P_2 */ 9415 { 9416 { Bad_Opcode }, 9417 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) }, 9418 }, 9419 /* VEX_LEN_0F4B_P_0 */ 9420 { 9421 { Bad_Opcode }, 9422 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) }, 9423 }, 9424 /* VEX_LEN_0F4B_P_2 */ 9425 { 9426 { Bad_Opcode }, 9427 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) }, 9428 }, 9429 9430 /* VEX_LEN_0F6E_P_2 */ 9431 { 9432 { "vmovK", { XMScalar, Edq }, 0 }, 9433 }, 9434 9435 /* VEX_LEN_0F77_P_1 */ 9436 { 9437 { "vzeroupper", { XX }, 0 }, 9438 { "vzeroall", { XX }, 0 }, 9439 }, 9440 9441 /* VEX_LEN_0F7E_P_1 */ 9442 { 9443 { "vmovq", { XMScalar, EXqScalar }, 0 }, 9444 }, 9445 9446 /* VEX_LEN_0F7E_P_2 */ 9447 { 9448 { "vmovK", { Edq, XMScalar }, 0 }, 9449 }, 9450 9451 /* VEX_LEN_0F90_P_0 */ 9452 { 9453 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) }, 9454 }, 9455 9456 /* VEX_LEN_0F90_P_2 */ 9457 { 9458 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) }, 9459 }, 9460 9461 /* VEX_LEN_0F91_P_0 */ 9462 { 9463 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) }, 9464 }, 9465 9466 /* VEX_LEN_0F91_P_2 */ 9467 { 9468 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) }, 9469 }, 9470 9471 /* VEX_LEN_0F92_P_0 */ 9472 { 9473 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) }, 9474 }, 9475 9476 /* VEX_LEN_0F92_P_2 */ 9477 { 9478 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) }, 9479 }, 9480 9481 /* VEX_LEN_0F92_P_3 */ 9482 { 9483 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) }, 9484 }, 9485 9486 /* VEX_LEN_0F93_P_0 */ 9487 { 9488 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) }, 9489 }, 9490 9491 /* VEX_LEN_0F93_P_2 */ 9492 { 9493 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) }, 9494 }, 9495 9496 /* VEX_LEN_0F93_P_3 */ 9497 { 9498 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) }, 9499 }, 9500 9501 /* VEX_LEN_0F98_P_0 */ 9502 { 9503 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) }, 9504 }, 9505 9506 /* VEX_LEN_0F98_P_2 */ 9507 { 9508 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) }, 9509 }, 9510 9511 /* VEX_LEN_0F99_P_0 */ 9512 { 9513 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) }, 9514 }, 9515 9516 /* VEX_LEN_0F99_P_2 */ 9517 { 9518 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) }, 9519 }, 9520 9521 /* VEX_LEN_0FAE_R_2_M_0 */ 9522 { 9523 { "vldmxcsr", { Md }, 0 }, 9524 }, 9525 9526 /* VEX_LEN_0FAE_R_3_M_0 */ 9527 { 9528 { "vstmxcsr", { Md }, 0 }, 9529 }, 9530 9531 /* VEX_LEN_0FC4_P_2 */ 9532 { 9533 { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 }, 9534 }, 9535 9536 /* VEX_LEN_0FC5_P_2 */ 9537 { 9538 { "vpextrw", { Gdq, XS, Ib }, 0 }, 9539 }, 9540 9541 /* VEX_LEN_0FD6_P_2 */ 9542 { 9543 { "vmovq", { EXqScalarS, XMScalar }, 0 }, 9544 }, 9545 9546 /* VEX_LEN_0FF7_P_2 */ 9547 { 9548 { "vmaskmovdqu", { XM, XS }, 0 }, 9549 }, 9550 9551 /* VEX_LEN_0F3816_P_2 */ 9552 { 9553 { Bad_Opcode }, 9554 { VEX_W_TABLE (VEX_W_0F3816_P_2) }, 9555 }, 9556 9557 /* VEX_LEN_0F3819_P_2 */ 9558 { 9559 { Bad_Opcode }, 9560 { VEX_W_TABLE (VEX_W_0F3819_P_2) }, 9561 }, 9562 9563 /* VEX_LEN_0F381A_P_2_M_0 */ 9564 { 9565 { Bad_Opcode }, 9566 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) }, 9567 }, 9568 9569 /* VEX_LEN_0F3836_P_2 */ 9570 { 9571 { Bad_Opcode }, 9572 { VEX_W_TABLE (VEX_W_0F3836_P_2) }, 9573 }, 9574 9575 /* VEX_LEN_0F3841_P_2 */ 9576 { 9577 { "vphminposuw", { XM, EXx }, 0 }, 9578 }, 9579 9580 /* VEX_LEN_0F385A_P_2_M_0 */ 9581 { 9582 { Bad_Opcode }, 9583 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) }, 9584 }, 9585 9586 /* VEX_LEN_0F38DB_P_2 */ 9587 { 9588 { "vaesimc", { XM, EXx }, 0 }, 9589 }, 9590 9591 /* VEX_LEN_0F38F2_P_0 */ 9592 { 9593 { "andnS", { Gdq, VexGdq, Edq }, 0 }, 9594 }, 9595 9596 /* VEX_LEN_0F38F3_R_1_P_0 */ 9597 { 9598 { "blsrS", { VexGdq, Edq }, 0 }, 9599 }, 9600 9601 /* VEX_LEN_0F38F3_R_2_P_0 */ 9602 { 9603 { "blsmskS", { VexGdq, Edq }, 0 }, 9604 }, 9605 9606 /* VEX_LEN_0F38F3_R_3_P_0 */ 9607 { 9608 { "blsiS", { VexGdq, Edq }, 0 }, 9609 }, 9610 9611 /* VEX_LEN_0F38F5_P_0 */ 9612 { 9613 { "bzhiS", { Gdq, Edq, VexGdq }, 0 }, 9614 }, 9615 9616 /* VEX_LEN_0F38F5_P_1 */ 9617 { 9618 { "pextS", { Gdq, VexGdq, Edq }, 0 }, 9619 }, 9620 9621 /* VEX_LEN_0F38F5_P_3 */ 9622 { 9623 { "pdepS", { Gdq, VexGdq, Edq }, 0 }, 9624 }, 9625 9626 /* VEX_LEN_0F38F6_P_3 */ 9627 { 9628 { "mulxS", { Gdq, VexGdq, Edq }, 0 }, 9629 }, 9630 9631 /* VEX_LEN_0F38F7_P_0 */ 9632 { 9633 { "bextrS", { Gdq, Edq, VexGdq }, 0 }, 9634 }, 9635 9636 /* VEX_LEN_0F38F7_P_1 */ 9637 { 9638 { "sarxS", { Gdq, Edq, VexGdq }, 0 }, 9639 }, 9640 9641 /* VEX_LEN_0F38F7_P_2 */ 9642 { 9643 { "shlxS", { Gdq, Edq, VexGdq }, 0 }, 9644 }, 9645 9646 /* VEX_LEN_0F38F7_P_3 */ 9647 { 9648 { "shrxS", { Gdq, Edq, VexGdq }, 0 }, 9649 }, 9650 9651 /* VEX_LEN_0F3A00_P_2 */ 9652 { 9653 { Bad_Opcode }, 9654 { VEX_W_TABLE (VEX_W_0F3A00_P_2) }, 9655 }, 9656 9657 /* VEX_LEN_0F3A01_P_2 */ 9658 { 9659 { Bad_Opcode }, 9660 { VEX_W_TABLE (VEX_W_0F3A01_P_2) }, 9661 }, 9662 9663 /* VEX_LEN_0F3A06_P_2 */ 9664 { 9665 { Bad_Opcode }, 9666 { VEX_W_TABLE (VEX_W_0F3A06_P_2) }, 9667 }, 9668 9669 /* VEX_LEN_0F3A14_P_2 */ 9670 { 9671 { "vpextrb", { Edqb, XM, Ib }, 0 }, 9672 }, 9673 9674 /* VEX_LEN_0F3A15_P_2 */ 9675 { 9676 { "vpextrw", { Edqw, XM, Ib }, 0 }, 9677 }, 9678 9679 /* VEX_LEN_0F3A16_P_2 */ 9680 { 9681 { "vpextrK", { Edq, XM, Ib }, 0 }, 9682 }, 9683 9684 /* VEX_LEN_0F3A17_P_2 */ 9685 { 9686 { "vextractps", { Edqd, XM, Ib }, 0 }, 9687 }, 9688 9689 /* VEX_LEN_0F3A18_P_2 */ 9690 { 9691 { Bad_Opcode }, 9692 { VEX_W_TABLE (VEX_W_0F3A18_P_2) }, 9693 }, 9694 9695 /* VEX_LEN_0F3A19_P_2 */ 9696 { 9697 { Bad_Opcode }, 9698 { VEX_W_TABLE (VEX_W_0F3A19_P_2) }, 9699 }, 9700 9701 /* VEX_LEN_0F3A20_P_2 */ 9702 { 9703 { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 }, 9704 }, 9705 9706 /* VEX_LEN_0F3A21_P_2 */ 9707 { 9708 { "vinsertps", { XM, Vex128, EXd, Ib }, 0 }, 9709 }, 9710 9711 /* VEX_LEN_0F3A22_P_2 */ 9712 { 9713 { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 }, 9714 }, 9715 9716 /* VEX_LEN_0F3A30_P_2 */ 9717 { 9718 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) }, 9719 }, 9720 9721 /* VEX_LEN_0F3A31_P_2 */ 9722 { 9723 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) }, 9724 }, 9725 9726 /* VEX_LEN_0F3A32_P_2 */ 9727 { 9728 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) }, 9729 }, 9730 9731 /* VEX_LEN_0F3A33_P_2 */ 9732 { 9733 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) }, 9734 }, 9735 9736 /* VEX_LEN_0F3A38_P_2 */ 9737 { 9738 { Bad_Opcode }, 9739 { VEX_W_TABLE (VEX_W_0F3A38_P_2) }, 9740 }, 9741 9742 /* VEX_LEN_0F3A39_P_2 */ 9743 { 9744 { Bad_Opcode }, 9745 { VEX_W_TABLE (VEX_W_0F3A39_P_2) }, 9746 }, 9747 9748 /* VEX_LEN_0F3A41_P_2 */ 9749 { 9750 { "vdppd", { XM, Vex128, EXx, Ib }, 0 }, 9751 }, 9752 9753 /* VEX_LEN_0F3A46_P_2 */ 9754 { 9755 { Bad_Opcode }, 9756 { VEX_W_TABLE (VEX_W_0F3A46_P_2) }, 9757 }, 9758 9759 /* VEX_LEN_0F3A60_P_2 */ 9760 { 9761 { "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 }, 9762 }, 9763 9764 /* VEX_LEN_0F3A61_P_2 */ 9765 { 9766 { "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 }, 9767 }, 9768 9769 /* VEX_LEN_0F3A62_P_2 */ 9770 { 9771 { "vpcmpistrm", { XM, EXx, Ib }, 0 }, 9772 }, 9773 9774 /* VEX_LEN_0F3A63_P_2 */ 9775 { 9776 { "vpcmpistri", { XM, EXx, Ib }, 0 }, 9777 }, 9778 9779 /* VEX_LEN_0F3A6A_P_2 */ 9780 { 9781 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 }, 9782 }, 9783 9784 /* VEX_LEN_0F3A6B_P_2 */ 9785 { 9786 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 }, 9787 }, 9788 9789 /* VEX_LEN_0F3A6E_P_2 */ 9790 { 9791 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 }, 9792 }, 9793 9794 /* VEX_LEN_0F3A6F_P_2 */ 9795 { 9796 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 }, 9797 }, 9798 9799 /* VEX_LEN_0F3A7A_P_2 */ 9800 { 9801 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 }, 9802 }, 9803 9804 /* VEX_LEN_0F3A7B_P_2 */ 9805 { 9806 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 }, 9807 }, 9808 9809 /* VEX_LEN_0F3A7E_P_2 */ 9810 { 9811 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 }, 9812 }, 9813 9814 /* VEX_LEN_0F3A7F_P_2 */ 9815 { 9816 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 }, 9817 }, 9818 9819 /* VEX_LEN_0F3ADF_P_2 */ 9820 { 9821 { "vaeskeygenassist", { XM, EXx, Ib }, 0 }, 9822 }, 9823 9824 /* VEX_LEN_0F3AF0_P_3 */ 9825 { 9826 { "rorxS", { Gdq, Edq, Ib }, 0 }, 9827 }, 9828 9829 /* VEX_LEN_0FXOP_08_CC */ 9830 { 9831 { "vpcomb", { XM, Vex128, EXx, VPCOM }, 0 }, 9832 }, 9833 9834 /* VEX_LEN_0FXOP_08_CD */ 9835 { 9836 { "vpcomw", { XM, Vex128, EXx, VPCOM }, 0 }, 9837 }, 9838 9839 /* VEX_LEN_0FXOP_08_CE */ 9840 { 9841 { "vpcomd", { XM, Vex128, EXx, VPCOM }, 0 }, 9842 }, 9843 9844 /* VEX_LEN_0FXOP_08_CF */ 9845 { 9846 { "vpcomq", { XM, Vex128, EXx, VPCOM }, 0 }, 9847 }, 9848 9849 /* VEX_LEN_0FXOP_08_EC */ 9850 { 9851 { "vpcomub", { XM, Vex128, EXx, VPCOM }, 0 }, 9852 }, 9853 9854 /* VEX_LEN_0FXOP_08_ED */ 9855 { 9856 { "vpcomuw", { XM, Vex128, EXx, VPCOM }, 0 }, 9857 }, 9858 9859 /* VEX_LEN_0FXOP_08_EE */ 9860 { 9861 { "vpcomud", { XM, Vex128, EXx, VPCOM }, 0 }, 9862 }, 9863 9864 /* VEX_LEN_0FXOP_08_EF */ 9865 { 9866 { "vpcomuq", { XM, Vex128, EXx, VPCOM }, 0 }, 9867 }, 9868 9869 /* VEX_LEN_0FXOP_09_80 */ 9870 { 9871 { "vfrczps", { XM, EXxmm }, 0 }, 9872 { "vfrczps", { XM, EXymmq }, 0 }, 9873 }, 9874 9875 /* VEX_LEN_0FXOP_09_81 */ 9876 { 9877 { "vfrczpd", { XM, EXxmm }, 0 }, 9878 { "vfrczpd", { XM, EXymmq }, 0 }, 9879 }, 9880 }; 9881 9882 static const struct dis386 evex_len_table[][3] = { 9883 #define NEED_EVEX_LEN_TABLE 9884 #include "i386-dis-evex.h" 9885 #undef NEED_EVEX_LEN_TABLE 9886 }; 9887 9888 static const struct dis386 vex_w_table[][2] = { 9889 { 9890 /* VEX_W_0F41_P_0_LEN_1 */ 9891 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) }, 9892 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) }, 9893 }, 9894 { 9895 /* VEX_W_0F41_P_2_LEN_1 */ 9896 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) }, 9897 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) } 9898 }, 9899 { 9900 /* VEX_W_0F42_P_0_LEN_1 */ 9901 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) }, 9902 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) }, 9903 }, 9904 { 9905 /* VEX_W_0F42_P_2_LEN_1 */ 9906 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) }, 9907 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) }, 9908 }, 9909 { 9910 /* VEX_W_0F44_P_0_LEN_0 */ 9911 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) }, 9912 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) }, 9913 }, 9914 { 9915 /* VEX_W_0F44_P_2_LEN_0 */ 9916 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) }, 9917 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) }, 9918 }, 9919 { 9920 /* VEX_W_0F45_P_0_LEN_1 */ 9921 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) }, 9922 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) }, 9923 }, 9924 { 9925 /* VEX_W_0F45_P_2_LEN_1 */ 9926 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) }, 9927 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) }, 9928 }, 9929 { 9930 /* VEX_W_0F46_P_0_LEN_1 */ 9931 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) }, 9932 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) }, 9933 }, 9934 { 9935 /* VEX_W_0F46_P_2_LEN_1 */ 9936 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) }, 9937 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) }, 9938 }, 9939 { 9940 /* VEX_W_0F47_P_0_LEN_1 */ 9941 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) }, 9942 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) }, 9943 }, 9944 { 9945 /* VEX_W_0F47_P_2_LEN_1 */ 9946 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) }, 9947 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) }, 9948 }, 9949 { 9950 /* VEX_W_0F4A_P_0_LEN_1 */ 9951 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) }, 9952 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) }, 9953 }, 9954 { 9955 /* VEX_W_0F4A_P_2_LEN_1 */ 9956 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) }, 9957 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) }, 9958 }, 9959 { 9960 /* VEX_W_0F4B_P_0_LEN_1 */ 9961 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) }, 9962 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) }, 9963 }, 9964 { 9965 /* VEX_W_0F4B_P_2_LEN_1 */ 9966 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) }, 9967 }, 9968 { 9969 /* VEX_W_0F90_P_0_LEN_0 */ 9970 { "kmovw", { MaskG, MaskE }, 0 }, 9971 { "kmovq", { MaskG, MaskE }, 0 }, 9972 }, 9973 { 9974 /* VEX_W_0F90_P_2_LEN_0 */ 9975 { "kmovb", { MaskG, MaskBDE }, 0 }, 9976 { "kmovd", { MaskG, MaskBDE }, 0 }, 9977 }, 9978 { 9979 /* VEX_W_0F91_P_0_LEN_0 */ 9980 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) }, 9981 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) }, 9982 }, 9983 { 9984 /* VEX_W_0F91_P_2_LEN_0 */ 9985 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) }, 9986 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) }, 9987 }, 9988 { 9989 /* VEX_W_0F92_P_0_LEN_0 */ 9990 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) }, 9991 }, 9992 { 9993 /* VEX_W_0F92_P_2_LEN_0 */ 9994 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) }, 9995 }, 9996 { 9997 /* VEX_W_0F93_P_0_LEN_0 */ 9998 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) }, 9999 }, 10000 { 10001 /* VEX_W_0F93_P_2_LEN_0 */ 10002 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) }, 10003 }, 10004 { 10005 /* VEX_W_0F98_P_0_LEN_0 */ 10006 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) }, 10007 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) }, 10008 }, 10009 { 10010 /* VEX_W_0F98_P_2_LEN_0 */ 10011 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) }, 10012 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) }, 10013 }, 10014 { 10015 /* VEX_W_0F99_P_0_LEN_0 */ 10016 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) }, 10017 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) }, 10018 }, 10019 { 10020 /* VEX_W_0F99_P_2_LEN_0 */ 10021 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) }, 10022 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) }, 10023 }, 10024 { 10025 /* VEX_W_0F380C_P_2 */ 10026 { "vpermilps", { XM, Vex, EXx }, 0 }, 10027 }, 10028 { 10029 /* VEX_W_0F380D_P_2 */ 10030 { "vpermilpd", { XM, Vex, EXx }, 0 }, 10031 }, 10032 { 10033 /* VEX_W_0F380E_P_2 */ 10034 { "vtestps", { XM, EXx }, 0 }, 10035 }, 10036 { 10037 /* VEX_W_0F380F_P_2 */ 10038 { "vtestpd", { XM, EXx }, 0 }, 10039 }, 10040 { 10041 /* VEX_W_0F3816_P_2 */ 10042 { "vpermps", { XM, Vex, EXx }, 0 }, 10043 }, 10044 { 10045 /* VEX_W_0F3818_P_2 */ 10046 { "vbroadcastss", { XM, EXxmm_md }, 0 }, 10047 }, 10048 { 10049 /* VEX_W_0F3819_P_2 */ 10050 { "vbroadcastsd", { XM, EXxmm_mq }, 0 }, 10051 }, 10052 { 10053 /* VEX_W_0F381A_P_2_M_0 */ 10054 { "vbroadcastf128", { XM, Mxmm }, 0 }, 10055 }, 10056 { 10057 /* VEX_W_0F382C_P_2_M_0 */ 10058 { "vmaskmovps", { XM, Vex, Mx }, 0 }, 10059 }, 10060 { 10061 /* VEX_W_0F382D_P_2_M_0 */ 10062 { "vmaskmovpd", { XM, Vex, Mx }, 0 }, 10063 }, 10064 { 10065 /* VEX_W_0F382E_P_2_M_0 */ 10066 { "vmaskmovps", { Mx, Vex, XM }, 0 }, 10067 }, 10068 { 10069 /* VEX_W_0F382F_P_2_M_0 */ 10070 { "vmaskmovpd", { Mx, Vex, XM }, 0 }, 10071 }, 10072 { 10073 /* VEX_W_0F3836_P_2 */ 10074 { "vpermd", { XM, Vex, EXx }, 0 }, 10075 }, 10076 { 10077 /* VEX_W_0F3846_P_2 */ 10078 { "vpsravd", { XM, Vex, EXx }, 0 }, 10079 }, 10080 { 10081 /* VEX_W_0F3858_P_2 */ 10082 { "vpbroadcastd", { XM, EXxmm_md }, 0 }, 10083 }, 10084 { 10085 /* VEX_W_0F3859_P_2 */ 10086 { "vpbroadcastq", { XM, EXxmm_mq }, 0 }, 10087 }, 10088 { 10089 /* VEX_W_0F385A_P_2_M_0 */ 10090 { "vbroadcasti128", { XM, Mxmm }, 0 }, 10091 }, 10092 { 10093 /* VEX_W_0F3878_P_2 */ 10094 { "vpbroadcastb", { XM, EXxmm_mb }, 0 }, 10095 }, 10096 { 10097 /* VEX_W_0F3879_P_2 */ 10098 { "vpbroadcastw", { XM, EXxmm_mw }, 0 }, 10099 }, 10100 { 10101 /* VEX_W_0F38CF_P_2 */ 10102 { "vgf2p8mulb", { XM, Vex, EXx }, 0 }, 10103 }, 10104 { 10105 /* VEX_W_0F3A00_P_2 */ 10106 { Bad_Opcode }, 10107 { "vpermq", { XM, EXx, Ib }, 0 }, 10108 }, 10109 { 10110 /* VEX_W_0F3A01_P_2 */ 10111 { Bad_Opcode }, 10112 { "vpermpd", { XM, EXx, Ib }, 0 }, 10113 }, 10114 { 10115 /* VEX_W_0F3A02_P_2 */ 10116 { "vpblendd", { XM, Vex, EXx, Ib }, 0 }, 10117 }, 10118 { 10119 /* VEX_W_0F3A04_P_2 */ 10120 { "vpermilps", { XM, EXx, Ib }, 0 }, 10121 }, 10122 { 10123 /* VEX_W_0F3A05_P_2 */ 10124 { "vpermilpd", { XM, EXx, Ib }, 0 }, 10125 }, 10126 { 10127 /* VEX_W_0F3A06_P_2 */ 10128 { "vperm2f128", { XM, Vex256, EXx, Ib }, 0 }, 10129 }, 10130 { 10131 /* VEX_W_0F3A18_P_2 */ 10132 { "vinsertf128", { XM, Vex256, EXxmm, Ib }, 0 }, 10133 }, 10134 { 10135 /* VEX_W_0F3A19_P_2 */ 10136 { "vextractf128", { EXxmm, XM, Ib }, 0 }, 10137 }, 10138 { 10139 /* VEX_W_0F3A30_P_2_LEN_0 */ 10140 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) }, 10141 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) }, 10142 }, 10143 { 10144 /* VEX_W_0F3A31_P_2_LEN_0 */ 10145 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) }, 10146 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) }, 10147 }, 10148 { 10149 /* VEX_W_0F3A32_P_2_LEN_0 */ 10150 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) }, 10151 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) }, 10152 }, 10153 { 10154 /* VEX_W_0F3A33_P_2_LEN_0 */ 10155 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) }, 10156 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) }, 10157 }, 10158 { 10159 /* VEX_W_0F3A38_P_2 */ 10160 { "vinserti128", { XM, Vex256, EXxmm, Ib }, 0 }, 10161 }, 10162 { 10163 /* VEX_W_0F3A39_P_2 */ 10164 { "vextracti128", { EXxmm, XM, Ib }, 0 }, 10165 }, 10166 { 10167 /* VEX_W_0F3A46_P_2 */ 10168 { "vperm2i128", { XM, Vex256, EXx, Ib }, 0 }, 10169 }, 10170 { 10171 /* VEX_W_0F3A48_P_2 */ 10172 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 }, 10173 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 }, 10174 }, 10175 { 10176 /* VEX_W_0F3A49_P_2 */ 10177 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 }, 10178 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 }, 10179 }, 10180 { 10181 /* VEX_W_0F3A4A_P_2 */ 10182 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, 0 }, 10183 }, 10184 { 10185 /* VEX_W_0F3A4B_P_2 */ 10186 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, 0 }, 10187 }, 10188 { 10189 /* VEX_W_0F3A4C_P_2 */ 10190 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, 0 }, 10191 }, 10192 { 10193 /* VEX_W_0F3ACE_P_2 */ 10194 { Bad_Opcode }, 10195 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 }, 10196 }, 10197 { 10198 /* VEX_W_0F3ACF_P_2 */ 10199 { Bad_Opcode }, 10200 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, 0 }, 10201 }, 10202 #define NEED_VEX_W_TABLE 10203 #include "i386-dis-evex.h" 10204 #undef NEED_VEX_W_TABLE 10205 }; 10206 10207 static const struct dis386 mod_table[][2] = { 10208 { 10209 /* MOD_8D */ 10210 { "leaS", { Gv, M }, 0 }, 10211 }, 10212 { 10213 /* MOD_C6_REG_7 */ 10214 { Bad_Opcode }, 10215 { RM_TABLE (RM_C6_REG_7) }, 10216 }, 10217 { 10218 /* MOD_C7_REG_7 */ 10219 { Bad_Opcode }, 10220 { RM_TABLE (RM_C7_REG_7) }, 10221 }, 10222 { 10223 /* MOD_FF_REG_3 */ 10224 { "Jcall^", { indirEp }, 0 }, 10225 }, 10226 { 10227 /* MOD_FF_REG_5 */ 10228 { "Jjmp^", { indirEp }, 0 }, 10229 }, 10230 { 10231 /* MOD_0F01_REG_0 */ 10232 { X86_64_TABLE (X86_64_0F01_REG_0) }, 10233 { RM_TABLE (RM_0F01_REG_0) }, 10234 }, 10235 { 10236 /* MOD_0F01_REG_1 */ 10237 { X86_64_TABLE (X86_64_0F01_REG_1) }, 10238 { RM_TABLE (RM_0F01_REG_1) }, 10239 }, 10240 { 10241 /* MOD_0F01_REG_2 */ 10242 { X86_64_TABLE (X86_64_0F01_REG_2) }, 10243 { RM_TABLE (RM_0F01_REG_2) }, 10244 }, 10245 { 10246 /* MOD_0F01_REG_3 */ 10247 { X86_64_TABLE (X86_64_0F01_REG_3) }, 10248 { RM_TABLE (RM_0F01_REG_3) }, 10249 }, 10250 { 10251 /* MOD_0F01_REG_5 */ 10252 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) }, 10253 { RM_TABLE (RM_0F01_REG_5) }, 10254 }, 10255 { 10256 /* MOD_0F01_REG_7 */ 10257 { "invlpg", { Mb }, 0 }, 10258 { RM_TABLE (RM_0F01_REG_7) }, 10259 }, 10260 { 10261 /* MOD_0F12_PREFIX_0 */ 10262 { "movlps", { XM, EXq }, PREFIX_OPCODE }, 10263 { "movhlps", { XM, EXq }, PREFIX_OPCODE }, 10264 }, 10265 { 10266 /* MOD_0F13 */ 10267 { "movlpX", { EXq, XM }, PREFIX_OPCODE }, 10268 }, 10269 { 10270 /* MOD_0F16_PREFIX_0 */ 10271 { "movhps", { XM, EXq }, 0 }, 10272 { "movlhps", { XM, EXq }, 0 }, 10273 }, 10274 { 10275 /* MOD_0F17 */ 10276 { "movhpX", { EXq, XM }, PREFIX_OPCODE }, 10277 }, 10278 { 10279 /* MOD_0F18_REG_0 */ 10280 { "prefetchnta", { Mb }, 0 }, 10281 }, 10282 { 10283 /* MOD_0F18_REG_1 */ 10284 { "prefetcht0", { Mb }, 0 }, 10285 }, 10286 { 10287 /* MOD_0F18_REG_2 */ 10288 { "prefetcht1", { Mb }, 0 }, 10289 }, 10290 { 10291 /* MOD_0F18_REG_3 */ 10292 { "prefetcht2", { Mb }, 0 }, 10293 }, 10294 { 10295 /* MOD_0F18_REG_4 */ 10296 { "nop/reserved", { Mb }, 0 }, 10297 }, 10298 { 10299 /* MOD_0F18_REG_5 */ 10300 { "nop/reserved", { Mb }, 0 }, 10301 }, 10302 { 10303 /* MOD_0F18_REG_6 */ 10304 { "nop/reserved", { Mb }, 0 }, 10305 }, 10306 { 10307 /* MOD_0F18_REG_7 */ 10308 { "nop/reserved", { Mb }, 0 }, 10309 }, 10310 { 10311 /* MOD_0F1A_PREFIX_0 */ 10312 { "bndldx", { Gbnd, Mv_bnd }, 0 }, 10313 { "nopQ", { Ev }, 0 }, 10314 }, 10315 { 10316 /* MOD_0F1B_PREFIX_0 */ 10317 { "bndstx", { Mv_bnd, Gbnd }, 0 }, 10318 { "nopQ", { Ev }, 0 }, 10319 }, 10320 { 10321 /* MOD_0F1B_PREFIX_1 */ 10322 { "bndmk", { Gbnd, Mv_bnd }, 0 }, 10323 { "nopQ", { Ev }, 0 }, 10324 }, 10325 { 10326 /* MOD_0F1C_PREFIX_0 */ 10327 { REG_TABLE (REG_0F1C_MOD_0) }, 10328 { "nopQ", { Ev }, 0 }, 10329 }, 10330 { 10331 /* MOD_0F1E_PREFIX_1 */ 10332 { "nopQ", { Ev }, 0 }, 10333 { REG_TABLE (REG_0F1E_MOD_3) }, 10334 }, 10335 { 10336 /* MOD_0F24 */ 10337 { Bad_Opcode }, 10338 { "movL", { Rd, Td }, 0 }, 10339 }, 10340 { 10341 /* MOD_0F26 */ 10342 { Bad_Opcode }, 10343 { "movL", { Td, Rd }, 0 }, 10344 }, 10345 { 10346 /* MOD_0F2B_PREFIX_0 */ 10347 {"movntps", { Mx, XM }, PREFIX_OPCODE }, 10348 }, 10349 { 10350 /* MOD_0F2B_PREFIX_1 */ 10351 {"movntss", { Md, XM }, PREFIX_OPCODE }, 10352 }, 10353 { 10354 /* MOD_0F2B_PREFIX_2 */ 10355 {"movntpd", { Mx, XM }, PREFIX_OPCODE }, 10356 }, 10357 { 10358 /* MOD_0F2B_PREFIX_3 */ 10359 {"movntsd", { Mq, XM }, PREFIX_OPCODE }, 10360 }, 10361 { 10362 /* MOD_0F51 */ 10363 { Bad_Opcode }, 10364 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE }, 10365 }, 10366 { 10367 /* MOD_0F71_REG_2 */ 10368 { Bad_Opcode }, 10369 { "psrlw", { MS, Ib }, 0 }, 10370 }, 10371 { 10372 /* MOD_0F71_REG_4 */ 10373 { Bad_Opcode }, 10374 { "psraw", { MS, Ib }, 0 }, 10375 }, 10376 { 10377 /* MOD_0F71_REG_6 */ 10378 { Bad_Opcode }, 10379 { "psllw", { MS, Ib }, 0 }, 10380 }, 10381 { 10382 /* MOD_0F72_REG_2 */ 10383 { Bad_Opcode }, 10384 { "psrld", { MS, Ib }, 0 }, 10385 }, 10386 { 10387 /* MOD_0F72_REG_4 */ 10388 { Bad_Opcode }, 10389 { "psrad", { MS, Ib }, 0 }, 10390 }, 10391 { 10392 /* MOD_0F72_REG_6 */ 10393 { Bad_Opcode }, 10394 { "pslld", { MS, Ib }, 0 }, 10395 }, 10396 { 10397 /* MOD_0F73_REG_2 */ 10398 { Bad_Opcode }, 10399 { "psrlq", { MS, Ib }, 0 }, 10400 }, 10401 { 10402 /* MOD_0F73_REG_3 */ 10403 { Bad_Opcode }, 10404 { PREFIX_TABLE (PREFIX_0F73_REG_3) }, 10405 }, 10406 { 10407 /* MOD_0F73_REG_6 */ 10408 { Bad_Opcode }, 10409 { "psllq", { MS, Ib }, 0 }, 10410 }, 10411 { 10412 /* MOD_0F73_REG_7 */ 10413 { Bad_Opcode }, 10414 { PREFIX_TABLE (PREFIX_0F73_REG_7) }, 10415 }, 10416 { 10417 /* MOD_0FAE_REG_0 */ 10418 { "fxsave", { FXSAVE }, 0 }, 10419 { PREFIX_TABLE (PREFIX_0FAE_REG_0) }, 10420 }, 10421 { 10422 /* MOD_0FAE_REG_1 */ 10423 { "fxrstor", { FXSAVE }, 0 }, 10424 { PREFIX_TABLE (PREFIX_0FAE_REG_1) }, 10425 }, 10426 { 10427 /* MOD_0FAE_REG_2 */ 10428 { "ldmxcsr", { Md }, 0 }, 10429 { PREFIX_TABLE (PREFIX_0FAE_REG_2) }, 10430 }, 10431 { 10432 /* MOD_0FAE_REG_3 */ 10433 { "stmxcsr", { Md }, 0 }, 10434 { PREFIX_TABLE (PREFIX_0FAE_REG_3) }, 10435 }, 10436 { 10437 /* MOD_0FAE_REG_4 */ 10438 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) }, 10439 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) }, 10440 }, 10441 { 10442 /* MOD_0FAE_REG_5 */ 10443 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) }, 10444 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) }, 10445 }, 10446 { 10447 /* MOD_0FAE_REG_6 */ 10448 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) }, 10449 { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) }, 10450 }, 10451 { 10452 /* MOD_0FAE_REG_7 */ 10453 { PREFIX_TABLE (PREFIX_0FAE_REG_7) }, 10454 { RM_TABLE (RM_0FAE_REG_7) }, 10455 }, 10456 { 10457 /* MOD_0FB2 */ 10458 { "lssS", { Gv, Mp }, 0 }, 10459 }, 10460 { 10461 /* MOD_0FB4 */ 10462 { "lfsS", { Gv, Mp }, 0 }, 10463 }, 10464 { 10465 /* MOD_0FB5 */ 10466 { "lgsS", { Gv, Mp }, 0 }, 10467 }, 10468 { 10469 /* MOD_0FC3 */ 10470 { PREFIX_TABLE (PREFIX_MOD_0_0FC3) }, 10471 }, 10472 { 10473 /* MOD_0FC7_REG_3 */ 10474 { "xrstors", { FXSAVE }, 0 }, 10475 }, 10476 { 10477 /* MOD_0FC7_REG_4 */ 10478 { "xsavec", { FXSAVE }, 0 }, 10479 }, 10480 { 10481 /* MOD_0FC7_REG_5 */ 10482 { "xsaves", { FXSAVE }, 0 }, 10483 }, 10484 { 10485 /* MOD_0FC7_REG_6 */ 10486 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) }, 10487 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) } 10488 }, 10489 { 10490 /* MOD_0FC7_REG_7 */ 10491 { "vmptrst", { Mq }, 0 }, 10492 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) } 10493 }, 10494 { 10495 /* MOD_0FD7 */ 10496 { Bad_Opcode }, 10497 { "pmovmskb", { Gdq, MS }, 0 }, 10498 }, 10499 { 10500 /* MOD_0FE7_PREFIX_2 */ 10501 { "movntdq", { Mx, XM }, 0 }, 10502 }, 10503 { 10504 /* MOD_0FF0_PREFIX_3 */ 10505 { "lddqu", { XM, M }, 0 }, 10506 }, 10507 { 10508 /* MOD_0F382A_PREFIX_2 */ 10509 { "movntdqa", { XM, Mx }, 0 }, 10510 }, 10511 { 10512 /* MOD_0F38F5_PREFIX_2 */ 10513 { "wrussK", { M, Gdq }, PREFIX_OPCODE }, 10514 }, 10515 { 10516 /* MOD_0F38F6_PREFIX_0 */ 10517 { "wrssK", { M, Gdq }, PREFIX_OPCODE }, 10518 }, 10519 { 10520 /* MOD_0F38F8_PREFIX_2 */ 10521 { "movdir64b", { Gva, M }, PREFIX_OPCODE }, 10522 }, 10523 { 10524 /* MOD_0F38F9_PREFIX_0 */ 10525 { "movdiri", { Em, Gv }, PREFIX_OPCODE }, 10526 }, 10527 { 10528 /* MOD_62_32BIT */ 10529 { "bound{S|}", { Gv, Ma }, 0 }, 10530 { EVEX_TABLE (EVEX_0F) }, 10531 }, 10532 { 10533 /* MOD_C4_32BIT */ 10534 { "lesS", { Gv, Mp }, 0 }, 10535 { VEX_C4_TABLE (VEX_0F) }, 10536 }, 10537 { 10538 /* MOD_C5_32BIT */ 10539 { "ldsS", { Gv, Mp }, 0 }, 10540 { VEX_C5_TABLE (VEX_0F) }, 10541 }, 10542 { 10543 /* MOD_VEX_0F12_PREFIX_0 */ 10544 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) }, 10545 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) }, 10546 }, 10547 { 10548 /* MOD_VEX_0F13 */ 10549 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) }, 10550 }, 10551 { 10552 /* MOD_VEX_0F16_PREFIX_0 */ 10553 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) }, 10554 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) }, 10555 }, 10556 { 10557 /* MOD_VEX_0F17 */ 10558 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) }, 10559 }, 10560 { 10561 /* MOD_VEX_0F2B */ 10562 { "vmovntpX", { Mx, XM }, 0 }, 10563 }, 10564 { 10565 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */ 10566 { Bad_Opcode }, 10567 { "kandw", { MaskG, MaskVex, MaskR }, 0 }, 10568 }, 10569 { 10570 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */ 10571 { Bad_Opcode }, 10572 { "kandq", { MaskG, MaskVex, MaskR }, 0 }, 10573 }, 10574 { 10575 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */ 10576 { Bad_Opcode }, 10577 { "kandb", { MaskG, MaskVex, MaskR }, 0 }, 10578 }, 10579 { 10580 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */ 10581 { Bad_Opcode }, 10582 { "kandd", { MaskG, MaskVex, MaskR }, 0 }, 10583 }, 10584 { 10585 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */ 10586 { Bad_Opcode }, 10587 { "kandnw", { MaskG, MaskVex, MaskR }, 0 }, 10588 }, 10589 { 10590 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */ 10591 { Bad_Opcode }, 10592 { "kandnq", { MaskG, MaskVex, MaskR }, 0 }, 10593 }, 10594 { 10595 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */ 10596 { Bad_Opcode }, 10597 { "kandnb", { MaskG, MaskVex, MaskR }, 0 }, 10598 }, 10599 { 10600 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */ 10601 { Bad_Opcode }, 10602 { "kandnd", { MaskG, MaskVex, MaskR }, 0 }, 10603 }, 10604 { 10605 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */ 10606 { Bad_Opcode }, 10607 { "knotw", { MaskG, MaskR }, 0 }, 10608 }, 10609 { 10610 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */ 10611 { Bad_Opcode }, 10612 { "knotq", { MaskG, MaskR }, 0 }, 10613 }, 10614 { 10615 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */ 10616 { Bad_Opcode }, 10617 { "knotb", { MaskG, MaskR }, 0 }, 10618 }, 10619 { 10620 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */ 10621 { Bad_Opcode }, 10622 { "knotd", { MaskG, MaskR }, 0 }, 10623 }, 10624 { 10625 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */ 10626 { Bad_Opcode }, 10627 { "korw", { MaskG, MaskVex, MaskR }, 0 }, 10628 }, 10629 { 10630 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */ 10631 { Bad_Opcode }, 10632 { "korq", { MaskG, MaskVex, MaskR }, 0 }, 10633 }, 10634 { 10635 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */ 10636 { Bad_Opcode }, 10637 { "korb", { MaskG, MaskVex, MaskR }, 0 }, 10638 }, 10639 { 10640 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */ 10641 { Bad_Opcode }, 10642 { "kord", { MaskG, MaskVex, MaskR }, 0 }, 10643 }, 10644 { 10645 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */ 10646 { Bad_Opcode }, 10647 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 }, 10648 }, 10649 { 10650 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */ 10651 { Bad_Opcode }, 10652 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 }, 10653 }, 10654 { 10655 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */ 10656 { Bad_Opcode }, 10657 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 }, 10658 }, 10659 { 10660 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */ 10661 { Bad_Opcode }, 10662 { "kxnord", { MaskG, MaskVex, MaskR }, 0 }, 10663 }, 10664 { 10665 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */ 10666 { Bad_Opcode }, 10667 { "kxorw", { MaskG, MaskVex, MaskR }, 0 }, 10668 }, 10669 { 10670 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */ 10671 { Bad_Opcode }, 10672 { "kxorq", { MaskG, MaskVex, MaskR }, 0 }, 10673 }, 10674 { 10675 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */ 10676 { Bad_Opcode }, 10677 { "kxorb", { MaskG, MaskVex, MaskR }, 0 }, 10678 }, 10679 { 10680 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */ 10681 { Bad_Opcode }, 10682 { "kxord", { MaskG, MaskVex, MaskR }, 0 }, 10683 }, 10684 { 10685 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */ 10686 { Bad_Opcode }, 10687 { "kaddw", { MaskG, MaskVex, MaskR }, 0 }, 10688 }, 10689 { 10690 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */ 10691 { Bad_Opcode }, 10692 { "kaddq", { MaskG, MaskVex, MaskR }, 0 }, 10693 }, 10694 { 10695 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */ 10696 { Bad_Opcode }, 10697 { "kaddb", { MaskG, MaskVex, MaskR }, 0 }, 10698 }, 10699 { 10700 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */ 10701 { Bad_Opcode }, 10702 { "kaddd", { MaskG, MaskVex, MaskR }, 0 }, 10703 }, 10704 { 10705 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */ 10706 { Bad_Opcode }, 10707 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 }, 10708 }, 10709 { 10710 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */ 10711 { Bad_Opcode }, 10712 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 }, 10713 }, 10714 { 10715 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */ 10716 { Bad_Opcode }, 10717 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 }, 10718 }, 10719 { 10720 /* MOD_VEX_0F50 */ 10721 { Bad_Opcode }, 10722 { "vmovmskpX", { Gdq, XS }, 0 }, 10723 }, 10724 { 10725 /* MOD_VEX_0F71_REG_2 */ 10726 { Bad_Opcode }, 10727 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) }, 10728 }, 10729 { 10730 /* MOD_VEX_0F71_REG_4 */ 10731 { Bad_Opcode }, 10732 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) }, 10733 }, 10734 { 10735 /* MOD_VEX_0F71_REG_6 */ 10736 { Bad_Opcode }, 10737 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) }, 10738 }, 10739 { 10740 /* MOD_VEX_0F72_REG_2 */ 10741 { Bad_Opcode }, 10742 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) }, 10743 }, 10744 { 10745 /* MOD_VEX_0F72_REG_4 */ 10746 { Bad_Opcode }, 10747 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) }, 10748 }, 10749 { 10750 /* MOD_VEX_0F72_REG_6 */ 10751 { Bad_Opcode }, 10752 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) }, 10753 }, 10754 { 10755 /* MOD_VEX_0F73_REG_2 */ 10756 { Bad_Opcode }, 10757 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) }, 10758 }, 10759 { 10760 /* MOD_VEX_0F73_REG_3 */ 10761 { Bad_Opcode }, 10762 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) }, 10763 }, 10764 { 10765 /* MOD_VEX_0F73_REG_6 */ 10766 { Bad_Opcode }, 10767 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) }, 10768 }, 10769 { 10770 /* MOD_VEX_0F73_REG_7 */ 10771 { Bad_Opcode }, 10772 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) }, 10773 }, 10774 { 10775 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */ 10776 { "kmovw", { Ew, MaskG }, 0 }, 10777 { Bad_Opcode }, 10778 }, 10779 { 10780 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */ 10781 { "kmovq", { Eq, MaskG }, 0 }, 10782 { Bad_Opcode }, 10783 }, 10784 { 10785 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */ 10786 { "kmovb", { Eb, MaskG }, 0 }, 10787 { Bad_Opcode }, 10788 }, 10789 { 10790 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */ 10791 { "kmovd", { Ed, MaskG }, 0 }, 10792 { Bad_Opcode }, 10793 }, 10794 { 10795 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */ 10796 { Bad_Opcode }, 10797 { "kmovw", { MaskG, Rdq }, 0 }, 10798 }, 10799 { 10800 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */ 10801 { Bad_Opcode }, 10802 { "kmovb", { MaskG, Rdq }, 0 }, 10803 }, 10804 { 10805 /* MOD_VEX_0F92_P_3_LEN_0 */ 10806 { Bad_Opcode }, 10807 { "kmovK", { MaskG, Rdq }, 0 }, 10808 }, 10809 { 10810 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */ 10811 { Bad_Opcode }, 10812 { "kmovw", { Gdq, MaskR }, 0 }, 10813 }, 10814 { 10815 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */ 10816 { Bad_Opcode }, 10817 { "kmovb", { Gdq, MaskR }, 0 }, 10818 }, 10819 { 10820 /* MOD_VEX_0F93_P_3_LEN_0 */ 10821 { Bad_Opcode }, 10822 { "kmovK", { Gdq, MaskR }, 0 }, 10823 }, 10824 { 10825 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */ 10826 { Bad_Opcode }, 10827 { "kortestw", { MaskG, MaskR }, 0 }, 10828 }, 10829 { 10830 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */ 10831 { Bad_Opcode }, 10832 { "kortestq", { MaskG, MaskR }, 0 }, 10833 }, 10834 { 10835 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */ 10836 { Bad_Opcode }, 10837 { "kortestb", { MaskG, MaskR }, 0 }, 10838 }, 10839 { 10840 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */ 10841 { Bad_Opcode }, 10842 { "kortestd", { MaskG, MaskR }, 0 }, 10843 }, 10844 { 10845 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */ 10846 { Bad_Opcode }, 10847 { "ktestw", { MaskG, MaskR }, 0 }, 10848 }, 10849 { 10850 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */ 10851 { Bad_Opcode }, 10852 { "ktestq", { MaskG, MaskR }, 0 }, 10853 }, 10854 { 10855 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */ 10856 { Bad_Opcode }, 10857 { "ktestb", { MaskG, MaskR }, 0 }, 10858 }, 10859 { 10860 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */ 10861 { Bad_Opcode }, 10862 { "ktestd", { MaskG, MaskR }, 0 }, 10863 }, 10864 { 10865 /* MOD_VEX_0FAE_REG_2 */ 10866 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) }, 10867 }, 10868 { 10869 /* MOD_VEX_0FAE_REG_3 */ 10870 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) }, 10871 }, 10872 { 10873 /* MOD_VEX_0FD7_PREFIX_2 */ 10874 { Bad_Opcode }, 10875 { "vpmovmskb", { Gdq, XS }, 0 }, 10876 }, 10877 { 10878 /* MOD_VEX_0FE7_PREFIX_2 */ 10879 { "vmovntdq", { Mx, XM }, 0 }, 10880 }, 10881 { 10882 /* MOD_VEX_0FF0_PREFIX_3 */ 10883 { "vlddqu", { XM, M }, 0 }, 10884 }, 10885 { 10886 /* MOD_VEX_0F381A_PREFIX_2 */ 10887 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) }, 10888 }, 10889 { 10890 /* MOD_VEX_0F382A_PREFIX_2 */ 10891 { "vmovntdqa", { XM, Mx }, 0 }, 10892 }, 10893 { 10894 /* MOD_VEX_0F382C_PREFIX_2 */ 10895 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) }, 10896 }, 10897 { 10898 /* MOD_VEX_0F382D_PREFIX_2 */ 10899 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) }, 10900 }, 10901 { 10902 /* MOD_VEX_0F382E_PREFIX_2 */ 10903 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) }, 10904 }, 10905 { 10906 /* MOD_VEX_0F382F_PREFIX_2 */ 10907 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) }, 10908 }, 10909 { 10910 /* MOD_VEX_0F385A_PREFIX_2 */ 10911 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) }, 10912 }, 10913 { 10914 /* MOD_VEX_0F388C_PREFIX_2 */ 10915 { "vpmaskmov%LW", { XM, Vex, Mx }, 0 }, 10916 }, 10917 { 10918 /* MOD_VEX_0F388E_PREFIX_2 */ 10919 { "vpmaskmov%LW", { Mx, Vex, XM }, 0 }, 10920 }, 10921 { 10922 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */ 10923 { Bad_Opcode }, 10924 { "kshiftrb", { MaskG, MaskR, Ib }, 0 }, 10925 }, 10926 { 10927 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */ 10928 { Bad_Opcode }, 10929 { "kshiftrw", { MaskG, MaskR, Ib }, 0 }, 10930 }, 10931 { 10932 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */ 10933 { Bad_Opcode }, 10934 { "kshiftrd", { MaskG, MaskR, Ib }, 0 }, 10935 }, 10936 { 10937 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */ 10938 { Bad_Opcode }, 10939 { "kshiftrq", { MaskG, MaskR, Ib }, 0 }, 10940 }, 10941 { 10942 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */ 10943 { Bad_Opcode }, 10944 { "kshiftlb", { MaskG, MaskR, Ib }, 0 }, 10945 }, 10946 { 10947 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */ 10948 { Bad_Opcode }, 10949 { "kshiftlw", { MaskG, MaskR, Ib }, 0 }, 10950 }, 10951 { 10952 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */ 10953 { Bad_Opcode }, 10954 { "kshiftld", { MaskG, MaskR, Ib }, 0 }, 10955 }, 10956 { 10957 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */ 10958 { Bad_Opcode }, 10959 { "kshiftlq", { MaskG, MaskR, Ib }, 0 }, 10960 }, 10961 #define NEED_MOD_TABLE 10962 #include "i386-dis-evex.h" 10963 #undef NEED_MOD_TABLE 10964 }; 10965 10966 static const struct dis386 rm_table[][8] = { 10967 { 10968 /* RM_C6_REG_7 */ 10969 { "xabort", { Skip_MODRM, Ib }, 0 }, 10970 }, 10971 { 10972 /* RM_C7_REG_7 */ 10973 { "xbeginT", { Skip_MODRM, Jv }, 0 }, 10974 }, 10975 { 10976 /* RM_0F01_REG_0 */ 10977 { "enclv", { Skip_MODRM }, 0 }, 10978 { "vmcall", { Skip_MODRM }, 0 }, 10979 { "vmlaunch", { Skip_MODRM }, 0 }, 10980 { "vmresume", { Skip_MODRM }, 0 }, 10981 { "vmxoff", { Skip_MODRM }, 0 }, 10982 { "pconfig", { Skip_MODRM }, 0 }, 10983 }, 10984 { 10985 /* RM_0F01_REG_1 */ 10986 { "monitor", { { OP_Monitor, 0 } }, 0 }, 10987 { "mwait", { { OP_Mwait, 0 } }, 0 }, 10988 { "clac", { Skip_MODRM }, 0 }, 10989 { "stac", { Skip_MODRM }, 0 }, 10990 { Bad_Opcode }, 10991 { Bad_Opcode }, 10992 { Bad_Opcode }, 10993 { "encls", { Skip_MODRM }, 0 }, 10994 }, 10995 { 10996 /* RM_0F01_REG_2 */ 10997 { "xgetbv", { Skip_MODRM }, 0 }, 10998 { "xsetbv", { Skip_MODRM }, 0 }, 10999 { Bad_Opcode }, 11000 { Bad_Opcode }, 11001 { "vmfunc", { Skip_MODRM }, 0 }, 11002 { "xend", { Skip_MODRM }, 0 }, 11003 { "xtest", { Skip_MODRM }, 0 }, 11004 { "enclu", { Skip_MODRM }, 0 }, 11005 }, 11006 { 11007 /* RM_0F01_REG_3 */ 11008 { "vmrun", { Skip_MODRM }, 0 }, 11009 { "vmmcall", { Skip_MODRM }, 0 }, 11010 { "vmload", { Skip_MODRM }, 0 }, 11011 { "vmsave", { Skip_MODRM }, 0 }, 11012 { "stgi", { Skip_MODRM }, 0 }, 11013 { "clgi", { Skip_MODRM }, 0 }, 11014 { "skinit", { Skip_MODRM }, 0 }, 11015 { "invlpga", { Skip_MODRM }, 0 }, 11016 }, 11017 { 11018 /* RM_0F01_REG_5 */ 11019 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) }, 11020 { Bad_Opcode }, 11021 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) }, 11022 { Bad_Opcode }, 11023 { Bad_Opcode }, 11024 { Bad_Opcode }, 11025 { "rdpkru", { Skip_MODRM }, 0 }, 11026 { "wrpkru", { Skip_MODRM }, 0 }, 11027 }, 11028 { 11029 /* RM_0F01_REG_7 */ 11030 { "swapgs", { Skip_MODRM }, 0 }, 11031 { "rdtscp", { Skip_MODRM }, 0 }, 11032 { "monitorx", { { OP_Monitor, 0 } }, 0 }, 11033 { "mwaitx", { { OP_Mwaitx, 0 } }, 0 }, 11034 { "clzero", { Skip_MODRM }, 0 }, 11035 }, 11036 { 11037 /* RM_0F1E_MOD_3_REG_7 */ 11038 { "nopQ", { Ev }, 0 }, 11039 { "nopQ", { Ev }, 0 }, 11040 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE }, 11041 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE }, 11042 { "nopQ", { Ev }, 0 }, 11043 { "nopQ", { Ev }, 0 }, 11044 { "nopQ", { Ev }, 0 }, 11045 { "nopQ", { Ev }, 0 }, 11046 }, 11047 { 11048 /* RM_0FAE_REG_6 */ 11049 { "mfence", { Skip_MODRM }, 0 }, 11050 }, 11051 { 11052 /* RM_0FAE_REG_7 */ 11053 { "sfence", { Skip_MODRM }, 0 }, 11054 11055 }, 11056 }; 11057 11058 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>") 11059 11060 /* We use the high bit to indicate different name for the same 11061 prefix. */ 11062 #define REP_PREFIX (0xf3 | 0x100) 11063 #define XACQUIRE_PREFIX (0xf2 | 0x200) 11064 #define XRELEASE_PREFIX (0xf3 | 0x400) 11065 #define BND_PREFIX (0xf2 | 0x400) 11066 #define NOTRACK_PREFIX (0x3e | 0x100) 11067 11068 static int 11069 ckprefix (void) 11070 { 11071 int newrex, i, length; 11072 rex = 0; 11073 rex_ignored = 0; 11074 prefixes = 0; 11075 used_prefixes = 0; 11076 rex_used = 0; 11077 last_lock_prefix = -1; 11078 last_repz_prefix = -1; 11079 last_repnz_prefix = -1; 11080 last_data_prefix = -1; 11081 last_addr_prefix = -1; 11082 last_rex_prefix = -1; 11083 last_seg_prefix = -1; 11084 fwait_prefix = -1; 11085 active_seg_prefix = 0; 11086 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++) 11087 all_prefixes[i] = 0; 11088 i = 0; 11089 length = 0; 11090 /* The maximum instruction length is 15bytes. */ 11091 while (length < MAX_CODE_LENGTH - 1) 11092 { 11093 FETCH_DATA (the_info, codep + 1); 11094 newrex = 0; 11095 switch (*codep) 11096 { 11097 /* REX prefixes family. */ 11098 case 0x40: 11099 case 0x41: 11100 case 0x42: 11101 case 0x43: 11102 case 0x44: 11103 case 0x45: 11104 case 0x46: 11105 case 0x47: 11106 case 0x48: 11107 case 0x49: 11108 case 0x4a: 11109 case 0x4b: 11110 case 0x4c: 11111 case 0x4d: 11112 case 0x4e: 11113 case 0x4f: 11114 if (address_mode == mode_64bit) 11115 newrex = *codep; 11116 else 11117 return 1; 11118 last_rex_prefix = i; 11119 break; 11120 case 0xf3: 11121 prefixes |= PREFIX_REPZ; 11122 last_repz_prefix = i; 11123 break; 11124 case 0xf2: 11125 prefixes |= PREFIX_REPNZ; 11126 last_repnz_prefix = i; 11127 break; 11128 case 0xf0: 11129 prefixes |= PREFIX_LOCK; 11130 last_lock_prefix = i; 11131 break; 11132 case 0x2e: 11133 prefixes |= PREFIX_CS; 11134 last_seg_prefix = i; 11135 active_seg_prefix = PREFIX_CS; 11136 break; 11137 case 0x36: 11138 prefixes |= PREFIX_SS; 11139 last_seg_prefix = i; 11140 active_seg_prefix = PREFIX_SS; 11141 break; 11142 case 0x3e: 11143 prefixes |= PREFIX_DS; 11144 last_seg_prefix = i; 11145 active_seg_prefix = PREFIX_DS; 11146 break; 11147 case 0x26: 11148 prefixes |= PREFIX_ES; 11149 last_seg_prefix = i; 11150 active_seg_prefix = PREFIX_ES; 11151 break; 11152 case 0x64: 11153 prefixes |= PREFIX_FS; 11154 last_seg_prefix = i; 11155 active_seg_prefix = PREFIX_FS; 11156 break; 11157 case 0x65: 11158 prefixes |= PREFIX_GS; 11159 last_seg_prefix = i; 11160 active_seg_prefix = PREFIX_GS; 11161 break; 11162 case 0x66: 11163 prefixes |= PREFIX_DATA; 11164 last_data_prefix = i; 11165 break; 11166 case 0x67: 11167 prefixes |= PREFIX_ADDR; 11168 last_addr_prefix = i; 11169 break; 11170 case FWAIT_OPCODE: 11171 /* fwait is really an instruction. If there are prefixes 11172 before the fwait, they belong to the fwait, *not* to the 11173 following instruction. */ 11174 fwait_prefix = i; 11175 if (prefixes || rex) 11176 { 11177 prefixes |= PREFIX_FWAIT; 11178 codep++; 11179 /* This ensures that the previous REX prefixes are noticed 11180 as unused prefixes, as in the return case below. */ 11181 rex_used = rex; 11182 return 1; 11183 } 11184 prefixes = PREFIX_FWAIT; 11185 break; 11186 default: 11187 return 1; 11188 } 11189 /* Rex is ignored when followed by another prefix. */ 11190 if (rex) 11191 { 11192 rex_used = rex; 11193 return 1; 11194 } 11195 if (*codep != FWAIT_OPCODE) 11196 all_prefixes[i++] = *codep; 11197 rex = newrex; 11198 codep++; 11199 length++; 11200 } 11201 return 0; 11202 } 11203 11204 /* Return the name of the prefix byte PREF, or NULL if PREF is not a 11205 prefix byte. */ 11206 11207 static const char * 11208 prefix_name (int pref, int sizeflag) 11209 { 11210 static const char *rexes [16] = 11211 { 11212 "rex", /* 0x40 */ 11213 "rex.B", /* 0x41 */ 11214 "rex.X", /* 0x42 */ 11215 "rex.XB", /* 0x43 */ 11216 "rex.R", /* 0x44 */ 11217 "rex.RB", /* 0x45 */ 11218 "rex.RX", /* 0x46 */ 11219 "rex.RXB", /* 0x47 */ 11220 "rex.W", /* 0x48 */ 11221 "rex.WB", /* 0x49 */ 11222 "rex.WX", /* 0x4a */ 11223 "rex.WXB", /* 0x4b */ 11224 "rex.WR", /* 0x4c */ 11225 "rex.WRB", /* 0x4d */ 11226 "rex.WRX", /* 0x4e */ 11227 "rex.WRXB", /* 0x4f */ 11228 }; 11229 11230 switch (pref) 11231 { 11232 /* REX prefixes family. */ 11233 case 0x40: 11234 case 0x41: 11235 case 0x42: 11236 case 0x43: 11237 case 0x44: 11238 case 0x45: 11239 case 0x46: 11240 case 0x47: 11241 case 0x48: 11242 case 0x49: 11243 case 0x4a: 11244 case 0x4b: 11245 case 0x4c: 11246 case 0x4d: 11247 case 0x4e: 11248 case 0x4f: 11249 return rexes [pref - 0x40]; 11250 case 0xf3: 11251 return "repz"; 11252 case 0xf2: 11253 return "repnz"; 11254 case 0xf0: 11255 return "lock"; 11256 case 0x2e: 11257 return "cs"; 11258 case 0x36: 11259 return "ss"; 11260 case 0x3e: 11261 return "ds"; 11262 case 0x26: 11263 return "es"; 11264 case 0x64: 11265 return "fs"; 11266 case 0x65: 11267 return "gs"; 11268 case 0x66: 11269 return (sizeflag & DFLAG) ? "data16" : "data32"; 11270 case 0x67: 11271 if (address_mode == mode_64bit) 11272 return (sizeflag & AFLAG) ? "addr32" : "addr64"; 11273 else 11274 return (sizeflag & AFLAG) ? "addr16" : "addr32"; 11275 case FWAIT_OPCODE: 11276 return "fwait"; 11277 case REP_PREFIX: 11278 return "rep"; 11279 case XACQUIRE_PREFIX: 11280 return "xacquire"; 11281 case XRELEASE_PREFIX: 11282 return "xrelease"; 11283 case BND_PREFIX: 11284 return "bnd"; 11285 case NOTRACK_PREFIX: 11286 return "notrack"; 11287 default: 11288 return NULL; 11289 } 11290 } 11291 11292 static char op_out[MAX_OPERANDS][100]; 11293 static int op_ad, op_index[MAX_OPERANDS]; 11294 static int two_source_ops; 11295 static bfd_vma op_address[MAX_OPERANDS]; 11296 static bfd_vma op_riprel[MAX_OPERANDS]; 11297 static bfd_vma start_pc; 11298 11299 /* 11300 * On the 386's of 1988, the maximum length of an instruction is 15 bytes. 11301 * (see topic "Redundant prefixes" in the "Differences from 8086" 11302 * section of the "Virtual 8086 Mode" chapter.) 11303 * 'pc' should be the address of this instruction, it will 11304 * be used to print the target address if this is a relative jump or call 11305 * The function returns the length of this instruction in bytes. 11306 */ 11307 11308 static char intel_syntax; 11309 static char intel_mnemonic = !SYSV386_COMPAT; 11310 static char open_char; 11311 static char close_char; 11312 static char separator_char; 11313 static char scale_char; 11314 11315 enum x86_64_isa 11316 { 11317 amd64 = 0, 11318 intel64 11319 }; 11320 11321 static enum x86_64_isa isa64; 11322 11323 /* Here for backwards compatibility. When gdb stops using 11324 print_insn_i386_att and print_insn_i386_intel these functions can 11325 disappear, and print_insn_i386 be merged into print_insn. */ 11326 int 11327 print_insn_i386_att (bfd_vma pc, disassemble_info *info) 11328 { 11329 intel_syntax = 0; 11330 11331 return print_insn (pc, info); 11332 } 11333 11334 int 11335 print_insn_i386_intel (bfd_vma pc, disassemble_info *info) 11336 { 11337 intel_syntax = 1; 11338 11339 return print_insn (pc, info); 11340 } 11341 11342 int 11343 print_insn_i386 (bfd_vma pc, disassemble_info *info) 11344 { 11345 intel_syntax = -1; 11346 11347 return print_insn (pc, info); 11348 } 11349 11350 void 11351 print_i386_disassembler_options (FILE *stream) 11352 { 11353 fprintf (stream, _("\n\ 11354 The following i386/x86-64 specific disassembler options are supported for use\n\ 11355 with the -M switch (multiple options should be separated by commas):\n")); 11356 11357 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n")); 11358 fprintf (stream, _(" i386 Disassemble in 32bit mode\n")); 11359 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n")); 11360 fprintf (stream, _(" att Display instruction in AT&T syntax\n")); 11361 fprintf (stream, _(" intel Display instruction in Intel syntax\n")); 11362 fprintf (stream, _(" att-mnemonic\n" 11363 " Display instruction in AT&T mnemonic\n")); 11364 fprintf (stream, _(" intel-mnemonic\n" 11365 " Display instruction in Intel mnemonic\n")); 11366 fprintf (stream, _(" addr64 Assume 64bit address size\n")); 11367 fprintf (stream, _(" addr32 Assume 32bit address size\n")); 11368 fprintf (stream, _(" addr16 Assume 16bit address size\n")); 11369 fprintf (stream, _(" data32 Assume 32bit data size\n")); 11370 fprintf (stream, _(" data16 Assume 16bit data size\n")); 11371 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n")); 11372 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n")); 11373 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n")); 11374 } 11375 11376 /* Bad opcode. */ 11377 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 }; 11378 11379 /* Get a pointer to struct dis386 with a valid name. */ 11380 11381 static const struct dis386 * 11382 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) 11383 { 11384 int vindex, vex_table_index; 11385 11386 if (dp->name != NULL) 11387 return dp; 11388 11389 switch (dp->op[0].bytemode) 11390 { 11391 case USE_REG_TABLE: 11392 dp = ®_table[dp->op[1].bytemode][modrm.reg]; 11393 break; 11394 11395 case USE_MOD_TABLE: 11396 vindex = modrm.mod == 0x3 ? 1 : 0; 11397 dp = &mod_table[dp->op[1].bytemode][vindex]; 11398 break; 11399 11400 case USE_RM_TABLE: 11401 dp = &rm_table[dp->op[1].bytemode][modrm.rm]; 11402 break; 11403 11404 case USE_PREFIX_TABLE: 11405 if (need_vex) 11406 { 11407 /* The prefix in VEX is implicit. */ 11408 switch (vex.prefix) 11409 { 11410 case 0: 11411 vindex = 0; 11412 break; 11413 case REPE_PREFIX_OPCODE: 11414 vindex = 1; 11415 break; 11416 case DATA_PREFIX_OPCODE: 11417 vindex = 2; 11418 break; 11419 case REPNE_PREFIX_OPCODE: 11420 vindex = 3; 11421 break; 11422 default: 11423 abort (); 11424 break; 11425 } 11426 } 11427 else 11428 { 11429 int last_prefix = -1; 11430 int prefix = 0; 11431 vindex = 0; 11432 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA. 11433 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the 11434 last one wins. */ 11435 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0) 11436 { 11437 if (last_repz_prefix > last_repnz_prefix) 11438 { 11439 vindex = 1; 11440 prefix = PREFIX_REPZ; 11441 last_prefix = last_repz_prefix; 11442 } 11443 else 11444 { 11445 vindex = 3; 11446 prefix = PREFIX_REPNZ; 11447 last_prefix = last_repnz_prefix; 11448 } 11449 11450 /* Check if prefix should be ignored. */ 11451 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement 11452 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT) 11453 & prefix) != 0) 11454 vindex = 0; 11455 } 11456 11457 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0) 11458 { 11459 vindex = 2; 11460 prefix = PREFIX_DATA; 11461 last_prefix = last_data_prefix; 11462 } 11463 11464 if (vindex != 0) 11465 { 11466 used_prefixes |= prefix; 11467 all_prefixes[last_prefix] = 0; 11468 } 11469 } 11470 dp = &prefix_table[dp->op[1].bytemode][vindex]; 11471 break; 11472 11473 case USE_X86_64_TABLE: 11474 vindex = address_mode == mode_64bit ? 1 : 0; 11475 dp = &x86_64_table[dp->op[1].bytemode][vindex]; 11476 break; 11477 11478 case USE_3BYTE_TABLE: 11479 FETCH_DATA (info, codep + 2); 11480 vindex = *codep++; 11481 dp = &three_byte_table[dp->op[1].bytemode][vindex]; 11482 end_codep = codep; 11483 modrm.mod = (*codep >> 6) & 3; 11484 modrm.reg = (*codep >> 3) & 7; 11485 modrm.rm = *codep & 7; 11486 break; 11487 11488 case USE_VEX_LEN_TABLE: 11489 if (!need_vex) 11490 abort (); 11491 11492 switch (vex.length) 11493 { 11494 case 128: 11495 vindex = 0; 11496 break; 11497 case 256: 11498 vindex = 1; 11499 break; 11500 default: 11501 abort (); 11502 break; 11503 } 11504 11505 dp = &vex_len_table[dp->op[1].bytemode][vindex]; 11506 break; 11507 11508 case USE_EVEX_LEN_TABLE: 11509 if (!vex.evex) 11510 abort (); 11511 11512 switch (vex.length) 11513 { 11514 case 128: 11515 vindex = 0; 11516 break; 11517 case 256: 11518 vindex = 1; 11519 break; 11520 case 512: 11521 vindex = 2; 11522 break; 11523 default: 11524 abort (); 11525 break; 11526 } 11527 11528 dp = &evex_len_table[dp->op[1].bytemode][vindex]; 11529 break; 11530 11531 case USE_XOP_8F_TABLE: 11532 FETCH_DATA (info, codep + 3); 11533 /* All bits in the REX prefix are ignored. */ 11534 rex_ignored = rex; 11535 rex = ~(*codep >> 5) & 0x7; 11536 11537 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */ 11538 switch ((*codep & 0x1f)) 11539 { 11540 default: 11541 dp = &bad_opcode; 11542 return dp; 11543 case 0x8: 11544 vex_table_index = XOP_08; 11545 break; 11546 case 0x9: 11547 vex_table_index = XOP_09; 11548 break; 11549 case 0xa: 11550 vex_table_index = XOP_0A; 11551 break; 11552 } 11553 codep++; 11554 vex.w = *codep & 0x80; 11555 if (vex.w && address_mode == mode_64bit) 11556 rex |= REX_W; 11557 11558 vex.register_specifier = (~(*codep >> 3)) & 0xf; 11559 if (address_mode != mode_64bit) 11560 { 11561 /* In 16/32-bit mode REX_B is silently ignored. */ 11562 rex &= ~REX_B; 11563 } 11564 11565 vex.length = (*codep & 0x4) ? 256 : 128; 11566 switch ((*codep & 0x3)) 11567 { 11568 case 0: 11569 break; 11570 case 1: 11571 vex.prefix = DATA_PREFIX_OPCODE; 11572 break; 11573 case 2: 11574 vex.prefix = REPE_PREFIX_OPCODE; 11575 break; 11576 case 3: 11577 vex.prefix = REPNE_PREFIX_OPCODE; 11578 break; 11579 } 11580 need_vex = 1; 11581 need_vex_reg = 1; 11582 codep++; 11583 vindex = *codep++; 11584 dp = &xop_table[vex_table_index][vindex]; 11585 11586 end_codep = codep; 11587 FETCH_DATA (info, codep + 1); 11588 modrm.mod = (*codep >> 6) & 3; 11589 modrm.reg = (*codep >> 3) & 7; 11590 modrm.rm = *codep & 7; 11591 break; 11592 11593 case USE_VEX_C4_TABLE: 11594 /* VEX prefix. */ 11595 FETCH_DATA (info, codep + 3); 11596 /* All bits in the REX prefix are ignored. */ 11597 rex_ignored = rex; 11598 rex = ~(*codep >> 5) & 0x7; 11599 switch ((*codep & 0x1f)) 11600 { 11601 default: 11602 dp = &bad_opcode; 11603 return dp; 11604 case 0x1: 11605 vex_table_index = VEX_0F; 11606 break; 11607 case 0x2: 11608 vex_table_index = VEX_0F38; 11609 break; 11610 case 0x3: 11611 vex_table_index = VEX_0F3A; 11612 break; 11613 } 11614 codep++; 11615 vex.w = *codep & 0x80; 11616 if (address_mode == mode_64bit) 11617 { 11618 if (vex.w) 11619 rex |= REX_W; 11620 } 11621 else 11622 { 11623 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit 11624 is ignored, other REX bits are 0 and the highest bit in 11625 VEX.vvvv is also ignored (but we mustn't clear it here). */ 11626 rex = 0; 11627 } 11628 vex.register_specifier = (~(*codep >> 3)) & 0xf; 11629 vex.length = (*codep & 0x4) ? 256 : 128; 11630 switch ((*codep & 0x3)) 11631 { 11632 case 0: 11633 break; 11634 case 1: 11635 vex.prefix = DATA_PREFIX_OPCODE; 11636 break; 11637 case 2: 11638 vex.prefix = REPE_PREFIX_OPCODE; 11639 break; 11640 case 3: 11641 vex.prefix = REPNE_PREFIX_OPCODE; 11642 break; 11643 } 11644 need_vex = 1; 11645 need_vex_reg = 1; 11646 codep++; 11647 vindex = *codep++; 11648 dp = &vex_table[vex_table_index][vindex]; 11649 end_codep = codep; 11650 /* There is no MODRM byte for VEX0F 77. */ 11651 if (vex_table_index != VEX_0F || vindex != 0x77) 11652 { 11653 FETCH_DATA (info, codep + 1); 11654 modrm.mod = (*codep >> 6) & 3; 11655 modrm.reg = (*codep >> 3) & 7; 11656 modrm.rm = *codep & 7; 11657 } 11658 break; 11659 11660 case USE_VEX_C5_TABLE: 11661 /* VEX prefix. */ 11662 FETCH_DATA (info, codep + 2); 11663 /* All bits in the REX prefix are ignored. */ 11664 rex_ignored = rex; 11665 rex = (*codep & 0x80) ? 0 : REX_R; 11666 11667 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in 11668 VEX.vvvv is 1. */ 11669 vex.register_specifier = (~(*codep >> 3)) & 0xf; 11670 vex.length = (*codep & 0x4) ? 256 : 128; 11671 switch ((*codep & 0x3)) 11672 { 11673 case 0: 11674 break; 11675 case 1: 11676 vex.prefix = DATA_PREFIX_OPCODE; 11677 break; 11678 case 2: 11679 vex.prefix = REPE_PREFIX_OPCODE; 11680 break; 11681 case 3: 11682 vex.prefix = REPNE_PREFIX_OPCODE; 11683 break; 11684 } 11685 need_vex = 1; 11686 need_vex_reg = 1; 11687 codep++; 11688 vindex = *codep++; 11689 dp = &vex_table[dp->op[1].bytemode][vindex]; 11690 end_codep = codep; 11691 /* There is no MODRM byte for VEX 77. */ 11692 if (vindex != 0x77) 11693 { 11694 FETCH_DATA (info, codep + 1); 11695 modrm.mod = (*codep >> 6) & 3; 11696 modrm.reg = (*codep >> 3) & 7; 11697 modrm.rm = *codep & 7; 11698 } 11699 break; 11700 11701 case USE_VEX_W_TABLE: 11702 if (!need_vex) 11703 abort (); 11704 11705 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0]; 11706 break; 11707 11708 case USE_EVEX_TABLE: 11709 two_source_ops = 0; 11710 /* EVEX prefix. */ 11711 vex.evex = 1; 11712 FETCH_DATA (info, codep + 4); 11713 /* All bits in the REX prefix are ignored. */ 11714 rex_ignored = rex; 11715 /* The first byte after 0x62. */ 11716 rex = ~(*codep >> 5) & 0x7; 11717 vex.r = *codep & 0x10; 11718 switch ((*codep & 0xf)) 11719 { 11720 default: 11721 return &bad_opcode; 11722 case 0x1: 11723 vex_table_index = EVEX_0F; 11724 break; 11725 case 0x2: 11726 vex_table_index = EVEX_0F38; 11727 break; 11728 case 0x3: 11729 vex_table_index = EVEX_0F3A; 11730 break; 11731 } 11732 11733 /* The second byte after 0x62. */ 11734 codep++; 11735 vex.w = *codep & 0x80; 11736 if (vex.w && address_mode == mode_64bit) 11737 rex |= REX_W; 11738 11739 vex.register_specifier = (~(*codep >> 3)) & 0xf; 11740 11741 /* The U bit. */ 11742 if (!(*codep & 0x4)) 11743 return &bad_opcode; 11744 11745 switch ((*codep & 0x3)) 11746 { 11747 case 0: 11748 break; 11749 case 1: 11750 vex.prefix = DATA_PREFIX_OPCODE; 11751 break; 11752 case 2: 11753 vex.prefix = REPE_PREFIX_OPCODE; 11754 break; 11755 case 3: 11756 vex.prefix = REPNE_PREFIX_OPCODE; 11757 break; 11758 } 11759 11760 /* The third byte after 0x62. */ 11761 codep++; 11762 11763 /* Remember the static rounding bits. */ 11764 vex.ll = (*codep >> 5) & 3; 11765 vex.b = (*codep & 0x10) != 0; 11766 11767 vex.v = *codep & 0x8; 11768 vex.mask_register_specifier = *codep & 0x7; 11769 vex.zeroing = *codep & 0x80; 11770 11771 if (address_mode != mode_64bit) 11772 { 11773 /* In 16/32-bit mode silently ignore following bits. */ 11774 rex &= ~REX_B; 11775 vex.r = 1; 11776 vex.v = 1; 11777 } 11778 11779 need_vex = 1; 11780 need_vex_reg = 1; 11781 codep++; 11782 vindex = *codep++; 11783 dp = &evex_table[vex_table_index][vindex]; 11784 end_codep = codep; 11785 FETCH_DATA (info, codep + 1); 11786 modrm.mod = (*codep >> 6) & 3; 11787 modrm.reg = (*codep >> 3) & 7; 11788 modrm.rm = *codep & 7; 11789 11790 /* Set vector length. */ 11791 if (modrm.mod == 3 && vex.b) 11792 vex.length = 512; 11793 else 11794 { 11795 switch (vex.ll) 11796 { 11797 case 0x0: 11798 vex.length = 128; 11799 break; 11800 case 0x1: 11801 vex.length = 256; 11802 break; 11803 case 0x2: 11804 vex.length = 512; 11805 break; 11806 default: 11807 return &bad_opcode; 11808 } 11809 } 11810 break; 11811 11812 case 0: 11813 dp = &bad_opcode; 11814 break; 11815 11816 default: 11817 abort (); 11818 } 11819 11820 if (dp->name != NULL) 11821 return dp; 11822 else 11823 return get_valid_dis386 (dp, info); 11824 } 11825 11826 static void 11827 get_sib (disassemble_info *info, int sizeflag) 11828 { 11829 /* If modrm.mod == 3, operand must be register. */ 11830 if (need_modrm 11831 && ((sizeflag & AFLAG) || address_mode == mode_64bit) 11832 && modrm.mod != 3 11833 && modrm.rm == 4) 11834 { 11835 FETCH_DATA (info, codep + 2); 11836 sib.index = (codep [1] >> 3) & 7; 11837 sib.scale = (codep [1] >> 6) & 3; 11838 sib.base = codep [1] & 7; 11839 } 11840 } 11841 11842 static int 11843 print_insn (bfd_vma pc, disassemble_info *info) 11844 { 11845 const struct dis386 *dp; 11846 int i; 11847 char *op_txt[MAX_OPERANDS]; 11848 int needcomma; 11849 int sizeflag, orig_sizeflag; 11850 const char *p; 11851 struct dis_private priv; 11852 int prefix_length; 11853 11854 priv.orig_sizeflag = AFLAG | DFLAG; 11855 if ((info->mach & bfd_mach_i386_i386) != 0) 11856 address_mode = mode_32bit; 11857 else if (info->mach == bfd_mach_i386_i8086) 11858 { 11859 address_mode = mode_16bit; 11860 priv.orig_sizeflag = 0; 11861 } 11862 else 11863 address_mode = mode_64bit; 11864 11865 if (intel_syntax == (char) -1) 11866 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0; 11867 11868 for (p = info->disassembler_options; p != NULL; ) 11869 { 11870 if (CONST_STRNEQ (p, "amd64")) 11871 isa64 = amd64; 11872 else if (CONST_STRNEQ (p, "intel64")) 11873 isa64 = intel64; 11874 else if (CONST_STRNEQ (p, "x86-64")) 11875 { 11876 address_mode = mode_64bit; 11877 priv.orig_sizeflag = AFLAG | DFLAG; 11878 } 11879 else if (CONST_STRNEQ (p, "i386")) 11880 { 11881 address_mode = mode_32bit; 11882 priv.orig_sizeflag = AFLAG | DFLAG; 11883 } 11884 else if (CONST_STRNEQ (p, "i8086")) 11885 { 11886 address_mode = mode_16bit; 11887 priv.orig_sizeflag = 0; 11888 } 11889 else if (CONST_STRNEQ (p, "intel")) 11890 { 11891 intel_syntax = 1; 11892 if (CONST_STRNEQ (p + 5, "-mnemonic")) 11893 intel_mnemonic = 1; 11894 } 11895 else if (CONST_STRNEQ (p, "att")) 11896 { 11897 intel_syntax = 0; 11898 if (CONST_STRNEQ (p + 3, "-mnemonic")) 11899 intel_mnemonic = 0; 11900 } 11901 else if (CONST_STRNEQ (p, "addr")) 11902 { 11903 if (address_mode == mode_64bit) 11904 { 11905 if (p[4] == '3' && p[5] == '2') 11906 priv.orig_sizeflag &= ~AFLAG; 11907 else if (p[4] == '6' && p[5] == '4') 11908 priv.orig_sizeflag |= AFLAG; 11909 } 11910 else 11911 { 11912 if (p[4] == '1' && p[5] == '6') 11913 priv.orig_sizeflag &= ~AFLAG; 11914 else if (p[4] == '3' && p[5] == '2') 11915 priv.orig_sizeflag |= AFLAG; 11916 } 11917 } 11918 else if (CONST_STRNEQ (p, "data")) 11919 { 11920 if (p[4] == '1' && p[5] == '6') 11921 priv.orig_sizeflag &= ~DFLAG; 11922 else if (p[4] == '3' && p[5] == '2') 11923 priv.orig_sizeflag |= DFLAG; 11924 } 11925 else if (CONST_STRNEQ (p, "suffix")) 11926 priv.orig_sizeflag |= SUFFIX_ALWAYS; 11927 11928 p = strchr (p, ','); 11929 if (p != NULL) 11930 p++; 11931 } 11932 11933 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8) 11934 { 11935 (*info->fprintf_func) (info->stream, 11936 _("64-bit address is disabled")); 11937 return -1; 11938 } 11939 11940 if (intel_syntax) 11941 { 11942 names64 = intel_names64; 11943 names32 = intel_names32; 11944 names16 = intel_names16; 11945 names8 = intel_names8; 11946 names8rex = intel_names8rex; 11947 names_seg = intel_names_seg; 11948 names_mm = intel_names_mm; 11949 names_bnd = intel_names_bnd; 11950 names_xmm = intel_names_xmm; 11951 names_ymm = intel_names_ymm; 11952 names_zmm = intel_names_zmm; 11953 index64 = intel_index64; 11954 index32 = intel_index32; 11955 names_mask = intel_names_mask; 11956 index16 = intel_index16; 11957 open_char = '['; 11958 close_char = ']'; 11959 separator_char = '+'; 11960 scale_char = '*'; 11961 } 11962 else 11963 { 11964 names64 = att_names64; 11965 names32 = att_names32; 11966 names16 = att_names16; 11967 names8 = att_names8; 11968 names8rex = att_names8rex; 11969 names_seg = att_names_seg; 11970 names_mm = att_names_mm; 11971 names_bnd = att_names_bnd; 11972 names_xmm = att_names_xmm; 11973 names_ymm = att_names_ymm; 11974 names_zmm = att_names_zmm; 11975 index64 = att_index64; 11976 index32 = att_index32; 11977 names_mask = att_names_mask; 11978 index16 = att_index16; 11979 open_char = '('; 11980 close_char = ')'; 11981 separator_char = ','; 11982 scale_char = ','; 11983 } 11984 11985 /* The output looks better if we put 7 bytes on a line, since that 11986 puts most long word instructions on a single line. Use 8 bytes 11987 for Intel L1OM. */ 11988 if ((info->mach & bfd_mach_l1om) != 0) 11989 info->bytes_per_line = 8; 11990 else 11991 info->bytes_per_line = 7; 11992 11993 info->private_data = &priv; 11994 priv.max_fetched = priv.the_buffer; 11995 priv.insn_start = pc; 11996 11997 obuf[0] = 0; 11998 for (i = 0; i < MAX_OPERANDS; ++i) 11999 { 12000 op_out[i][0] = 0; 12001 op_index[i] = -1; 12002 } 12003 12004 the_info = info; 12005 start_pc = pc; 12006 start_codep = priv.the_buffer; 12007 codep = priv.the_buffer; 12008 12009 if (OPCODES_SIGSETJMP (priv.bailout) != 0) 12010 { 12011 const char *name; 12012 12013 /* Getting here means we tried for data but didn't get it. That 12014 means we have an incomplete instruction of some sort. Just 12015 print the first byte as a prefix or a .byte pseudo-op. */ 12016 if (codep > priv.the_buffer) 12017 { 12018 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); 12019 if (name != NULL) 12020 (*info->fprintf_func) (info->stream, "%s", name); 12021 else 12022 { 12023 /* Just print the first byte as a .byte instruction. */ 12024 (*info->fprintf_func) (info->stream, ".byte 0x%x", 12025 (unsigned int) priv.the_buffer[0]); 12026 } 12027 12028 return 1; 12029 } 12030 12031 return -1; 12032 } 12033 12034 obufp = obuf; 12035 sizeflag = priv.orig_sizeflag; 12036 12037 if (!ckprefix () || rex_used) 12038 { 12039 /* Too many prefixes or unused REX prefixes. */ 12040 for (i = 0; 12041 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i]; 12042 i++) 12043 (*info->fprintf_func) (info->stream, "%s%s", 12044 i == 0 ? "" : " ", 12045 prefix_name (all_prefixes[i], sizeflag)); 12046 return i; 12047 } 12048 12049 insn_codep = codep; 12050 12051 FETCH_DATA (info, codep + 1); 12052 two_source_ops = (*codep == 0x62) || (*codep == 0xc8); 12053 12054 if (((prefixes & PREFIX_FWAIT) 12055 && ((*codep < 0xd8) || (*codep > 0xdf)))) 12056 { 12057 /* Handle prefixes before fwait. */ 12058 for (i = 0; i < fwait_prefix && all_prefixes[i]; 12059 i++) 12060 (*info->fprintf_func) (info->stream, "%s ", 12061 prefix_name (all_prefixes[i], sizeflag)); 12062 (*info->fprintf_func) (info->stream, "fwait"); 12063 return i + 1; 12064 } 12065 12066 if (*codep == 0x0f) 12067 { 12068 unsigned char threebyte; 12069 12070 codep++; 12071 FETCH_DATA (info, codep + 1); 12072 threebyte = *codep; 12073 dp = &dis386_twobyte[threebyte]; 12074 need_modrm = twobyte_has_modrm[*codep]; 12075 codep++; 12076 } 12077 else 12078 { 12079 dp = &dis386[*codep]; 12080 need_modrm = onebyte_has_modrm[*codep]; 12081 codep++; 12082 } 12083 12084 /* Save sizeflag for printing the extra prefixes later before updating 12085 it for mnemonic and operand processing. The prefix names depend 12086 only on the address mode. */ 12087 orig_sizeflag = sizeflag; 12088 if (prefixes & PREFIX_ADDR) 12089 sizeflag ^= AFLAG; 12090 if ((prefixes & PREFIX_DATA)) 12091 sizeflag ^= DFLAG; 12092 12093 end_codep = codep; 12094 if (need_modrm) 12095 { 12096 FETCH_DATA (info, codep + 1); 12097 modrm.mod = (*codep >> 6) & 3; 12098 modrm.reg = (*codep >> 3) & 7; 12099 modrm.rm = *codep & 7; 12100 } 12101 12102 need_vex = 0; 12103 need_vex_reg = 0; 12104 vex_w_done = 0; 12105 memset (&vex, 0, sizeof (vex)); 12106 12107 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE) 12108 { 12109 get_sib (info, sizeflag); 12110 dofloat (sizeflag); 12111 } 12112 else 12113 { 12114 dp = get_valid_dis386 (dp, info); 12115 if (dp != NULL && putop (dp->name, sizeflag) == 0) 12116 { 12117 get_sib (info, sizeflag); 12118 for (i = 0; i < MAX_OPERANDS; ++i) 12119 { 12120 obufp = op_out[i]; 12121 op_ad = MAX_OPERANDS - 1 - i; 12122 if (dp->op[i].rtn) 12123 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag); 12124 /* For EVEX instruction after the last operand masking 12125 should be printed. */ 12126 if (i == 0 && vex.evex) 12127 { 12128 /* Don't print {%k0}. */ 12129 if (vex.mask_register_specifier) 12130 { 12131 oappend ("{"); 12132 oappend (names_mask[vex.mask_register_specifier]); 12133 oappend ("}"); 12134 } 12135 if (vex.zeroing) 12136 oappend ("{z}"); 12137 } 12138 } 12139 } 12140 } 12141 12142 /* Check if the REX prefix is used. */ 12143 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0) 12144 all_prefixes[last_rex_prefix] = 0; 12145 12146 /* Check if the SEG prefix is used. */ 12147 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES 12148 | PREFIX_FS | PREFIX_GS)) != 0 12149 && (used_prefixes & active_seg_prefix) != 0) 12150 all_prefixes[last_seg_prefix] = 0; 12151 12152 /* Check if the ADDR prefix is used. */ 12153 if ((prefixes & PREFIX_ADDR) != 0 12154 && (used_prefixes & PREFIX_ADDR) != 0) 12155 all_prefixes[last_addr_prefix] = 0; 12156 12157 /* Check if the DATA prefix is used. */ 12158 if ((prefixes & PREFIX_DATA) != 0 12159 && (used_prefixes & PREFIX_DATA) != 0) 12160 all_prefixes[last_data_prefix] = 0; 12161 12162 /* Print the extra prefixes. */ 12163 prefix_length = 0; 12164 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++) 12165 if (all_prefixes[i]) 12166 { 12167 const char *name; 12168 name = prefix_name (all_prefixes[i], orig_sizeflag); 12169 if (name == NULL) 12170 abort (); 12171 prefix_length += strlen (name) + 1; 12172 (*info->fprintf_func) (info->stream, "%s ", name); 12173 } 12174 12175 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is 12176 unused, opcode is invalid. Since the PREFIX_DATA prefix may be 12177 used by putop and MMX/SSE operand and may be overriden by the 12178 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix 12179 separately. */ 12180 if (dp->prefix_requirement == PREFIX_OPCODE 12181 && dp != &bad_opcode 12182 && (((prefixes 12183 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0 12184 && (used_prefixes 12185 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0) 12186 || ((((prefixes 12187 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA)) 12188 == PREFIX_DATA) 12189 && (used_prefixes & PREFIX_DATA) == 0)))) 12190 { 12191 (*info->fprintf_func) (info->stream, "(bad)"); 12192 return end_codep - priv.the_buffer; 12193 } 12194 12195 /* Check maximum code length. */ 12196 if ((codep - start_codep) > MAX_CODE_LENGTH) 12197 { 12198 (*info->fprintf_func) (info->stream, "(bad)"); 12199 return MAX_CODE_LENGTH; 12200 } 12201 12202 obufp = mnemonicendp; 12203 for (i = strlen (obuf) + prefix_length; i < 6; i++) 12204 oappend (" "); 12205 oappend (" "); 12206 (*info->fprintf_func) (info->stream, "%s", obuf); 12207 12208 /* The enter and bound instructions are printed with operands in the same 12209 order as the intel book; everything else is printed in reverse order. */ 12210 if (intel_syntax || two_source_ops) 12211 { 12212 bfd_vma riprel; 12213 12214 for (i = 0; i < MAX_OPERANDS; ++i) 12215 op_txt[i] = op_out[i]; 12216 12217 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding 12218 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL) 12219 { 12220 op_txt[2] = op_out[3]; 12221 op_txt[3] = op_out[2]; 12222 } 12223 12224 for (i = 0; i < (MAX_OPERANDS >> 1); ++i) 12225 { 12226 op_ad = op_index[i]; 12227 op_index[i] = op_index[MAX_OPERANDS - 1 - i]; 12228 op_index[MAX_OPERANDS - 1 - i] = op_ad; 12229 riprel = op_riprel[i]; 12230 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i]; 12231 op_riprel[MAX_OPERANDS - 1 - i] = riprel; 12232 } 12233 } 12234 else 12235 { 12236 for (i = 0; i < MAX_OPERANDS; ++i) 12237 op_txt[MAX_OPERANDS - 1 - i] = op_out[i]; 12238 } 12239 12240 needcomma = 0; 12241 for (i = 0; i < MAX_OPERANDS; ++i) 12242 if (*op_txt[i]) 12243 { 12244 if (needcomma) 12245 (*info->fprintf_func) (info->stream, ","); 12246 if (op_index[i] != -1 && !op_riprel[i]) 12247 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info); 12248 else 12249 (*info->fprintf_func) (info->stream, "%s", op_txt[i]); 12250 needcomma = 1; 12251 } 12252 12253 for (i = 0; i < MAX_OPERANDS; i++) 12254 if (op_index[i] != -1 && op_riprel[i]) 12255 { 12256 (*info->fprintf_func) (info->stream, " # "); 12257 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep) 12258 + op_address[op_index[i]]), info); 12259 break; 12260 } 12261 return codep - priv.the_buffer; 12262 } 12263 12264 static const char *float_mem[] = { 12265 /* d8 */ 12266 "fadd{s|}", 12267 "fmul{s|}", 12268 "fcom{s|}", 12269 "fcomp{s|}", 12270 "fsub{s|}", 12271 "fsubr{s|}", 12272 "fdiv{s|}", 12273 "fdivr{s|}", 12274 /* d9 */ 12275 "fld{s|}", 12276 "(bad)", 12277 "fst{s|}", 12278 "fstp{s|}", 12279 "fldenvIC", 12280 "fldcw", 12281 "fNstenvIC", 12282 "fNstcw", 12283 /* da */ 12284 "fiadd{l|}", 12285 "fimul{l|}", 12286 "ficom{l|}", 12287 "ficomp{l|}", 12288 "fisub{l|}", 12289 "fisubr{l|}", 12290 "fidiv{l|}", 12291 "fidivr{l|}", 12292 /* db */ 12293 "fild{l|}", 12294 "fisttp{l|}", 12295 "fist{l|}", 12296 "fistp{l|}", 12297 "(bad)", 12298 "fld{t||t|}", 12299 "(bad)", 12300 "fstp{t||t|}", 12301 /* dc */ 12302 "fadd{l|}", 12303 "fmul{l|}", 12304 "fcom{l|}", 12305 "fcomp{l|}", 12306 "fsub{l|}", 12307 "fsubr{l|}", 12308 "fdiv{l|}", 12309 "fdivr{l|}", 12310 /* dd */ 12311 "fld{l|}", 12312 "fisttp{ll|}", 12313 "fst{l||}", 12314 "fstp{l|}", 12315 "frstorIC", 12316 "(bad)", 12317 "fNsaveIC", 12318 "fNstsw", 12319 /* de */ 12320 "fiadd{s|}", 12321 "fimul{s|}", 12322 "ficom{s|}", 12323 "ficomp{s|}", 12324 "fisub{s|}", 12325 "fisubr{s|}", 12326 "fidiv{s|}", 12327 "fidivr{s|}", 12328 /* df */ 12329 "fild{s|}", 12330 "fisttp{s|}", 12331 "fist{s|}", 12332 "fistp{s|}", 12333 "fbld", 12334 "fild{ll|}", 12335 "fbstp", 12336 "fistp{ll|}", 12337 }; 12338 12339 static const unsigned char float_mem_mode[] = { 12340 /* d8 */ 12341 d_mode, 12342 d_mode, 12343 d_mode, 12344 d_mode, 12345 d_mode, 12346 d_mode, 12347 d_mode, 12348 d_mode, 12349 /* d9 */ 12350 d_mode, 12351 0, 12352 d_mode, 12353 d_mode, 12354 0, 12355 w_mode, 12356 0, 12357 w_mode, 12358 /* da */ 12359 d_mode, 12360 d_mode, 12361 d_mode, 12362 d_mode, 12363 d_mode, 12364 d_mode, 12365 d_mode, 12366 d_mode, 12367 /* db */ 12368 d_mode, 12369 d_mode, 12370 d_mode, 12371 d_mode, 12372 0, 12373 t_mode, 12374 0, 12375 t_mode, 12376 /* dc */ 12377 q_mode, 12378 q_mode, 12379 q_mode, 12380 q_mode, 12381 q_mode, 12382 q_mode, 12383 q_mode, 12384 q_mode, 12385 /* dd */ 12386 q_mode, 12387 q_mode, 12388 q_mode, 12389 q_mode, 12390 0, 12391 0, 12392 0, 12393 w_mode, 12394 /* de */ 12395 w_mode, 12396 w_mode, 12397 w_mode, 12398 w_mode, 12399 w_mode, 12400 w_mode, 12401 w_mode, 12402 w_mode, 12403 /* df */ 12404 w_mode, 12405 w_mode, 12406 w_mode, 12407 w_mode, 12408 t_mode, 12409 q_mode, 12410 t_mode, 12411 q_mode 12412 }; 12413 12414 #define ST { OP_ST, 0 } 12415 #define STi { OP_STi, 0 } 12416 12417 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0 12418 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0 12419 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0 12420 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0 12421 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0 12422 #define FGRPda_5 NULL, { { NULL, 6 } }, 0 12423 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0 12424 #define FGRPde_3 NULL, { { NULL, 8 } }, 0 12425 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0 12426 12427 static const struct dis386 float_reg[][8] = { 12428 /* d8 */ 12429 { 12430 { "fadd", { ST, STi }, 0 }, 12431 { "fmul", { ST, STi }, 0 }, 12432 { "fcom", { STi }, 0 }, 12433 { "fcomp", { STi }, 0 }, 12434 { "fsub", { ST, STi }, 0 }, 12435 { "fsubr", { ST, STi }, 0 }, 12436 { "fdiv", { ST, STi }, 0 }, 12437 { "fdivr", { ST, STi }, 0 }, 12438 }, 12439 /* d9 */ 12440 { 12441 { "fld", { STi }, 0 }, 12442 { "fxch", { STi }, 0 }, 12443 { FGRPd9_2 }, 12444 { Bad_Opcode }, 12445 { FGRPd9_4 }, 12446 { FGRPd9_5 }, 12447 { FGRPd9_6 }, 12448 { FGRPd9_7 }, 12449 }, 12450 /* da */ 12451 { 12452 { "fcmovb", { ST, STi }, 0 }, 12453 { "fcmove", { ST, STi }, 0 }, 12454 { "fcmovbe",{ ST, STi }, 0 }, 12455 { "fcmovu", { ST, STi }, 0 }, 12456 { Bad_Opcode }, 12457 { FGRPda_5 }, 12458 { Bad_Opcode }, 12459 { Bad_Opcode }, 12460 }, 12461 /* db */ 12462 { 12463 { "fcmovnb",{ ST, STi }, 0 }, 12464 { "fcmovne",{ ST, STi }, 0 }, 12465 { "fcmovnbe",{ ST, STi }, 0 }, 12466 { "fcmovnu",{ ST, STi }, 0 }, 12467 { FGRPdb_4 }, 12468 { "fucomi", { ST, STi }, 0 }, 12469 { "fcomi", { ST, STi }, 0 }, 12470 { Bad_Opcode }, 12471 }, 12472 /* dc */ 12473 { 12474 { "fadd", { STi, ST }, 0 }, 12475 { "fmul", { STi, ST }, 0 }, 12476 { Bad_Opcode }, 12477 { Bad_Opcode }, 12478 { "fsub{!M|r}", { STi, ST }, 0 }, 12479 { "fsub{M|}", { STi, ST }, 0 }, 12480 { "fdiv{!M|r}", { STi, ST }, 0 }, 12481 { "fdiv{M|}", { STi, ST }, 0 }, 12482 }, 12483 /* dd */ 12484 { 12485 { "ffree", { STi }, 0 }, 12486 { Bad_Opcode }, 12487 { "fst", { STi }, 0 }, 12488 { "fstp", { STi }, 0 }, 12489 { "fucom", { STi }, 0 }, 12490 { "fucomp", { STi }, 0 }, 12491 { Bad_Opcode }, 12492 { Bad_Opcode }, 12493 }, 12494 /* de */ 12495 { 12496 { "faddp", { STi, ST }, 0 }, 12497 { "fmulp", { STi, ST }, 0 }, 12498 { Bad_Opcode }, 12499 { FGRPde_3 }, 12500 { "fsub{!M|r}p", { STi, ST }, 0 }, 12501 { "fsub{M|}p", { STi, ST }, 0 }, 12502 { "fdiv{!M|r}p", { STi, ST }, 0 }, 12503 { "fdiv{M|}p", { STi, ST }, 0 }, 12504 }, 12505 /* df */ 12506 { 12507 { "ffreep", { STi }, 0 }, 12508 { Bad_Opcode }, 12509 { Bad_Opcode }, 12510 { Bad_Opcode }, 12511 { FGRPdf_4 }, 12512 { "fucomip", { ST, STi }, 0 }, 12513 { "fcomip", { ST, STi }, 0 }, 12514 { Bad_Opcode }, 12515 }, 12516 }; 12517 12518 static char *fgrps[][8] = { 12519 /* Bad opcode 0 */ 12520 { 12521 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 12522 }, 12523 12524 /* d9_2 1 */ 12525 { 12526 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 12527 }, 12528 12529 /* d9_4 2 */ 12530 { 12531 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)", 12532 }, 12533 12534 /* d9_5 3 */ 12535 { 12536 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)", 12537 }, 12538 12539 /* d9_6 4 */ 12540 { 12541 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp", 12542 }, 12543 12544 /* d9_7 5 */ 12545 { 12546 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos", 12547 }, 12548 12549 /* da_5 6 */ 12550 { 12551 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 12552 }, 12553 12554 /* db_4 7 */ 12555 { 12556 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit", 12557 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)", 12558 }, 12559 12560 /* de_3 8 */ 12561 { 12562 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 12563 }, 12564 12565 /* df_4 9 */ 12566 { 12567 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 12568 }, 12569 }; 12570 12571 static void 12572 swap_operand (void) 12573 { 12574 mnemonicendp[0] = '.'; 12575 mnemonicendp[1] = 's'; 12576 mnemonicendp += 2; 12577 } 12578 12579 static void 12580 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED, 12581 int sizeflag ATTRIBUTE_UNUSED) 12582 { 12583 /* Skip mod/rm byte. */ 12584 MODRM_CHECK; 12585 codep++; 12586 } 12587 12588 static void 12589 dofloat (int sizeflag) 12590 { 12591 const struct dis386 *dp; 12592 unsigned char floatop; 12593 12594 floatop = codep[-1]; 12595 12596 if (modrm.mod != 3) 12597 { 12598 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg; 12599 12600 putop (float_mem[fp_indx], sizeflag); 12601 obufp = op_out[0]; 12602 op_ad = 2; 12603 OP_E (float_mem_mode[fp_indx], sizeflag); 12604 return; 12605 } 12606 /* Skip mod/rm byte. */ 12607 MODRM_CHECK; 12608 codep++; 12609 12610 dp = &float_reg[floatop - 0xd8][modrm.reg]; 12611 if (dp->name == NULL) 12612 { 12613 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag); 12614 12615 /* Instruction fnstsw is only one with strange arg. */ 12616 if (floatop == 0xdf && codep[-1] == 0xe0) 12617 strcpy (op_out[0], names16[0]); 12618 } 12619 else 12620 { 12621 putop (dp->name, sizeflag); 12622 12623 obufp = op_out[0]; 12624 op_ad = 2; 12625 if (dp->op[0].rtn) 12626 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag); 12627 12628 obufp = op_out[1]; 12629 op_ad = 1; 12630 if (dp->op[1].rtn) 12631 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag); 12632 } 12633 } 12634 12635 /* Like oappend (below), but S is a string starting with '%'. 12636 In Intel syntax, the '%' is elided. */ 12637 static void 12638 oappend_maybe_intel (const char *s) 12639 { 12640 oappend (s + intel_syntax); 12641 } 12642 12643 static void 12644 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 12645 { 12646 oappend_maybe_intel ("%st"); 12647 } 12648 12649 static void 12650 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 12651 { 12652 sprintf (scratchbuf, "%%st(%d)", modrm.rm); 12653 oappend_maybe_intel (scratchbuf); 12654 } 12655 12656 /* Capital letters in template are macros. */ 12657 static int 12658 putop (const char *in_template, int sizeflag) 12659 { 12660 const char *p; 12661 int alt = 0; 12662 int cond = 1; 12663 unsigned int l = 0, len = 1; 12664 char last[4]; 12665 12666 #define SAVE_LAST(c) \ 12667 if (l < len && l < sizeof (last)) \ 12668 last[l++] = c; \ 12669 else \ 12670 abort (); 12671 12672 for (p = in_template; *p; p++) 12673 { 12674 switch (*p) 12675 { 12676 default: 12677 *obufp++ = *p; 12678 break; 12679 case '%': 12680 len++; 12681 break; 12682 case '!': 12683 cond = 0; 12684 break; 12685 case '{': 12686 if (intel_syntax) 12687 { 12688 while (*++p != '|') 12689 if (*p == '}' || *p == '\0') 12690 abort (); 12691 } 12692 /* Fall through. */ 12693 case 'I': 12694 alt = 1; 12695 continue; 12696 case '|': 12697 while (*++p != '}') 12698 { 12699 if (*p == '\0') 12700 abort (); 12701 } 12702 break; 12703 case '}': 12704 break; 12705 case 'A': 12706 if (intel_syntax) 12707 break; 12708 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) 12709 *obufp++ = 'b'; 12710 break; 12711 case 'B': 12712 if (l == 0 && len == 1) 12713 { 12714 case_B: 12715 if (intel_syntax) 12716 break; 12717 if (sizeflag & SUFFIX_ALWAYS) 12718 *obufp++ = 'b'; 12719 } 12720 else 12721 { 12722 if (l != 1 12723 || len != 2 12724 || last[0] != 'L') 12725 { 12726 SAVE_LAST (*p); 12727 break; 12728 } 12729 12730 if (address_mode == mode_64bit 12731 && !(prefixes & PREFIX_ADDR)) 12732 { 12733 *obufp++ = 'a'; 12734 *obufp++ = 'b'; 12735 *obufp++ = 's'; 12736 } 12737 12738 goto case_B; 12739 } 12740 break; 12741 case 'C': 12742 if (intel_syntax && !alt) 12743 break; 12744 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS)) 12745 { 12746 if (sizeflag & DFLAG) 12747 *obufp++ = intel_syntax ? 'd' : 'l'; 12748 else 12749 *obufp++ = intel_syntax ? 'w' : 's'; 12750 used_prefixes |= (prefixes & PREFIX_DATA); 12751 } 12752 break; 12753 case 'D': 12754 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS)) 12755 break; 12756 USED_REX (REX_W); 12757 if (modrm.mod == 3) 12758 { 12759 if (rex & REX_W) 12760 *obufp++ = 'q'; 12761 else 12762 { 12763 if (sizeflag & DFLAG) 12764 *obufp++ = intel_syntax ? 'd' : 'l'; 12765 else 12766 *obufp++ = 'w'; 12767 used_prefixes |= (prefixes & PREFIX_DATA); 12768 } 12769 } 12770 else 12771 *obufp++ = 'w'; 12772 break; 12773 case 'E': /* For jcxz/jecxz */ 12774 if (address_mode == mode_64bit) 12775 { 12776 if (sizeflag & AFLAG) 12777 *obufp++ = 'r'; 12778 else 12779 *obufp++ = 'e'; 12780 } 12781 else 12782 if (sizeflag & AFLAG) 12783 *obufp++ = 'e'; 12784 used_prefixes |= (prefixes & PREFIX_ADDR); 12785 break; 12786 case 'F': 12787 if (intel_syntax) 12788 break; 12789 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS)) 12790 { 12791 if (sizeflag & AFLAG) 12792 *obufp++ = address_mode == mode_64bit ? 'q' : 'l'; 12793 else 12794 *obufp++ = address_mode == mode_64bit ? 'l' : 'w'; 12795 used_prefixes |= (prefixes & PREFIX_ADDR); 12796 } 12797 break; 12798 case 'G': 12799 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS))) 12800 break; 12801 if ((rex & REX_W) || (sizeflag & DFLAG)) 12802 *obufp++ = 'l'; 12803 else 12804 *obufp++ = 'w'; 12805 if (!(rex & REX_W)) 12806 used_prefixes |= (prefixes & PREFIX_DATA); 12807 break; 12808 case 'H': 12809 if (intel_syntax) 12810 break; 12811 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS 12812 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS) 12813 { 12814 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS); 12815 *obufp++ = ','; 12816 *obufp++ = 'p'; 12817 if (prefixes & PREFIX_DS) 12818 *obufp++ = 't'; 12819 else 12820 *obufp++ = 'n'; 12821 } 12822 break; 12823 case 'J': 12824 if (intel_syntax) 12825 break; 12826 *obufp++ = 'l'; 12827 break; 12828 case 'K': 12829 USED_REX (REX_W); 12830 if (rex & REX_W) 12831 *obufp++ = 'q'; 12832 else 12833 *obufp++ = 'd'; 12834 break; 12835 case 'Z': 12836 if (l != 0 || len != 1) 12837 { 12838 if (l != 1 || len != 2 || last[0] != 'X') 12839 { 12840 SAVE_LAST (*p); 12841 break; 12842 } 12843 if (!need_vex || !vex.evex) 12844 abort (); 12845 if (intel_syntax 12846 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS))) 12847 break; 12848 switch (vex.length) 12849 { 12850 case 128: 12851 *obufp++ = 'x'; 12852 break; 12853 case 256: 12854 *obufp++ = 'y'; 12855 break; 12856 case 512: 12857 *obufp++ = 'z'; 12858 break; 12859 default: 12860 abort (); 12861 } 12862 break; 12863 } 12864 if (intel_syntax) 12865 break; 12866 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS)) 12867 { 12868 *obufp++ = 'q'; 12869 break; 12870 } 12871 /* Fall through. */ 12872 goto case_L; 12873 case 'L': 12874 if (l != 0 || len != 1) 12875 { 12876 SAVE_LAST (*p); 12877 break; 12878 } 12879 case_L: 12880 if (intel_syntax) 12881 break; 12882 if (sizeflag & SUFFIX_ALWAYS) 12883 *obufp++ = 'l'; 12884 break; 12885 case 'M': 12886 if (intel_mnemonic != cond) 12887 *obufp++ = 'r'; 12888 break; 12889 case 'N': 12890 if ((prefixes & PREFIX_FWAIT) == 0) 12891 *obufp++ = 'n'; 12892 else 12893 used_prefixes |= PREFIX_FWAIT; 12894 break; 12895 case 'O': 12896 USED_REX (REX_W); 12897 if (rex & REX_W) 12898 *obufp++ = 'o'; 12899 else if (intel_syntax && (sizeflag & DFLAG)) 12900 *obufp++ = 'q'; 12901 else 12902 *obufp++ = 'd'; 12903 if (!(rex & REX_W)) 12904 used_prefixes |= (prefixes & PREFIX_DATA); 12905 break; 12906 case '&': 12907 if (!intel_syntax 12908 && address_mode == mode_64bit 12909 && isa64 == intel64) 12910 { 12911 *obufp++ = 'q'; 12912 break; 12913 } 12914 /* Fall through. */ 12915 case 'T': 12916 if (!intel_syntax 12917 && address_mode == mode_64bit 12918 && ((sizeflag & DFLAG) || (rex & REX_W))) 12919 { 12920 *obufp++ = 'q'; 12921 break; 12922 } 12923 /* Fall through. */ 12924 goto case_P; 12925 case 'P': 12926 if (l == 0 && len == 1) 12927 { 12928 case_P: 12929 if (intel_syntax) 12930 { 12931 if ((rex & REX_W) == 0 12932 && (prefixes & PREFIX_DATA)) 12933 { 12934 if ((sizeflag & DFLAG) == 0) 12935 *obufp++ = 'w'; 12936 used_prefixes |= (prefixes & PREFIX_DATA); 12937 } 12938 break; 12939 } 12940 if ((prefixes & PREFIX_DATA) 12941 || (rex & REX_W) 12942 || (sizeflag & SUFFIX_ALWAYS)) 12943 { 12944 USED_REX (REX_W); 12945 if (rex & REX_W) 12946 *obufp++ = 'q'; 12947 else 12948 { 12949 if (sizeflag & DFLAG) 12950 *obufp++ = 'l'; 12951 else 12952 *obufp++ = 'w'; 12953 used_prefixes |= (prefixes & PREFIX_DATA); 12954 } 12955 } 12956 } 12957 else 12958 { 12959 if (l != 1 || len != 2 || last[0] != 'L') 12960 { 12961 SAVE_LAST (*p); 12962 break; 12963 } 12964 12965 if ((prefixes & PREFIX_DATA) 12966 || (rex & REX_W) 12967 || (sizeflag & SUFFIX_ALWAYS)) 12968 { 12969 USED_REX (REX_W); 12970 if (rex & REX_W) 12971 *obufp++ = 'q'; 12972 else 12973 { 12974 if (sizeflag & DFLAG) 12975 *obufp++ = intel_syntax ? 'd' : 'l'; 12976 else 12977 *obufp++ = 'w'; 12978 used_prefixes |= (prefixes & PREFIX_DATA); 12979 } 12980 } 12981 } 12982 break; 12983 case 'U': 12984 if (intel_syntax) 12985 break; 12986 if (address_mode == mode_64bit 12987 && ((sizeflag & DFLAG) || (rex & REX_W))) 12988 { 12989 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) 12990 *obufp++ = 'q'; 12991 break; 12992 } 12993 /* Fall through. */ 12994 goto case_Q; 12995 case 'Q': 12996 if (l == 0 && len == 1) 12997 { 12998 case_Q: 12999 if (intel_syntax && !alt) 13000 break; 13001 USED_REX (REX_W); 13002 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) 13003 { 13004 if (rex & REX_W) 13005 *obufp++ = 'q'; 13006 else 13007 { 13008 if (sizeflag & DFLAG) 13009 *obufp++ = intel_syntax ? 'd' : 'l'; 13010 else 13011 *obufp++ = 'w'; 13012 used_prefixes |= (prefixes & PREFIX_DATA); 13013 } 13014 } 13015 } 13016 else 13017 { 13018 if (l != 1 || len != 2 || last[0] != 'L') 13019 { 13020 SAVE_LAST (*p); 13021 break; 13022 } 13023 if (intel_syntax 13024 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS))) 13025 break; 13026 if ((rex & REX_W)) 13027 { 13028 USED_REX (REX_W); 13029 *obufp++ = 'q'; 13030 } 13031 else 13032 *obufp++ = 'l'; 13033 } 13034 break; 13035 case 'R': 13036 USED_REX (REX_W); 13037 if (rex & REX_W) 13038 *obufp++ = 'q'; 13039 else if (sizeflag & DFLAG) 13040 { 13041 if (intel_syntax) 13042 *obufp++ = 'd'; 13043 else 13044 *obufp++ = 'l'; 13045 } 13046 else 13047 *obufp++ = 'w'; 13048 if (intel_syntax && !p[1] 13049 && ((rex & REX_W) || (sizeflag & DFLAG))) 13050 *obufp++ = 'e'; 13051 if (!(rex & REX_W)) 13052 used_prefixes |= (prefixes & PREFIX_DATA); 13053 break; 13054 case 'V': 13055 if (l == 0 && len == 1) 13056 { 13057 if (intel_syntax) 13058 break; 13059 if (address_mode == mode_64bit 13060 && ((sizeflag & DFLAG) || (rex & REX_W))) 13061 { 13062 if (sizeflag & SUFFIX_ALWAYS) 13063 *obufp++ = 'q'; 13064 break; 13065 } 13066 } 13067 else 13068 { 13069 if (l != 1 13070 || len != 2 13071 || last[0] != 'L') 13072 { 13073 SAVE_LAST (*p); 13074 break; 13075 } 13076 13077 if (rex & REX_W) 13078 { 13079 *obufp++ = 'a'; 13080 *obufp++ = 'b'; 13081 *obufp++ = 's'; 13082 } 13083 } 13084 /* Fall through. */ 13085 goto case_S; 13086 case 'S': 13087 if (l == 0 && len == 1) 13088 { 13089 case_S: 13090 if (intel_syntax) 13091 break; 13092 if (sizeflag & SUFFIX_ALWAYS) 13093 { 13094 if (rex & REX_W) 13095 *obufp++ = 'q'; 13096 else 13097 { 13098 if (sizeflag & DFLAG) 13099 *obufp++ = 'l'; 13100 else 13101 *obufp++ = 'w'; 13102 used_prefixes |= (prefixes & PREFIX_DATA); 13103 } 13104 } 13105 } 13106 else 13107 { 13108 if (l != 1 13109 || len != 2 13110 || last[0] != 'L') 13111 { 13112 SAVE_LAST (*p); 13113 break; 13114 } 13115 13116 if (address_mode == mode_64bit 13117 && !(prefixes & PREFIX_ADDR)) 13118 { 13119 *obufp++ = 'a'; 13120 *obufp++ = 'b'; 13121 *obufp++ = 's'; 13122 } 13123 13124 goto case_S; 13125 } 13126 break; 13127 case 'X': 13128 if (l != 0 || len != 1) 13129 { 13130 SAVE_LAST (*p); 13131 break; 13132 } 13133 if (need_vex && vex.prefix) 13134 { 13135 if (vex.prefix == DATA_PREFIX_OPCODE) 13136 *obufp++ = 'd'; 13137 else 13138 *obufp++ = 's'; 13139 } 13140 else 13141 { 13142 if (prefixes & PREFIX_DATA) 13143 *obufp++ = 'd'; 13144 else 13145 *obufp++ = 's'; 13146 used_prefixes |= (prefixes & PREFIX_DATA); 13147 } 13148 break; 13149 case 'Y': 13150 if (l == 0 && len == 1) 13151 abort (); 13152 else 13153 { 13154 if (l != 1 || len != 2 || last[0] != 'X') 13155 { 13156 SAVE_LAST (*p); 13157 break; 13158 } 13159 if (!need_vex) 13160 abort (); 13161 if (intel_syntax 13162 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS))) 13163 break; 13164 switch (vex.length) 13165 { 13166 case 128: 13167 *obufp++ = 'x'; 13168 break; 13169 case 256: 13170 *obufp++ = 'y'; 13171 break; 13172 case 512: 13173 if (!vex.evex) 13174 default: 13175 abort (); 13176 } 13177 } 13178 break; 13179 case 'W': 13180 if (l == 0 && len == 1) 13181 { 13182 /* operand size flag for cwtl, cbtw */ 13183 USED_REX (REX_W); 13184 if (rex & REX_W) 13185 { 13186 if (intel_syntax) 13187 *obufp++ = 'd'; 13188 else 13189 *obufp++ = 'l'; 13190 } 13191 else if (sizeflag & DFLAG) 13192 *obufp++ = 'w'; 13193 else 13194 *obufp++ = 'b'; 13195 if (!(rex & REX_W)) 13196 used_prefixes |= (prefixes & PREFIX_DATA); 13197 } 13198 else 13199 { 13200 if (l != 1 13201 || len != 2 13202 || (last[0] != 'X' 13203 && last[0] != 'L')) 13204 { 13205 SAVE_LAST (*p); 13206 break; 13207 } 13208 if (!need_vex) 13209 abort (); 13210 if (last[0] == 'X') 13211 *obufp++ = vex.w ? 'd': 's'; 13212 else 13213 *obufp++ = vex.w ? 'q': 'd'; 13214 } 13215 break; 13216 case '^': 13217 if (intel_syntax) 13218 break; 13219 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS)) 13220 { 13221 if (sizeflag & DFLAG) 13222 *obufp++ = 'l'; 13223 else 13224 *obufp++ = 'w'; 13225 used_prefixes |= (prefixes & PREFIX_DATA); 13226 } 13227 break; 13228 case '@': 13229 if (intel_syntax) 13230 break; 13231 if (address_mode == mode_64bit 13232 && (isa64 == intel64 13233 || ((sizeflag & DFLAG) || (rex & REX_W)))) 13234 *obufp++ = 'q'; 13235 else if ((prefixes & PREFIX_DATA)) 13236 { 13237 if (!(sizeflag & DFLAG)) 13238 *obufp++ = 'w'; 13239 used_prefixes |= (prefixes & PREFIX_DATA); 13240 } 13241 break; 13242 } 13243 alt = 0; 13244 } 13245 *obufp = 0; 13246 mnemonicendp = obufp; 13247 return 0; 13248 } 13249 13250 static void 13251 oappend (const char *s) 13252 { 13253 obufp = stpcpy (obufp, s); 13254 } 13255 13256 static void 13257 append_seg (void) 13258 { 13259 /* Only print the active segment register. */ 13260 if (!active_seg_prefix) 13261 return; 13262 13263 used_prefixes |= active_seg_prefix; 13264 switch (active_seg_prefix) 13265 { 13266 case PREFIX_CS: 13267 oappend_maybe_intel ("%cs:"); 13268 break; 13269 case PREFIX_DS: 13270 oappend_maybe_intel ("%ds:"); 13271 break; 13272 case PREFIX_SS: 13273 oappend_maybe_intel ("%ss:"); 13274 break; 13275 case PREFIX_ES: 13276 oappend_maybe_intel ("%es:"); 13277 break; 13278 case PREFIX_FS: 13279 oappend_maybe_intel ("%fs:"); 13280 break; 13281 case PREFIX_GS: 13282 oappend_maybe_intel ("%gs:"); 13283 break; 13284 default: 13285 break; 13286 } 13287 } 13288 13289 static void 13290 OP_indirE (int bytemode, int sizeflag) 13291 { 13292 if (!intel_syntax) 13293 oappend ("*"); 13294 OP_E (bytemode, sizeflag); 13295 } 13296 13297 static void 13298 print_operand_value (char *buf, int hex, bfd_vma disp) 13299 { 13300 if (address_mode == mode_64bit) 13301 { 13302 if (hex) 13303 { 13304 char tmp[30]; 13305 int i; 13306 buf[0] = '0'; 13307 buf[1] = 'x'; 13308 sprintf_vma (tmp, disp); 13309 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++); 13310 strcpy (buf + 2, tmp + i); 13311 } 13312 else 13313 { 13314 bfd_signed_vma v = disp; 13315 char tmp[30]; 13316 int i; 13317 if (v < 0) 13318 { 13319 *(buf++) = '-'; 13320 v = -disp; 13321 /* Check for possible overflow on 0x8000000000000000. */ 13322 if (v < 0) 13323 { 13324 strcpy (buf, "9223372036854775808"); 13325 return; 13326 } 13327 } 13328 if (!v) 13329 { 13330 strcpy (buf, "0"); 13331 return; 13332 } 13333 13334 i = 0; 13335 tmp[29] = 0; 13336 while (v) 13337 { 13338 tmp[28 - i] = (v % 10) + '0'; 13339 v /= 10; 13340 i++; 13341 } 13342 strcpy (buf, tmp + 29 - i); 13343 } 13344 } 13345 else 13346 { 13347 if (hex) 13348 sprintf (buf, "0x%x", (unsigned int) disp); 13349 else 13350 sprintf (buf, "%d", (int) disp); 13351 } 13352 } 13353 13354 /* Put DISP in BUF as signed hex number. */ 13355 13356 static void 13357 print_displacement (char *buf, bfd_vma disp) 13358 { 13359 bfd_signed_vma val = disp; 13360 char tmp[30]; 13361 int i, j = 0; 13362 13363 if (val < 0) 13364 { 13365 buf[j++] = '-'; 13366 val = -disp; 13367 13368 /* Check for possible overflow. */ 13369 if (val < 0) 13370 { 13371 switch (address_mode) 13372 { 13373 case mode_64bit: 13374 strcpy (buf + j, "0x8000000000000000"); 13375 break; 13376 case mode_32bit: 13377 strcpy (buf + j, "0x80000000"); 13378 break; 13379 case mode_16bit: 13380 strcpy (buf + j, "0x8000"); 13381 break; 13382 } 13383 return; 13384 } 13385 } 13386 13387 buf[j++] = '0'; 13388 buf[j++] = 'x'; 13389 13390 sprintf_vma (tmp, (bfd_vma) val); 13391 for (i = 0; tmp[i] == '0'; i++) 13392 continue; 13393 if (tmp[i] == '\0') 13394 i--; 13395 strcpy (buf + j, tmp + i); 13396 } 13397 13398 static void 13399 intel_operand_size (int bytemode, int sizeflag) 13400 { 13401 if (vex.evex 13402 && vex.b 13403 && (bytemode == x_mode 13404 || bytemode == evex_half_bcst_xmmq_mode)) 13405 { 13406 if (vex.w) 13407 oappend ("QWORD PTR "); 13408 else 13409 oappend ("DWORD PTR "); 13410 return; 13411 } 13412 switch (bytemode) 13413 { 13414 case b_mode: 13415 case b_swap_mode: 13416 case dqb_mode: 13417 case db_mode: 13418 oappend ("BYTE PTR "); 13419 break; 13420 case w_mode: 13421 case dw_mode: 13422 case dqw_mode: 13423 oappend ("WORD PTR "); 13424 break; 13425 case indir_v_mode: 13426 if (address_mode == mode_64bit && isa64 == intel64) 13427 { 13428 oappend ("QWORD PTR "); 13429 break; 13430 } 13431 /* Fall through. */ 13432 case stack_v_mode: 13433 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W))) 13434 { 13435 oappend ("QWORD PTR "); 13436 break; 13437 } 13438 /* Fall through. */ 13439 case v_mode: 13440 case v_swap_mode: 13441 case dq_mode: 13442 USED_REX (REX_W); 13443 if (rex & REX_W) 13444 oappend ("QWORD PTR "); 13445 else 13446 { 13447 if ((sizeflag & DFLAG) || bytemode == dq_mode) 13448 oappend ("DWORD PTR "); 13449 else 13450 oappend ("WORD PTR "); 13451 used_prefixes |= (prefixes & PREFIX_DATA); 13452 } 13453 break; 13454 case z_mode: 13455 if ((rex & REX_W) || (sizeflag & DFLAG)) 13456 *obufp++ = 'D'; 13457 oappend ("WORD PTR "); 13458 if (!(rex & REX_W)) 13459 used_prefixes |= (prefixes & PREFIX_DATA); 13460 break; 13461 case a_mode: 13462 if (sizeflag & DFLAG) 13463 oappend ("QWORD PTR "); 13464 else 13465 oappend ("DWORD PTR "); 13466 used_prefixes |= (prefixes & PREFIX_DATA); 13467 break; 13468 case d_mode: 13469 case d_scalar_mode: 13470 case d_scalar_swap_mode: 13471 case d_swap_mode: 13472 case dqd_mode: 13473 oappend ("DWORD PTR "); 13474 break; 13475 case q_mode: 13476 case q_scalar_mode: 13477 case q_scalar_swap_mode: 13478 case q_swap_mode: 13479 oappend ("QWORD PTR "); 13480 break; 13481 case dqa_mode: 13482 case m_mode: 13483 if (address_mode == mode_64bit) 13484 oappend ("QWORD PTR "); 13485 else 13486 oappend ("DWORD PTR "); 13487 break; 13488 case f_mode: 13489 if (sizeflag & DFLAG) 13490 oappend ("FWORD PTR "); 13491 else 13492 oappend ("DWORD PTR "); 13493 used_prefixes |= (prefixes & PREFIX_DATA); 13494 break; 13495 case t_mode: 13496 oappend ("TBYTE PTR "); 13497 break; 13498 case x_mode: 13499 case x_swap_mode: 13500 case evex_x_gscat_mode: 13501 case evex_x_nobcst_mode: 13502 case b_scalar_mode: 13503 case w_scalar_mode: 13504 if (need_vex) 13505 { 13506 switch (vex.length) 13507 { 13508 case 128: 13509 oappend ("XMMWORD PTR "); 13510 break; 13511 case 256: 13512 oappend ("YMMWORD PTR "); 13513 break; 13514 case 512: 13515 oappend ("ZMMWORD PTR "); 13516 break; 13517 default: 13518 abort (); 13519 } 13520 } 13521 else 13522 oappend ("XMMWORD PTR "); 13523 break; 13524 case xmm_mode: 13525 oappend ("XMMWORD PTR "); 13526 break; 13527 case ymm_mode: 13528 oappend ("YMMWORD PTR "); 13529 break; 13530 case xmmq_mode: 13531 case evex_half_bcst_xmmq_mode: 13532 if (!need_vex) 13533 abort (); 13534 13535 switch (vex.length) 13536 { 13537 case 128: 13538 oappend ("QWORD PTR "); 13539 break; 13540 case 256: 13541 oappend ("XMMWORD PTR "); 13542 break; 13543 case 512: 13544 oappend ("YMMWORD PTR "); 13545 break; 13546 default: 13547 abort (); 13548 } 13549 break; 13550 case xmm_mb_mode: 13551 if (!need_vex) 13552 abort (); 13553 13554 switch (vex.length) 13555 { 13556 case 128: 13557 case 256: 13558 case 512: 13559 oappend ("BYTE PTR "); 13560 break; 13561 default: 13562 abort (); 13563 } 13564 break; 13565 case xmm_mw_mode: 13566 if (!need_vex) 13567 abort (); 13568 13569 switch (vex.length) 13570 { 13571 case 128: 13572 case 256: 13573 case 512: 13574 oappend ("WORD PTR "); 13575 break; 13576 default: 13577 abort (); 13578 } 13579 break; 13580 case xmm_md_mode: 13581 if (!need_vex) 13582 abort (); 13583 13584 switch (vex.length) 13585 { 13586 case 128: 13587 case 256: 13588 case 512: 13589 oappend ("DWORD PTR "); 13590 break; 13591 default: 13592 abort (); 13593 } 13594 break; 13595 case xmm_mq_mode: 13596 if (!need_vex) 13597 abort (); 13598 13599 switch (vex.length) 13600 { 13601 case 128: 13602 case 256: 13603 case 512: 13604 oappend ("QWORD PTR "); 13605 break; 13606 default: 13607 abort (); 13608 } 13609 break; 13610 case xmmdw_mode: 13611 if (!need_vex) 13612 abort (); 13613 13614 switch (vex.length) 13615 { 13616 case 128: 13617 oappend ("WORD PTR "); 13618 break; 13619 case 256: 13620 oappend ("DWORD PTR "); 13621 break; 13622 case 512: 13623 oappend ("QWORD PTR "); 13624 break; 13625 default: 13626 abort (); 13627 } 13628 break; 13629 case xmmqd_mode: 13630 if (!need_vex) 13631 abort (); 13632 13633 switch (vex.length) 13634 { 13635 case 128: 13636 oappend ("DWORD PTR "); 13637 break; 13638 case 256: 13639 oappend ("QWORD PTR "); 13640 break; 13641 case 512: 13642 oappend ("XMMWORD PTR "); 13643 break; 13644 default: 13645 abort (); 13646 } 13647 break; 13648 case ymmq_mode: 13649 if (!need_vex) 13650 abort (); 13651 13652 switch (vex.length) 13653 { 13654 case 128: 13655 oappend ("QWORD PTR "); 13656 break; 13657 case 256: 13658 oappend ("YMMWORD PTR "); 13659 break; 13660 case 512: 13661 oappend ("ZMMWORD PTR "); 13662 break; 13663 default: 13664 abort (); 13665 } 13666 break; 13667 case ymmxmm_mode: 13668 if (!need_vex) 13669 abort (); 13670 13671 switch (vex.length) 13672 { 13673 case 128: 13674 case 256: 13675 oappend ("XMMWORD PTR "); 13676 break; 13677 default: 13678 abort (); 13679 } 13680 break; 13681 case o_mode: 13682 oappend ("OWORD PTR "); 13683 break; 13684 case xmm_mdq_mode: 13685 case vex_w_dq_mode: 13686 case vex_scalar_w_dq_mode: 13687 if (!need_vex) 13688 abort (); 13689 13690 if (vex.w) 13691 oappend ("QWORD PTR "); 13692 else 13693 oappend ("DWORD PTR "); 13694 break; 13695 case vex_vsib_d_w_dq_mode: 13696 case vex_vsib_q_w_dq_mode: 13697 if (!need_vex) 13698 abort (); 13699 13700 if (!vex.evex) 13701 { 13702 if (vex.w) 13703 oappend ("QWORD PTR "); 13704 else 13705 oappend ("DWORD PTR "); 13706 } 13707 else 13708 { 13709 switch (vex.length) 13710 { 13711 case 128: 13712 oappend ("XMMWORD PTR "); 13713 break; 13714 case 256: 13715 oappend ("YMMWORD PTR "); 13716 break; 13717 case 512: 13718 oappend ("ZMMWORD PTR "); 13719 break; 13720 default: 13721 abort (); 13722 } 13723 } 13724 break; 13725 case vex_vsib_q_w_d_mode: 13726 case vex_vsib_d_w_d_mode: 13727 if (!need_vex || !vex.evex) 13728 abort (); 13729 13730 switch (vex.length) 13731 { 13732 case 128: 13733 oappend ("QWORD PTR "); 13734 break; 13735 case 256: 13736 oappend ("XMMWORD PTR "); 13737 break; 13738 case 512: 13739 oappend ("YMMWORD PTR "); 13740 break; 13741 default: 13742 abort (); 13743 } 13744 13745 break; 13746 case mask_bd_mode: 13747 if (!need_vex || vex.length != 128) 13748 abort (); 13749 if (vex.w) 13750 oappend ("DWORD PTR "); 13751 else 13752 oappend ("BYTE PTR "); 13753 break; 13754 case mask_mode: 13755 if (!need_vex) 13756 abort (); 13757 if (vex.w) 13758 oappend ("QWORD PTR "); 13759 else 13760 oappend ("WORD PTR "); 13761 break; 13762 case v_bnd_mode: 13763 case v_bndmk_mode: 13764 default: 13765 break; 13766 } 13767 } 13768 13769 static void 13770 OP_E_register (int bytemode, int sizeflag) 13771 { 13772 int reg = modrm.rm; 13773 const char **names; 13774 13775 USED_REX (REX_B); 13776 if ((rex & REX_B)) 13777 reg += 8; 13778 13779 if ((sizeflag & SUFFIX_ALWAYS) 13780 && (bytemode == b_swap_mode 13781 || bytemode == bnd_swap_mode 13782 || bytemode == v_swap_mode)) 13783 swap_operand (); 13784 13785 switch (bytemode) 13786 { 13787 case b_mode: 13788 case b_swap_mode: 13789 USED_REX (0); 13790 if (rex) 13791 names = names8rex; 13792 else 13793 names = names8; 13794 break; 13795 case w_mode: 13796 names = names16; 13797 break; 13798 case d_mode: 13799 case dw_mode: 13800 case db_mode: 13801 names = names32; 13802 break; 13803 case q_mode: 13804 names = names64; 13805 break; 13806 case m_mode: 13807 case v_bnd_mode: 13808 names = address_mode == mode_64bit ? names64 : names32; 13809 break; 13810 case bnd_mode: 13811 case bnd_swap_mode: 13812 if (reg > 0x3) 13813 { 13814 oappend ("(bad)"); 13815 return; 13816 } 13817 names = names_bnd; 13818 break; 13819 case indir_v_mode: 13820 if (address_mode == mode_64bit && isa64 == intel64) 13821 { 13822 names = names64; 13823 break; 13824 } 13825 /* Fall through. */ 13826 case stack_v_mode: 13827 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W))) 13828 { 13829 names = names64; 13830 break; 13831 } 13832 bytemode = v_mode; 13833 /* Fall through. */ 13834 case v_mode: 13835 case v_swap_mode: 13836 case dq_mode: 13837 case dqb_mode: 13838 case dqd_mode: 13839 case dqw_mode: 13840 case dqa_mode: 13841 USED_REX (REX_W); 13842 if (rex & REX_W) 13843 names = names64; 13844 else 13845 { 13846 if ((sizeflag & DFLAG) 13847 || (bytemode != v_mode 13848 && bytemode != v_swap_mode)) 13849 names = names32; 13850 else 13851 names = names16; 13852 used_prefixes |= (prefixes & PREFIX_DATA); 13853 } 13854 break; 13855 case va_mode: 13856 names = (address_mode == mode_64bit 13857 ? names64 : names32); 13858 if (!(prefixes & PREFIX_ADDR)) 13859 names = (address_mode == mode_16bit 13860 ? names16 : names); 13861 else 13862 { 13863 /* Remove "addr16/addr32". */ 13864 all_prefixes[last_addr_prefix] = 0; 13865 names = (address_mode != mode_32bit 13866 ? names32 : names16); 13867 used_prefixes |= PREFIX_ADDR; 13868 } 13869 break; 13870 case mask_bd_mode: 13871 case mask_mode: 13872 if (reg > 0x7) 13873 { 13874 oappend ("(bad)"); 13875 return; 13876 } 13877 names = names_mask; 13878 break; 13879 case 0: 13880 return; 13881 default: 13882 oappend (INTERNAL_DISASSEMBLER_ERROR); 13883 return; 13884 } 13885 oappend (names[reg]); 13886 } 13887 13888 static void 13889 OP_E_memory (int bytemode, int sizeflag) 13890 { 13891 bfd_vma disp = 0; 13892 int add = (rex & REX_B) ? 8 : 0; 13893 int riprel = 0; 13894 int shift; 13895 13896 if (vex.evex) 13897 { 13898 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */ 13899 if (vex.b 13900 && bytemode != x_mode 13901 && bytemode != xmmq_mode 13902 && bytemode != evex_half_bcst_xmmq_mode) 13903 { 13904 BadOp (); 13905 return; 13906 } 13907 switch (bytemode) 13908 { 13909 case dqw_mode: 13910 case dw_mode: 13911 shift = 1; 13912 break; 13913 case dqb_mode: 13914 case db_mode: 13915 shift = 0; 13916 break; 13917 case dq_mode: 13918 if (address_mode != mode_64bit) 13919 { 13920 shift = 2; 13921 break; 13922 } 13923 /* fall through */ 13924 case vex_vsib_d_w_dq_mode: 13925 case vex_vsib_d_w_d_mode: 13926 case vex_vsib_q_w_dq_mode: 13927 case vex_vsib_q_w_d_mode: 13928 case evex_x_gscat_mode: 13929 case xmm_mdq_mode: 13930 shift = vex.w ? 3 : 2; 13931 break; 13932 case x_mode: 13933 case evex_half_bcst_xmmq_mode: 13934 case xmmq_mode: 13935 if (vex.b) 13936 { 13937 shift = vex.w ? 3 : 2; 13938 break; 13939 } 13940 /* Fall through. */ 13941 case xmmqd_mode: 13942 case xmmdw_mode: 13943 case ymmq_mode: 13944 case evex_x_nobcst_mode: 13945 case x_swap_mode: 13946 switch (vex.length) 13947 { 13948 case 128: 13949 shift = 4; 13950 break; 13951 case 256: 13952 shift = 5; 13953 break; 13954 case 512: 13955 shift = 6; 13956 break; 13957 default: 13958 abort (); 13959 } 13960 break; 13961 case ymm_mode: 13962 shift = 5; 13963 break; 13964 case xmm_mode: 13965 shift = 4; 13966 break; 13967 case xmm_mq_mode: 13968 case q_mode: 13969 case q_scalar_mode: 13970 case q_swap_mode: 13971 case q_scalar_swap_mode: 13972 shift = 3; 13973 break; 13974 case dqd_mode: 13975 case xmm_md_mode: 13976 case d_mode: 13977 case d_scalar_mode: 13978 case d_swap_mode: 13979 case d_scalar_swap_mode: 13980 shift = 2; 13981 break; 13982 case w_scalar_mode: 13983 case xmm_mw_mode: 13984 shift = 1; 13985 break; 13986 case b_scalar_mode: 13987 case xmm_mb_mode: 13988 shift = 0; 13989 break; 13990 case dqa_mode: 13991 shift = address_mode == mode_64bit ? 3 : 2; 13992 break; 13993 default: 13994 abort (); 13995 } 13996 /* Make necessary corrections to shift for modes that need it. 13997 For these modes we currently have shift 4, 5 or 6 depending on 13998 vex.length (it corresponds to xmmword, ymmword or zmmword 13999 operand). We might want to make it 3, 4 or 5 (e.g. for 14000 xmmq_mode). In case of broadcast enabled the corrections 14001 aren't needed, as element size is always 32 or 64 bits. */ 14002 if (!vex.b 14003 && (bytemode == xmmq_mode 14004 || bytemode == evex_half_bcst_xmmq_mode)) 14005 shift -= 1; 14006 else if (bytemode == xmmqd_mode) 14007 shift -= 2; 14008 else if (bytemode == xmmdw_mode) 14009 shift -= 3; 14010 else if (bytemode == ymmq_mode && vex.length == 128) 14011 shift -= 1; 14012 } 14013 else 14014 shift = 0; 14015 14016 USED_REX (REX_B); 14017 if (intel_syntax) 14018 intel_operand_size (bytemode, sizeflag); 14019 append_seg (); 14020 14021 if ((sizeflag & AFLAG) || address_mode == mode_64bit) 14022 { 14023 /* 32/64 bit address mode */ 14024 int havedisp; 14025 int havesib; 14026 int havebase; 14027 int haveindex; 14028 int needindex; 14029 int needaddr32; 14030 int base, rbase; 14031 int vindex = 0; 14032 int scale = 0; 14033 int addr32flag = !((sizeflag & AFLAG) 14034 || bytemode == v_bnd_mode 14035 || bytemode == v_bndmk_mode 14036 || bytemode == bnd_mode 14037 || bytemode == bnd_swap_mode); 14038 const char **indexes64 = names64; 14039 const char **indexes32 = names32; 14040 14041 havesib = 0; 14042 havebase = 1; 14043 haveindex = 0; 14044 base = modrm.rm; 14045 14046 if (base == 4) 14047 { 14048 havesib = 1; 14049 vindex = sib.index; 14050 USED_REX (REX_X); 14051 if (rex & REX_X) 14052 vindex += 8; 14053 switch (bytemode) 14054 { 14055 case vex_vsib_d_w_dq_mode: 14056 case vex_vsib_d_w_d_mode: 14057 case vex_vsib_q_w_dq_mode: 14058 case vex_vsib_q_w_d_mode: 14059 if (!need_vex) 14060 abort (); 14061 if (vex.evex) 14062 { 14063 if (!vex.v) 14064 vindex += 16; 14065 } 14066 14067 haveindex = 1; 14068 switch (vex.length) 14069 { 14070 case 128: 14071 indexes64 = indexes32 = names_xmm; 14072 break; 14073 case 256: 14074 if (!vex.w 14075 || bytemode == vex_vsib_q_w_dq_mode 14076 || bytemode == vex_vsib_q_w_d_mode) 14077 indexes64 = indexes32 = names_ymm; 14078 else 14079 indexes64 = indexes32 = names_xmm; 14080 break; 14081 case 512: 14082 if (!vex.w 14083 || bytemode == vex_vsib_q_w_dq_mode 14084 || bytemode == vex_vsib_q_w_d_mode) 14085 indexes64 = indexes32 = names_zmm; 14086 else 14087 indexes64 = indexes32 = names_ymm; 14088 break; 14089 default: 14090 abort (); 14091 } 14092 break; 14093 default: 14094 haveindex = vindex != 4; 14095 break; 14096 } 14097 scale = sib.scale; 14098 base = sib.base; 14099 codep++; 14100 } 14101 rbase = base + add; 14102 14103 switch (modrm.mod) 14104 { 14105 case 0: 14106 if (base == 5) 14107 { 14108 havebase = 0; 14109 if (address_mode == mode_64bit && !havesib) 14110 riprel = 1; 14111 disp = get32s (); 14112 if (riprel && bytemode == v_bndmk_mode) 14113 { 14114 oappend ("(bad)"); 14115 return; 14116 } 14117 } 14118 break; 14119 case 1: 14120 FETCH_DATA (the_info, codep + 1); 14121 disp = *codep++; 14122 if ((disp & 0x80) != 0) 14123 disp -= 0x100; 14124 if (vex.evex && shift > 0) 14125 disp <<= shift; 14126 break; 14127 case 2: 14128 disp = get32s (); 14129 break; 14130 } 14131 14132 needindex = 0; 14133 needaddr32 = 0; 14134 if (havesib 14135 && !havebase 14136 && !haveindex 14137 && address_mode != mode_16bit) 14138 { 14139 if (address_mode == mode_64bit) 14140 { 14141 /* Display eiz instead of addr32. */ 14142 needindex = addr32flag; 14143 needaddr32 = 1; 14144 } 14145 else 14146 { 14147 /* In 32-bit mode, we need index register to tell [offset] 14148 from [eiz*1 + offset]. */ 14149 needindex = 1; 14150 } 14151 } 14152 14153 havedisp = (havebase 14154 || needindex 14155 || (havesib && (haveindex || scale != 0))); 14156 14157 if (!intel_syntax) 14158 if (modrm.mod != 0 || base == 5) 14159 { 14160 if (havedisp || riprel) 14161 print_displacement (scratchbuf, disp); 14162 else 14163 print_operand_value (scratchbuf, 1, disp); 14164 oappend (scratchbuf); 14165 if (riprel) 14166 { 14167 set_op (disp, 1); 14168 oappend (!addr32flag ? "(%rip)" : "(%eip)"); 14169 } 14170 } 14171 14172 if ((havebase || haveindex || needaddr32 || riprel) 14173 && (bytemode != v_bnd_mode) 14174 && (bytemode != v_bndmk_mode) 14175 && (bytemode != bnd_mode) 14176 && (bytemode != bnd_swap_mode)) 14177 used_prefixes |= PREFIX_ADDR; 14178 14179 if (havedisp || (intel_syntax && riprel)) 14180 { 14181 *obufp++ = open_char; 14182 if (intel_syntax && riprel) 14183 { 14184 set_op (disp, 1); 14185 oappend (!addr32flag ? "rip" : "eip"); 14186 } 14187 *obufp = '\0'; 14188 if (havebase) 14189 oappend (address_mode == mode_64bit && !addr32flag 14190 ? names64[rbase] : names32[rbase]); 14191 if (havesib) 14192 { 14193 /* ESP/RSP won't allow index. If base isn't ESP/RSP, 14194 print index to tell base + index from base. */ 14195 if (scale != 0 14196 || needindex 14197 || haveindex 14198 || (havebase && base != ESP_REG_NUM)) 14199 { 14200 if (!intel_syntax || havebase) 14201 { 14202 *obufp++ = separator_char; 14203 *obufp = '\0'; 14204 } 14205 if (haveindex) 14206 oappend (address_mode == mode_64bit && !addr32flag 14207 ? indexes64[vindex] : indexes32[vindex]); 14208 else 14209 oappend (address_mode == mode_64bit && !addr32flag 14210 ? index64 : index32); 14211 14212 *obufp++ = scale_char; 14213 *obufp = '\0'; 14214 sprintf (scratchbuf, "%d", 1 << scale); 14215 oappend (scratchbuf); 14216 } 14217 } 14218 if (intel_syntax 14219 && (disp || modrm.mod != 0 || base == 5)) 14220 { 14221 if (!havedisp || (bfd_signed_vma) disp >= 0) 14222 { 14223 *obufp++ = '+'; 14224 *obufp = '\0'; 14225 } 14226 else if (modrm.mod != 1 && disp != -disp) 14227 { 14228 *obufp++ = '-'; 14229 *obufp = '\0'; 14230 disp = - (bfd_signed_vma) disp; 14231 } 14232 14233 if (havedisp) 14234 print_displacement (scratchbuf, disp); 14235 else 14236 print_operand_value (scratchbuf, 1, disp); 14237 oappend (scratchbuf); 14238 } 14239 14240 *obufp++ = close_char; 14241 *obufp = '\0'; 14242 } 14243 else if (intel_syntax) 14244 { 14245 if (modrm.mod != 0 || base == 5) 14246 { 14247 if (!active_seg_prefix) 14248 { 14249 oappend (names_seg[ds_reg - es_reg]); 14250 oappend (":"); 14251 } 14252 print_operand_value (scratchbuf, 1, disp); 14253 oappend (scratchbuf); 14254 } 14255 } 14256 } 14257 else 14258 { 14259 /* 16 bit address mode */ 14260 used_prefixes |= prefixes & PREFIX_ADDR; 14261 switch (modrm.mod) 14262 { 14263 case 0: 14264 if (modrm.rm == 6) 14265 { 14266 disp = get16 (); 14267 if ((disp & 0x8000) != 0) 14268 disp -= 0x10000; 14269 } 14270 break; 14271 case 1: 14272 FETCH_DATA (the_info, codep + 1); 14273 disp = *codep++; 14274 if ((disp & 0x80) != 0) 14275 disp -= 0x100; 14276 if (vex.evex && shift > 0) 14277 disp <<= shift; 14278 break; 14279 case 2: 14280 disp = get16 (); 14281 if ((disp & 0x8000) != 0) 14282 disp -= 0x10000; 14283 break; 14284 } 14285 14286 if (!intel_syntax) 14287 if (modrm.mod != 0 || modrm.rm == 6) 14288 { 14289 print_displacement (scratchbuf, disp); 14290 oappend (scratchbuf); 14291 } 14292 14293 if (modrm.mod != 0 || modrm.rm != 6) 14294 { 14295 *obufp++ = open_char; 14296 *obufp = '\0'; 14297 oappend (index16[modrm.rm]); 14298 if (intel_syntax 14299 && (disp || modrm.mod != 0 || modrm.rm == 6)) 14300 { 14301 if ((bfd_signed_vma) disp >= 0) 14302 { 14303 *obufp++ = '+'; 14304 *obufp = '\0'; 14305 } 14306 else if (modrm.mod != 1) 14307 { 14308 *obufp++ = '-'; 14309 *obufp = '\0'; 14310 disp = - (bfd_signed_vma) disp; 14311 } 14312 14313 print_displacement (scratchbuf, disp); 14314 oappend (scratchbuf); 14315 } 14316 14317 *obufp++ = close_char; 14318 *obufp = '\0'; 14319 } 14320 else if (intel_syntax) 14321 { 14322 if (!active_seg_prefix) 14323 { 14324 oappend (names_seg[ds_reg - es_reg]); 14325 oappend (":"); 14326 } 14327 print_operand_value (scratchbuf, 1, disp & 0xffff); 14328 oappend (scratchbuf); 14329 } 14330 } 14331 if (vex.evex && vex.b 14332 && (bytemode == x_mode 14333 || bytemode == xmmq_mode 14334 || bytemode == evex_half_bcst_xmmq_mode)) 14335 { 14336 if (vex.w 14337 || bytemode == xmmq_mode 14338 || bytemode == evex_half_bcst_xmmq_mode) 14339 { 14340 switch (vex.length) 14341 { 14342 case 128: 14343 oappend ("{1to2}"); 14344 break; 14345 case 256: 14346 oappend ("{1to4}"); 14347 break; 14348 case 512: 14349 oappend ("{1to8}"); 14350 break; 14351 default: 14352 abort (); 14353 } 14354 } 14355 else 14356 { 14357 switch (vex.length) 14358 { 14359 case 128: 14360 oappend ("{1to4}"); 14361 break; 14362 case 256: 14363 oappend ("{1to8}"); 14364 break; 14365 case 512: 14366 oappend ("{1to16}"); 14367 break; 14368 default: 14369 abort (); 14370 } 14371 } 14372 } 14373 } 14374 14375 static void 14376 OP_E (int bytemode, int sizeflag) 14377 { 14378 /* Skip mod/rm byte. */ 14379 MODRM_CHECK; 14380 codep++; 14381 14382 if (modrm.mod == 3) 14383 OP_E_register (bytemode, sizeflag); 14384 else 14385 OP_E_memory (bytemode, sizeflag); 14386 } 14387 14388 static void 14389 OP_G (int bytemode, int sizeflag) 14390 { 14391 int add = 0; 14392 const char **names; 14393 USED_REX (REX_R); 14394 if (rex & REX_R) 14395 add += 8; 14396 switch (bytemode) 14397 { 14398 case b_mode: 14399 USED_REX (0); 14400 if (rex) 14401 oappend (names8rex[modrm.reg + add]); 14402 else 14403 oappend (names8[modrm.reg + add]); 14404 break; 14405 case w_mode: 14406 oappend (names16[modrm.reg + add]); 14407 break; 14408 case d_mode: 14409 case db_mode: 14410 case dw_mode: 14411 oappend (names32[modrm.reg + add]); 14412 break; 14413 case q_mode: 14414 oappend (names64[modrm.reg + add]); 14415 break; 14416 case bnd_mode: 14417 if (modrm.reg > 0x3) 14418 { 14419 oappend ("(bad)"); 14420 return; 14421 } 14422 oappend (names_bnd[modrm.reg]); 14423 break; 14424 case v_mode: 14425 case dq_mode: 14426 case dqb_mode: 14427 case dqd_mode: 14428 case dqw_mode: 14429 USED_REX (REX_W); 14430 if (rex & REX_W) 14431 oappend (names64[modrm.reg + add]); 14432 else 14433 { 14434 if ((sizeflag & DFLAG) || bytemode != v_mode) 14435 oappend (names32[modrm.reg + add]); 14436 else 14437 oappend (names16[modrm.reg + add]); 14438 used_prefixes |= (prefixes & PREFIX_DATA); 14439 } 14440 break; 14441 case va_mode: 14442 names = (address_mode == mode_64bit 14443 ? names64 : names32); 14444 if (!(prefixes & PREFIX_ADDR)) 14445 { 14446 if (address_mode == mode_16bit) 14447 names = names16; 14448 } 14449 else 14450 { 14451 /* Remove "addr16/addr32". */ 14452 all_prefixes[last_addr_prefix] = 0; 14453 names = (address_mode != mode_32bit 14454 ? names32 : names16); 14455 used_prefixes |= PREFIX_ADDR; 14456 } 14457 oappend (names[modrm.reg + add]); 14458 break; 14459 case m_mode: 14460 if (address_mode == mode_64bit) 14461 oappend (names64[modrm.reg + add]); 14462 else 14463 oappend (names32[modrm.reg + add]); 14464 break; 14465 case mask_bd_mode: 14466 case mask_mode: 14467 if ((modrm.reg + add) > 0x7) 14468 { 14469 oappend ("(bad)"); 14470 return; 14471 } 14472 oappend (names_mask[modrm.reg + add]); 14473 break; 14474 default: 14475 oappend (INTERNAL_DISASSEMBLER_ERROR); 14476 break; 14477 } 14478 } 14479 14480 static bfd_vma 14481 get64 (void) 14482 { 14483 bfd_vma x; 14484 #ifdef BFD64 14485 unsigned int a; 14486 unsigned int b; 14487 14488 FETCH_DATA (the_info, codep + 8); 14489 a = *codep++ & 0xff; 14490 a |= (*codep++ & 0xff) << 8; 14491 a |= (*codep++ & 0xff) << 16; 14492 a |= (*codep++ & 0xffu) << 24; 14493 b = *codep++ & 0xff; 14494 b |= (*codep++ & 0xff) << 8; 14495 b |= (*codep++ & 0xff) << 16; 14496 b |= (*codep++ & 0xffu) << 24; 14497 x = a + ((bfd_vma) b << 32); 14498 #else 14499 abort (); 14500 x = 0; 14501 #endif 14502 return x; 14503 } 14504 14505 static bfd_signed_vma 14506 get32 (void) 14507 { 14508 bfd_signed_vma x = 0; 14509 14510 FETCH_DATA (the_info, codep + 4); 14511 x = *codep++ & (bfd_signed_vma) 0xff; 14512 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8; 14513 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16; 14514 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24; 14515 return x; 14516 } 14517 14518 static bfd_signed_vma 14519 get32s (void) 14520 { 14521 bfd_signed_vma x = 0; 14522 14523 FETCH_DATA (the_info, codep + 4); 14524 x = *codep++ & (bfd_signed_vma) 0xff; 14525 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8; 14526 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16; 14527 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24; 14528 14529 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31); 14530 14531 return x; 14532 } 14533 14534 static int 14535 get16 (void) 14536 { 14537 int x = 0; 14538 14539 FETCH_DATA (the_info, codep + 2); 14540 x = *codep++ & 0xff; 14541 x |= (*codep++ & 0xff) << 8; 14542 return x; 14543 } 14544 14545 static void 14546 set_op (bfd_vma op, int riprel) 14547 { 14548 op_index[op_ad] = op_ad; 14549 if (address_mode == mode_64bit) 14550 { 14551 op_address[op_ad] = op; 14552 op_riprel[op_ad] = riprel; 14553 } 14554 else 14555 { 14556 /* Mask to get a 32-bit address. */ 14557 op_address[op_ad] = op & 0xffffffff; 14558 op_riprel[op_ad] = riprel & 0xffffffff; 14559 } 14560 } 14561 14562 static void 14563 OP_REG (int code, int sizeflag) 14564 { 14565 const char *s; 14566 int add; 14567 14568 switch (code) 14569 { 14570 case es_reg: case ss_reg: case cs_reg: 14571 case ds_reg: case fs_reg: case gs_reg: 14572 oappend (names_seg[code - es_reg]); 14573 return; 14574 } 14575 14576 USED_REX (REX_B); 14577 if (rex & REX_B) 14578 add = 8; 14579 else 14580 add = 0; 14581 14582 switch (code) 14583 { 14584 case ax_reg: case cx_reg: case dx_reg: case bx_reg: 14585 case sp_reg: case bp_reg: case si_reg: case di_reg: 14586 s = names16[code - ax_reg + add]; 14587 break; 14588 case al_reg: case ah_reg: case cl_reg: case ch_reg: 14589 case dl_reg: case dh_reg: case bl_reg: case bh_reg: 14590 USED_REX (0); 14591 if (rex) 14592 s = names8rex[code - al_reg + add]; 14593 else 14594 s = names8[code - al_reg]; 14595 break; 14596 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg: 14597 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg: 14598 if (address_mode == mode_64bit 14599 && ((sizeflag & DFLAG) || (rex & REX_W))) 14600 { 14601 s = names64[code - rAX_reg + add]; 14602 break; 14603 } 14604 code += eAX_reg - rAX_reg; 14605 /* Fall through. */ 14606 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: 14607 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: 14608 USED_REX (REX_W); 14609 if (rex & REX_W) 14610 s = names64[code - eAX_reg + add]; 14611 else 14612 { 14613 if (sizeflag & DFLAG) 14614 s = names32[code - eAX_reg + add]; 14615 else 14616 s = names16[code - eAX_reg + add]; 14617 used_prefixes |= (prefixes & PREFIX_DATA); 14618 } 14619 break; 14620 default: 14621 s = INTERNAL_DISASSEMBLER_ERROR; 14622 break; 14623 } 14624 oappend (s); 14625 } 14626 14627 static void 14628 OP_IMREG (int code, int sizeflag) 14629 { 14630 const char *s; 14631 14632 switch (code) 14633 { 14634 case indir_dx_reg: 14635 if (intel_syntax) 14636 s = "dx"; 14637 else 14638 s = "(%dx)"; 14639 break; 14640 case ax_reg: case cx_reg: case dx_reg: case bx_reg: 14641 case sp_reg: case bp_reg: case si_reg: case di_reg: 14642 s = names16[code - ax_reg]; 14643 break; 14644 case es_reg: case ss_reg: case cs_reg: 14645 case ds_reg: case fs_reg: case gs_reg: 14646 s = names_seg[code - es_reg]; 14647 break; 14648 case al_reg: case ah_reg: case cl_reg: case ch_reg: 14649 case dl_reg: case dh_reg: case bl_reg: case bh_reg: 14650 USED_REX (0); 14651 if (rex) 14652 s = names8rex[code - al_reg]; 14653 else 14654 s = names8[code - al_reg]; 14655 break; 14656 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: 14657 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: 14658 USED_REX (REX_W); 14659 if (rex & REX_W) 14660 s = names64[code - eAX_reg]; 14661 else 14662 { 14663 if (sizeflag & DFLAG) 14664 s = names32[code - eAX_reg]; 14665 else 14666 s = names16[code - eAX_reg]; 14667 used_prefixes |= (prefixes & PREFIX_DATA); 14668 } 14669 break; 14670 case z_mode_ax_reg: 14671 if ((rex & REX_W) || (sizeflag & DFLAG)) 14672 s = *names32; 14673 else 14674 s = *names16; 14675 if (!(rex & REX_W)) 14676 used_prefixes |= (prefixes & PREFIX_DATA); 14677 break; 14678 default: 14679 s = INTERNAL_DISASSEMBLER_ERROR; 14680 break; 14681 } 14682 oappend (s); 14683 } 14684 14685 static void 14686 OP_I (int bytemode, int sizeflag) 14687 { 14688 bfd_signed_vma op; 14689 bfd_signed_vma mask = -1; 14690 14691 switch (bytemode) 14692 { 14693 case b_mode: 14694 FETCH_DATA (the_info, codep + 1); 14695 op = *codep++; 14696 mask = 0xff; 14697 break; 14698 case q_mode: 14699 if (address_mode == mode_64bit) 14700 { 14701 op = get32s (); 14702 break; 14703 } 14704 /* Fall through. */ 14705 case v_mode: 14706 USED_REX (REX_W); 14707 if (rex & REX_W) 14708 op = get32s (); 14709 else 14710 { 14711 if (sizeflag & DFLAG) 14712 { 14713 op = get32 (); 14714 mask = 0xffffffff; 14715 } 14716 else 14717 { 14718 op = get16 (); 14719 mask = 0xfffff; 14720 } 14721 used_prefixes |= (prefixes & PREFIX_DATA); 14722 } 14723 break; 14724 case w_mode: 14725 mask = 0xfffff; 14726 op = get16 (); 14727 break; 14728 case const_1_mode: 14729 if (intel_syntax) 14730 oappend ("1"); 14731 return; 14732 default: 14733 oappend (INTERNAL_DISASSEMBLER_ERROR); 14734 return; 14735 } 14736 14737 op &= mask; 14738 scratchbuf[0] = '$'; 14739 print_operand_value (scratchbuf + 1, 1, op); 14740 oappend_maybe_intel (scratchbuf); 14741 scratchbuf[0] = '\0'; 14742 } 14743 14744 static void 14745 OP_I64 (int bytemode, int sizeflag) 14746 { 14747 bfd_signed_vma op; 14748 bfd_signed_vma mask = -1; 14749 14750 if (address_mode != mode_64bit) 14751 { 14752 OP_I (bytemode, sizeflag); 14753 return; 14754 } 14755 14756 switch (bytemode) 14757 { 14758 case b_mode: 14759 FETCH_DATA (the_info, codep + 1); 14760 op = *codep++; 14761 mask = 0xff; 14762 break; 14763 case v_mode: 14764 USED_REX (REX_W); 14765 if (rex & REX_W) 14766 op = get64 (); 14767 else 14768 { 14769 if (sizeflag & DFLAG) 14770 { 14771 op = get32 (); 14772 mask = 0xffffffff; 14773 } 14774 else 14775 { 14776 op = get16 (); 14777 mask = 0xfffff; 14778 } 14779 used_prefixes |= (prefixes & PREFIX_DATA); 14780 } 14781 break; 14782 case w_mode: 14783 mask = 0xfffff; 14784 op = get16 (); 14785 break; 14786 default: 14787 oappend (INTERNAL_DISASSEMBLER_ERROR); 14788 return; 14789 } 14790 14791 op &= mask; 14792 scratchbuf[0] = '$'; 14793 print_operand_value (scratchbuf + 1, 1, op); 14794 oappend_maybe_intel (scratchbuf); 14795 scratchbuf[0] = '\0'; 14796 } 14797 14798 static void 14799 OP_sI (int bytemode, int sizeflag) 14800 { 14801 bfd_signed_vma op; 14802 14803 switch (bytemode) 14804 { 14805 case b_mode: 14806 case b_T_mode: 14807 FETCH_DATA (the_info, codep + 1); 14808 op = *codep++; 14809 if ((op & 0x80) != 0) 14810 op -= 0x100; 14811 if (bytemode == b_T_mode) 14812 { 14813 if (address_mode != mode_64bit 14814 || !((sizeflag & DFLAG) || (rex & REX_W))) 14815 { 14816 /* The operand-size prefix is overridden by a REX prefix. */ 14817 if ((sizeflag & DFLAG) || (rex & REX_W)) 14818 op &= 0xffffffff; 14819 else 14820 op &= 0xffff; 14821 } 14822 } 14823 else 14824 { 14825 if (!(rex & REX_W)) 14826 { 14827 if (sizeflag & DFLAG) 14828 op &= 0xffffffff; 14829 else 14830 op &= 0xffff; 14831 } 14832 } 14833 break; 14834 case v_mode: 14835 /* The operand-size prefix is overridden by a REX prefix. */ 14836 if ((sizeflag & DFLAG) || (rex & REX_W)) 14837 op = get32s (); 14838 else 14839 op = get16 (); 14840 break; 14841 default: 14842 oappend (INTERNAL_DISASSEMBLER_ERROR); 14843 return; 14844 } 14845 14846 scratchbuf[0] = '$'; 14847 print_operand_value (scratchbuf + 1, 1, op); 14848 oappend_maybe_intel (scratchbuf); 14849 } 14850 14851 static void 14852 OP_J (int bytemode, int sizeflag) 14853 { 14854 bfd_vma disp; 14855 bfd_vma mask = -1; 14856 bfd_vma segment = 0; 14857 14858 switch (bytemode) 14859 { 14860 case b_mode: 14861 FETCH_DATA (the_info, codep + 1); 14862 disp = *codep++; 14863 if ((disp & 0x80) != 0) 14864 disp -= 0x100; 14865 break; 14866 case v_mode: 14867 if (isa64 == amd64) 14868 USED_REX (REX_W); 14869 if ((sizeflag & DFLAG) 14870 || (address_mode == mode_64bit 14871 && (isa64 != amd64 || (rex & REX_W)))) 14872 disp = get32s (); 14873 else 14874 { 14875 disp = get16 (); 14876 if ((disp & 0x8000) != 0) 14877 disp -= 0x10000; 14878 /* In 16bit mode, address is wrapped around at 64k within 14879 the same segment. Otherwise, a data16 prefix on a jump 14880 instruction means that the pc is masked to 16 bits after 14881 the displacement is added! */ 14882 mask = 0xffff; 14883 if ((prefixes & PREFIX_DATA) == 0) 14884 segment = ((start_pc + (codep - start_codep)) 14885 & ~((bfd_vma) 0xffff)); 14886 } 14887 if (address_mode != mode_64bit 14888 || (isa64 == amd64 && !(rex & REX_W))) 14889 used_prefixes |= (prefixes & PREFIX_DATA); 14890 break; 14891 default: 14892 oappend (INTERNAL_DISASSEMBLER_ERROR); 14893 return; 14894 } 14895 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment; 14896 set_op (disp, 0); 14897 print_operand_value (scratchbuf, 1, disp); 14898 oappend (scratchbuf); 14899 } 14900 14901 static void 14902 OP_SEG (int bytemode, int sizeflag) 14903 { 14904 if (bytemode == w_mode) 14905 oappend (names_seg[modrm.reg]); 14906 else 14907 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag); 14908 } 14909 14910 static void 14911 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag) 14912 { 14913 int seg, offset; 14914 14915 if (sizeflag & DFLAG) 14916 { 14917 offset = get32 (); 14918 seg = get16 (); 14919 } 14920 else 14921 { 14922 offset = get16 (); 14923 seg = get16 (); 14924 } 14925 used_prefixes |= (prefixes & PREFIX_DATA); 14926 if (intel_syntax) 14927 sprintf (scratchbuf, "0x%x:0x%x", seg, offset); 14928 else 14929 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset); 14930 oappend (scratchbuf); 14931 } 14932 14933 static void 14934 OP_OFF (int bytemode, int sizeflag) 14935 { 14936 bfd_vma off; 14937 14938 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS)) 14939 intel_operand_size (bytemode, sizeflag); 14940 append_seg (); 14941 14942 if ((sizeflag & AFLAG) || address_mode == mode_64bit) 14943 off = get32 (); 14944 else 14945 off = get16 (); 14946 14947 if (intel_syntax) 14948 { 14949 if (!active_seg_prefix) 14950 { 14951 oappend (names_seg[ds_reg - es_reg]); 14952 oappend (":"); 14953 } 14954 } 14955 print_operand_value (scratchbuf, 1, off); 14956 oappend (scratchbuf); 14957 } 14958 14959 static void 14960 OP_OFF64 (int bytemode, int sizeflag) 14961 { 14962 bfd_vma off; 14963 14964 if (address_mode != mode_64bit 14965 || (prefixes & PREFIX_ADDR)) 14966 { 14967 OP_OFF (bytemode, sizeflag); 14968 return; 14969 } 14970 14971 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS)) 14972 intel_operand_size (bytemode, sizeflag); 14973 append_seg (); 14974 14975 off = get64 (); 14976 14977 if (intel_syntax) 14978 { 14979 if (!active_seg_prefix) 14980 { 14981 oappend (names_seg[ds_reg - es_reg]); 14982 oappend (":"); 14983 } 14984 } 14985 print_operand_value (scratchbuf, 1, off); 14986 oappend (scratchbuf); 14987 } 14988 14989 static void 14990 ptr_reg (int code, int sizeflag) 14991 { 14992 const char *s; 14993 14994 *obufp++ = open_char; 14995 used_prefixes |= (prefixes & PREFIX_ADDR); 14996 if (address_mode == mode_64bit) 14997 { 14998 if (!(sizeflag & AFLAG)) 14999 s = names32[code - eAX_reg]; 15000 else 15001 s = names64[code - eAX_reg]; 15002 } 15003 else if (sizeflag & AFLAG) 15004 s = names32[code - eAX_reg]; 15005 else 15006 s = names16[code - eAX_reg]; 15007 oappend (s); 15008 *obufp++ = close_char; 15009 *obufp = 0; 15010 } 15011 15012 static void 15013 OP_ESreg (int code, int sizeflag) 15014 { 15015 if (intel_syntax) 15016 { 15017 switch (codep[-1]) 15018 { 15019 case 0x6d: /* insw/insl */ 15020 intel_operand_size (z_mode, sizeflag); 15021 break; 15022 case 0xa5: /* movsw/movsl/movsq */ 15023 case 0xa7: /* cmpsw/cmpsl/cmpsq */ 15024 case 0xab: /* stosw/stosl */ 15025 case 0xaf: /* scasw/scasl */ 15026 intel_operand_size (v_mode, sizeflag); 15027 break; 15028 default: 15029 intel_operand_size (b_mode, sizeflag); 15030 } 15031 } 15032 oappend_maybe_intel ("%es:"); 15033 ptr_reg (code, sizeflag); 15034 } 15035 15036 static void 15037 OP_DSreg (int code, int sizeflag) 15038 { 15039 if (intel_syntax) 15040 { 15041 switch (codep[-1]) 15042 { 15043 case 0x6f: /* outsw/outsl */ 15044 intel_operand_size (z_mode, sizeflag); 15045 break; 15046 case 0xa5: /* movsw/movsl/movsq */ 15047 case 0xa7: /* cmpsw/cmpsl/cmpsq */ 15048 case 0xad: /* lodsw/lodsl/lodsq */ 15049 intel_operand_size (v_mode, sizeflag); 15050 break; 15051 default: 15052 intel_operand_size (b_mode, sizeflag); 15053 } 15054 } 15055 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the 15056 default segment register DS is printed. */ 15057 if (!active_seg_prefix) 15058 active_seg_prefix = PREFIX_DS; 15059 append_seg (); 15060 ptr_reg (code, sizeflag); 15061 } 15062 15063 static void 15064 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15065 { 15066 int add; 15067 if (rex & REX_R) 15068 { 15069 USED_REX (REX_R); 15070 add = 8; 15071 } 15072 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK)) 15073 { 15074 all_prefixes[last_lock_prefix] = 0; 15075 used_prefixes |= PREFIX_LOCK; 15076 add = 8; 15077 } 15078 else 15079 add = 0; 15080 sprintf (scratchbuf, "%%cr%d", modrm.reg + add); 15081 oappend_maybe_intel (scratchbuf); 15082 } 15083 15084 static void 15085 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15086 { 15087 int add; 15088 USED_REX (REX_R); 15089 if (rex & REX_R) 15090 add = 8; 15091 else 15092 add = 0; 15093 if (intel_syntax) 15094 sprintf (scratchbuf, "db%d", modrm.reg + add); 15095 else 15096 sprintf (scratchbuf, "%%db%d", modrm.reg + add); 15097 oappend (scratchbuf); 15098 } 15099 15100 static void 15101 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15102 { 15103 sprintf (scratchbuf, "%%tr%d", modrm.reg); 15104 oappend_maybe_intel (scratchbuf); 15105 } 15106 15107 static void 15108 OP_R (int bytemode, int sizeflag) 15109 { 15110 /* Skip mod/rm byte. */ 15111 MODRM_CHECK; 15112 codep++; 15113 OP_E_register (bytemode, sizeflag); 15114 } 15115 15116 static void 15117 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15118 { 15119 int reg = modrm.reg; 15120 const char **names; 15121 15122 used_prefixes |= (prefixes & PREFIX_DATA); 15123 if (prefixes & PREFIX_DATA) 15124 { 15125 names = names_xmm; 15126 USED_REX (REX_R); 15127 if (rex & REX_R) 15128 reg += 8; 15129 } 15130 else 15131 names = names_mm; 15132 oappend (names[reg]); 15133 } 15134 15135 static void 15136 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED) 15137 { 15138 int reg = modrm.reg; 15139 const char **names; 15140 15141 USED_REX (REX_R); 15142 if (rex & REX_R) 15143 reg += 8; 15144 if (vex.evex) 15145 { 15146 if (!vex.r) 15147 reg += 16; 15148 } 15149 15150 if (need_vex 15151 && bytemode != xmm_mode 15152 && bytemode != xmmq_mode 15153 && bytemode != evex_half_bcst_xmmq_mode 15154 && bytemode != ymm_mode 15155 && bytemode != scalar_mode) 15156 { 15157 switch (vex.length) 15158 { 15159 case 128: 15160 names = names_xmm; 15161 break; 15162 case 256: 15163 if (vex.w 15164 || (bytemode != vex_vsib_q_w_dq_mode 15165 && bytemode != vex_vsib_q_w_d_mode)) 15166 names = names_ymm; 15167 else 15168 names = names_xmm; 15169 break; 15170 case 512: 15171 names = names_zmm; 15172 break; 15173 default: 15174 abort (); 15175 } 15176 } 15177 else if (bytemode == xmmq_mode 15178 || bytemode == evex_half_bcst_xmmq_mode) 15179 { 15180 switch (vex.length) 15181 { 15182 case 128: 15183 case 256: 15184 names = names_xmm; 15185 break; 15186 case 512: 15187 names = names_ymm; 15188 break; 15189 default: 15190 abort (); 15191 } 15192 } 15193 else if (bytemode == ymm_mode) 15194 names = names_ymm; 15195 else 15196 names = names_xmm; 15197 oappend (names[reg]); 15198 } 15199 15200 static void 15201 OP_EM (int bytemode, int sizeflag) 15202 { 15203 int reg; 15204 const char **names; 15205 15206 if (modrm.mod != 3) 15207 { 15208 if (intel_syntax 15209 && (bytemode == v_mode || bytemode == v_swap_mode)) 15210 { 15211 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode; 15212 used_prefixes |= (prefixes & PREFIX_DATA); 15213 } 15214 OP_E (bytemode, sizeflag); 15215 return; 15216 } 15217 15218 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode) 15219 swap_operand (); 15220 15221 /* Skip mod/rm byte. */ 15222 MODRM_CHECK; 15223 codep++; 15224 used_prefixes |= (prefixes & PREFIX_DATA); 15225 reg = modrm.rm; 15226 if (prefixes & PREFIX_DATA) 15227 { 15228 names = names_xmm; 15229 USED_REX (REX_B); 15230 if (rex & REX_B) 15231 reg += 8; 15232 } 15233 else 15234 names = names_mm; 15235 oappend (names[reg]); 15236 } 15237 15238 /* cvt* are the only instructions in sse2 which have 15239 both SSE and MMX operands and also have 0x66 prefix 15240 in their opcode. 0x66 was originally used to differentiate 15241 between SSE and MMX instruction(operands). So we have to handle the 15242 cvt* separately using OP_EMC and OP_MXC */ 15243 static void 15244 OP_EMC (int bytemode, int sizeflag) 15245 { 15246 if (modrm.mod != 3) 15247 { 15248 if (intel_syntax && bytemode == v_mode) 15249 { 15250 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode; 15251 used_prefixes |= (prefixes & PREFIX_DATA); 15252 } 15253 OP_E (bytemode, sizeflag); 15254 return; 15255 } 15256 15257 /* Skip mod/rm byte. */ 15258 MODRM_CHECK; 15259 codep++; 15260 used_prefixes |= (prefixes & PREFIX_DATA); 15261 oappend (names_mm[modrm.rm]); 15262 } 15263 15264 static void 15265 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15266 { 15267 used_prefixes |= (prefixes & PREFIX_DATA); 15268 oappend (names_mm[modrm.reg]); 15269 } 15270 15271 static void 15272 OP_EX (int bytemode, int sizeflag) 15273 { 15274 int reg; 15275 const char **names; 15276 15277 /* Skip mod/rm byte. */ 15278 MODRM_CHECK; 15279 codep++; 15280 15281 if (modrm.mod != 3) 15282 { 15283 OP_E_memory (bytemode, sizeflag); 15284 return; 15285 } 15286 15287 reg = modrm.rm; 15288 USED_REX (REX_B); 15289 if (rex & REX_B) 15290 reg += 8; 15291 if (vex.evex) 15292 { 15293 USED_REX (REX_X); 15294 if ((rex & REX_X)) 15295 reg += 16; 15296 } 15297 15298 if ((sizeflag & SUFFIX_ALWAYS) 15299 && (bytemode == x_swap_mode 15300 || bytemode == d_swap_mode 15301 || bytemode == d_scalar_swap_mode 15302 || bytemode == q_swap_mode 15303 || bytemode == q_scalar_swap_mode)) 15304 swap_operand (); 15305 15306 if (need_vex 15307 && bytemode != xmm_mode 15308 && bytemode != xmmdw_mode 15309 && bytemode != xmmqd_mode 15310 && bytemode != xmm_mb_mode 15311 && bytemode != xmm_mw_mode 15312 && bytemode != xmm_md_mode 15313 && bytemode != xmm_mq_mode 15314 && bytemode != xmm_mdq_mode 15315 && bytemode != xmmq_mode 15316 && bytemode != evex_half_bcst_xmmq_mode 15317 && bytemode != ymm_mode 15318 && bytemode != d_scalar_mode 15319 && bytemode != d_scalar_swap_mode 15320 && bytemode != q_scalar_mode 15321 && bytemode != q_scalar_swap_mode 15322 && bytemode != vex_scalar_w_dq_mode) 15323 { 15324 switch (vex.length) 15325 { 15326 case 128: 15327 names = names_xmm; 15328 break; 15329 case 256: 15330 names = names_ymm; 15331 break; 15332 case 512: 15333 names = names_zmm; 15334 break; 15335 default: 15336 abort (); 15337 } 15338 } 15339 else if (bytemode == xmmq_mode 15340 || bytemode == evex_half_bcst_xmmq_mode) 15341 { 15342 switch (vex.length) 15343 { 15344 case 128: 15345 case 256: 15346 names = names_xmm; 15347 break; 15348 case 512: 15349 names = names_ymm; 15350 break; 15351 default: 15352 abort (); 15353 } 15354 } 15355 else if (bytemode == ymm_mode) 15356 names = names_ymm; 15357 else 15358 names = names_xmm; 15359 oappend (names[reg]); 15360 } 15361 15362 static void 15363 OP_MS (int bytemode, int sizeflag) 15364 { 15365 if (modrm.mod == 3) 15366 OP_EM (bytemode, sizeflag); 15367 else 15368 BadOp (); 15369 } 15370 15371 static void 15372 OP_XS (int bytemode, int sizeflag) 15373 { 15374 if (modrm.mod == 3) 15375 OP_EX (bytemode, sizeflag); 15376 else 15377 BadOp (); 15378 } 15379 15380 static void 15381 OP_M (int bytemode, int sizeflag) 15382 { 15383 if (modrm.mod == 3) 15384 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */ 15385 BadOp (); 15386 else 15387 OP_E (bytemode, sizeflag); 15388 } 15389 15390 static void 15391 OP_0f07 (int bytemode, int sizeflag) 15392 { 15393 if (modrm.mod != 3 || modrm.rm != 0) 15394 BadOp (); 15395 else 15396 OP_E (bytemode, sizeflag); 15397 } 15398 15399 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in 15400 32bit mode and "xchg %rax,%rax" in 64bit mode. */ 15401 15402 static void 15403 NOP_Fixup1 (int bytemode, int sizeflag) 15404 { 15405 if ((prefixes & PREFIX_DATA) != 0 15406 || (rex != 0 15407 && rex != 0x48 15408 && address_mode == mode_64bit)) 15409 OP_REG (bytemode, sizeflag); 15410 else 15411 strcpy (obuf, "nop"); 15412 } 15413 15414 static void 15415 NOP_Fixup2 (int bytemode, int sizeflag) 15416 { 15417 if ((prefixes & PREFIX_DATA) != 0 15418 || (rex != 0 15419 && rex != 0x48 15420 && address_mode == mode_64bit)) 15421 OP_IMREG (bytemode, sizeflag); 15422 } 15423 15424 static const char *const Suffix3DNow[] = { 15425 /* 00 */ NULL, NULL, NULL, NULL, 15426 /* 04 */ NULL, NULL, NULL, NULL, 15427 /* 08 */ NULL, NULL, NULL, NULL, 15428 /* 0C */ "pi2fw", "pi2fd", NULL, NULL, 15429 /* 10 */ NULL, NULL, NULL, NULL, 15430 /* 14 */ NULL, NULL, NULL, NULL, 15431 /* 18 */ NULL, NULL, NULL, NULL, 15432 /* 1C */ "pf2iw", "pf2id", NULL, NULL, 15433 /* 20 */ NULL, NULL, NULL, NULL, 15434 /* 24 */ NULL, NULL, NULL, NULL, 15435 /* 28 */ NULL, NULL, NULL, NULL, 15436 /* 2C */ NULL, NULL, NULL, NULL, 15437 /* 30 */ NULL, NULL, NULL, NULL, 15438 /* 34 */ NULL, NULL, NULL, NULL, 15439 /* 38 */ NULL, NULL, NULL, NULL, 15440 /* 3C */ NULL, NULL, NULL, NULL, 15441 /* 40 */ NULL, NULL, NULL, NULL, 15442 /* 44 */ NULL, NULL, NULL, NULL, 15443 /* 48 */ NULL, NULL, NULL, NULL, 15444 /* 4C */ NULL, NULL, NULL, NULL, 15445 /* 50 */ NULL, NULL, NULL, NULL, 15446 /* 54 */ NULL, NULL, NULL, NULL, 15447 /* 58 */ NULL, NULL, NULL, NULL, 15448 /* 5C */ NULL, NULL, NULL, NULL, 15449 /* 60 */ NULL, NULL, NULL, NULL, 15450 /* 64 */ NULL, NULL, NULL, NULL, 15451 /* 68 */ NULL, NULL, NULL, NULL, 15452 /* 6C */ NULL, NULL, NULL, NULL, 15453 /* 70 */ NULL, NULL, NULL, NULL, 15454 /* 74 */ NULL, NULL, NULL, NULL, 15455 /* 78 */ NULL, NULL, NULL, NULL, 15456 /* 7C */ NULL, NULL, NULL, NULL, 15457 /* 80 */ NULL, NULL, NULL, NULL, 15458 /* 84 */ NULL, NULL, NULL, NULL, 15459 /* 88 */ NULL, NULL, "pfnacc", NULL, 15460 /* 8C */ NULL, NULL, "pfpnacc", NULL, 15461 /* 90 */ "pfcmpge", NULL, NULL, NULL, 15462 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt", 15463 /* 98 */ NULL, NULL, "pfsub", NULL, 15464 /* 9C */ NULL, NULL, "pfadd", NULL, 15465 /* A0 */ "pfcmpgt", NULL, NULL, NULL, 15466 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1", 15467 /* A8 */ NULL, NULL, "pfsubr", NULL, 15468 /* AC */ NULL, NULL, "pfacc", NULL, 15469 /* B0 */ "pfcmpeq", NULL, NULL, NULL, 15470 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw", 15471 /* B8 */ NULL, NULL, NULL, "pswapd", 15472 /* BC */ NULL, NULL, NULL, "pavgusb", 15473 /* C0 */ NULL, NULL, NULL, NULL, 15474 /* C4 */ NULL, NULL, NULL, NULL, 15475 /* C8 */ NULL, NULL, NULL, NULL, 15476 /* CC */ NULL, NULL, NULL, NULL, 15477 /* D0 */ NULL, NULL, NULL, NULL, 15478 /* D4 */ NULL, NULL, NULL, NULL, 15479 /* D8 */ NULL, NULL, NULL, NULL, 15480 /* DC */ NULL, NULL, NULL, NULL, 15481 /* E0 */ NULL, NULL, NULL, NULL, 15482 /* E4 */ NULL, NULL, NULL, NULL, 15483 /* E8 */ NULL, NULL, NULL, NULL, 15484 /* EC */ NULL, NULL, NULL, NULL, 15485 /* F0 */ NULL, NULL, NULL, NULL, 15486 /* F4 */ NULL, NULL, NULL, NULL, 15487 /* F8 */ NULL, NULL, NULL, NULL, 15488 /* FC */ NULL, NULL, NULL, NULL, 15489 }; 15490 15491 static void 15492 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15493 { 15494 const char *mnemonic; 15495 15496 FETCH_DATA (the_info, codep + 1); 15497 /* AMD 3DNow! instructions are specified by an opcode suffix in the 15498 place where an 8-bit immediate would normally go. ie. the last 15499 byte of the instruction. */ 15500 obufp = mnemonicendp; 15501 mnemonic = Suffix3DNow[*codep++ & 0xff]; 15502 if (mnemonic) 15503 oappend (mnemonic); 15504 else 15505 { 15506 /* Since a variable sized modrm/sib chunk is between the start 15507 of the opcode (0x0f0f) and the opcode suffix, we need to do 15508 all the modrm processing first, and don't know until now that 15509 we have a bad opcode. This necessitates some cleaning up. */ 15510 op_out[0][0] = '\0'; 15511 op_out[1][0] = '\0'; 15512 BadOp (); 15513 } 15514 mnemonicendp = obufp; 15515 } 15516 15517 static struct op simd_cmp_op[] = 15518 { 15519 { STRING_COMMA_LEN ("eq") }, 15520 { STRING_COMMA_LEN ("lt") }, 15521 { STRING_COMMA_LEN ("le") }, 15522 { STRING_COMMA_LEN ("unord") }, 15523 { STRING_COMMA_LEN ("neq") }, 15524 { STRING_COMMA_LEN ("nlt") }, 15525 { STRING_COMMA_LEN ("nle") }, 15526 { STRING_COMMA_LEN ("ord") } 15527 }; 15528 15529 static void 15530 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15531 { 15532 unsigned int cmp_type; 15533 15534 FETCH_DATA (the_info, codep + 1); 15535 cmp_type = *codep++ & 0xff; 15536 if (cmp_type < ARRAY_SIZE (simd_cmp_op)) 15537 { 15538 char suffix [3]; 15539 char *p = mnemonicendp - 2; 15540 suffix[0] = p[0]; 15541 suffix[1] = p[1]; 15542 suffix[2] = '\0'; 15543 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix); 15544 mnemonicendp += simd_cmp_op[cmp_type].len; 15545 } 15546 else 15547 { 15548 /* We have a reserved extension byte. Output it directly. */ 15549 scratchbuf[0] = '$'; 15550 print_operand_value (scratchbuf + 1, 1, cmp_type); 15551 oappend_maybe_intel (scratchbuf); 15552 scratchbuf[0] = '\0'; 15553 } 15554 } 15555 15556 static void 15557 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED, 15558 int sizeflag ATTRIBUTE_UNUSED) 15559 { 15560 /* mwaitx %eax,%ecx,%ebx */ 15561 if (!intel_syntax) 15562 { 15563 const char **names = (address_mode == mode_64bit 15564 ? names64 : names32); 15565 strcpy (op_out[0], names[0]); 15566 strcpy (op_out[1], names[1]); 15567 strcpy (op_out[2], names[3]); 15568 two_source_ops = 1; 15569 } 15570 /* Skip mod/rm byte. */ 15571 MODRM_CHECK; 15572 codep++; 15573 } 15574 15575 static void 15576 OP_Mwait (int bytemode ATTRIBUTE_UNUSED, 15577 int sizeflag ATTRIBUTE_UNUSED) 15578 { 15579 /* mwait %eax,%ecx */ 15580 if (!intel_syntax) 15581 { 15582 const char **names = (address_mode == mode_64bit 15583 ? names64 : names32); 15584 strcpy (op_out[0], names[0]); 15585 strcpy (op_out[1], names[1]); 15586 two_source_ops = 1; 15587 } 15588 /* Skip mod/rm byte. */ 15589 MODRM_CHECK; 15590 codep++; 15591 } 15592 15593 static void 15594 OP_Monitor (int bytemode ATTRIBUTE_UNUSED, 15595 int sizeflag ATTRIBUTE_UNUSED) 15596 { 15597 /* monitor %eax,%ecx,%edx" */ 15598 if (!intel_syntax) 15599 { 15600 const char **op1_names; 15601 const char **names = (address_mode == mode_64bit 15602 ? names64 : names32); 15603 15604 if (!(prefixes & PREFIX_ADDR)) 15605 op1_names = (address_mode == mode_16bit 15606 ? names16 : names); 15607 else 15608 { 15609 /* Remove "addr16/addr32". */ 15610 all_prefixes[last_addr_prefix] = 0; 15611 op1_names = (address_mode != mode_32bit 15612 ? names32 : names16); 15613 used_prefixes |= PREFIX_ADDR; 15614 } 15615 strcpy (op_out[0], op1_names[0]); 15616 strcpy (op_out[1], names[1]); 15617 strcpy (op_out[2], names[2]); 15618 two_source_ops = 1; 15619 } 15620 /* Skip mod/rm byte. */ 15621 MODRM_CHECK; 15622 codep++; 15623 } 15624 15625 static void 15626 BadOp (void) 15627 { 15628 /* Throw away prefixes and 1st. opcode byte. */ 15629 codep = insn_codep + 1; 15630 oappend ("(bad)"); 15631 } 15632 15633 static void 15634 REP_Fixup (int bytemode, int sizeflag) 15635 { 15636 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs, 15637 lods and stos. */ 15638 if (prefixes & PREFIX_REPZ) 15639 all_prefixes[last_repz_prefix] = REP_PREFIX; 15640 15641 switch (bytemode) 15642 { 15643 case al_reg: 15644 case eAX_reg: 15645 case indir_dx_reg: 15646 OP_IMREG (bytemode, sizeflag); 15647 break; 15648 case eDI_reg: 15649 OP_ESreg (bytemode, sizeflag); 15650 break; 15651 case eSI_reg: 15652 OP_DSreg (bytemode, sizeflag); 15653 break; 15654 default: 15655 abort (); 15656 break; 15657 } 15658 } 15659 15660 /* For BND-prefixed instructions 0xF2 prefix should be displayed as 15661 "bnd". */ 15662 15663 static void 15664 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 15665 { 15666 if (prefixes & PREFIX_REPNZ) 15667 all_prefixes[last_repnz_prefix] = BND_PREFIX; 15668 } 15669 15670 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as 15671 "notrack". */ 15672 15673 static void 15674 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED, 15675 int sizeflag ATTRIBUTE_UNUSED) 15676 { 15677 if (active_seg_prefix == PREFIX_DS 15678 && (address_mode != mode_64bit || last_data_prefix < 0)) 15679 { 15680 /* NOTRACK prefix is only valid on indirect branch instructions. 15681 NB: DATA prefix is unsupported for Intel64. */ 15682 active_seg_prefix = 0; 15683 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX; 15684 } 15685 } 15686 15687 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as 15688 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix. 15689 */ 15690 15691 static void 15692 HLE_Fixup1 (int bytemode, int sizeflag) 15693 { 15694 if (modrm.mod != 3 15695 && (prefixes & PREFIX_LOCK) != 0) 15696 { 15697 if (prefixes & PREFIX_REPZ) 15698 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX; 15699 if (prefixes & PREFIX_REPNZ) 15700 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX; 15701 } 15702 15703 OP_E (bytemode, sizeflag); 15704 } 15705 15706 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as 15707 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix. 15708 */ 15709 15710 static void 15711 HLE_Fixup2 (int bytemode, int sizeflag) 15712 { 15713 if (modrm.mod != 3) 15714 { 15715 if (prefixes & PREFIX_REPZ) 15716 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX; 15717 if (prefixes & PREFIX_REPNZ) 15718 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX; 15719 } 15720 15721 OP_E (bytemode, sizeflag); 15722 } 15723 15724 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as 15725 "xrelease" for memory operand. No check for LOCK prefix. */ 15726 15727 static void 15728 HLE_Fixup3 (int bytemode, int sizeflag) 15729 { 15730 if (modrm.mod != 3 15731 && last_repz_prefix > last_repnz_prefix 15732 && (prefixes & PREFIX_REPZ) != 0) 15733 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX; 15734 15735 OP_E (bytemode, sizeflag); 15736 } 15737 15738 static void 15739 CMPXCHG8B_Fixup (int bytemode, int sizeflag) 15740 { 15741 USED_REX (REX_W); 15742 if (rex & REX_W) 15743 { 15744 /* Change cmpxchg8b to cmpxchg16b. */ 15745 char *p = mnemonicendp - 2; 15746 mnemonicendp = stpcpy (p, "16b"); 15747 bytemode = o_mode; 15748 } 15749 else if ((prefixes & PREFIX_LOCK) != 0) 15750 { 15751 if (prefixes & PREFIX_REPZ) 15752 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX; 15753 if (prefixes & PREFIX_REPNZ) 15754 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX; 15755 } 15756 15757 OP_M (bytemode, sizeflag); 15758 } 15759 15760 static void 15761 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED) 15762 { 15763 const char **names; 15764 15765 if (need_vex) 15766 { 15767 switch (vex.length) 15768 { 15769 case 128: 15770 names = names_xmm; 15771 break; 15772 case 256: 15773 names = names_ymm; 15774 break; 15775 default: 15776 abort (); 15777 } 15778 } 15779 else 15780 names = names_xmm; 15781 oappend (names[reg]); 15782 } 15783 15784 static void 15785 CRC32_Fixup (int bytemode, int sizeflag) 15786 { 15787 /* Add proper suffix to "crc32". */ 15788 char *p = mnemonicendp; 15789 15790 switch (bytemode) 15791 { 15792 case b_mode: 15793 if (intel_syntax) 15794 goto skip; 15795 15796 *p++ = 'b'; 15797 break; 15798 case v_mode: 15799 if (intel_syntax) 15800 goto skip; 15801 15802 USED_REX (REX_W); 15803 if (rex & REX_W) 15804 *p++ = 'q'; 15805 else 15806 { 15807 if (sizeflag & DFLAG) 15808 *p++ = 'l'; 15809 else 15810 *p++ = 'w'; 15811 used_prefixes |= (prefixes & PREFIX_DATA); 15812 } 15813 break; 15814 default: 15815 oappend (INTERNAL_DISASSEMBLER_ERROR); 15816 break; 15817 } 15818 mnemonicendp = p; 15819 *p = '\0'; 15820 15821 skip: 15822 if (modrm.mod == 3) 15823 { 15824 int add; 15825 15826 /* Skip mod/rm byte. */ 15827 MODRM_CHECK; 15828 codep++; 15829 15830 USED_REX (REX_B); 15831 add = (rex & REX_B) ? 8 : 0; 15832 if (bytemode == b_mode) 15833 { 15834 USED_REX (0); 15835 if (rex) 15836 oappend (names8rex[modrm.rm + add]); 15837 else 15838 oappend (names8[modrm.rm + add]); 15839 } 15840 else 15841 { 15842 USED_REX (REX_W); 15843 if (rex & REX_W) 15844 oappend (names64[modrm.rm + add]); 15845 else if ((prefixes & PREFIX_DATA)) 15846 oappend (names16[modrm.rm + add]); 15847 else 15848 oappend (names32[modrm.rm + add]); 15849 } 15850 } 15851 else 15852 OP_E (bytemode, sizeflag); 15853 } 15854 15855 static void 15856 FXSAVE_Fixup (int bytemode, int sizeflag) 15857 { 15858 /* Add proper suffix to "fxsave" and "fxrstor". */ 15859 USED_REX (REX_W); 15860 if (rex & REX_W) 15861 { 15862 char *p = mnemonicendp; 15863 *p++ = '6'; 15864 *p++ = '4'; 15865 *p = '\0'; 15866 mnemonicendp = p; 15867 } 15868 OP_M (bytemode, sizeflag); 15869 } 15870 15871 static void 15872 PCMPESTR_Fixup (int bytemode, int sizeflag) 15873 { 15874 /* Add proper suffix to "{,v}pcmpestr{i,m}". */ 15875 if (!intel_syntax) 15876 { 15877 char *p = mnemonicendp; 15878 15879 USED_REX (REX_W); 15880 if (rex & REX_W) 15881 *p++ = 'q'; 15882 else if (sizeflag & SUFFIX_ALWAYS) 15883 *p++ = 'l'; 15884 15885 *p = '\0'; 15886 mnemonicendp = p; 15887 } 15888 15889 OP_EX (bytemode, sizeflag); 15890 } 15891 15892 /* Display the destination register operand for instructions with 15893 VEX. */ 15894 15895 static void 15896 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED) 15897 { 15898 int reg; 15899 const char **names; 15900 15901 if (!need_vex) 15902 abort (); 15903 15904 if (!need_vex_reg) 15905 return; 15906 15907 reg = vex.register_specifier; 15908 if (address_mode != mode_64bit) 15909 reg &= 7; 15910 else if (vex.evex && !vex.v) 15911 reg += 16; 15912 15913 if (bytemode == vex_scalar_mode) 15914 { 15915 oappend (names_xmm[reg]); 15916 return; 15917 } 15918 15919 switch (vex.length) 15920 { 15921 case 128: 15922 switch (bytemode) 15923 { 15924 case vex_mode: 15925 case vex128_mode: 15926 case vex_vsib_q_w_dq_mode: 15927 case vex_vsib_q_w_d_mode: 15928 names = names_xmm; 15929 break; 15930 case dq_mode: 15931 if (rex & REX_W) 15932 names = names64; 15933 else 15934 names = names32; 15935 break; 15936 case mask_bd_mode: 15937 case mask_mode: 15938 if (reg > 0x7) 15939 { 15940 oappend ("(bad)"); 15941 return; 15942 } 15943 names = names_mask; 15944 break; 15945 default: 15946 abort (); 15947 return; 15948 } 15949 break; 15950 case 256: 15951 switch (bytemode) 15952 { 15953 case vex_mode: 15954 case vex256_mode: 15955 names = names_ymm; 15956 break; 15957 case vex_vsib_q_w_dq_mode: 15958 case vex_vsib_q_w_d_mode: 15959 names = vex.w ? names_ymm : names_xmm; 15960 break; 15961 case mask_bd_mode: 15962 case mask_mode: 15963 if (reg > 0x7) 15964 { 15965 oappend ("(bad)"); 15966 return; 15967 } 15968 names = names_mask; 15969 break; 15970 default: 15971 /* See PR binutils/20893 for a reproducer. */ 15972 oappend ("(bad)"); 15973 return; 15974 } 15975 break; 15976 case 512: 15977 names = names_zmm; 15978 break; 15979 default: 15980 abort (); 15981 break; 15982 } 15983 oappend (names[reg]); 15984 } 15985 15986 /* Get the VEX immediate byte without moving codep. */ 15987 15988 static unsigned char 15989 get_vex_imm8 (int sizeflag, int opnum) 15990 { 15991 int bytes_before_imm = 0; 15992 15993 if (modrm.mod != 3) 15994 { 15995 /* There are SIB/displacement bytes. */ 15996 if ((sizeflag & AFLAG) || address_mode == mode_64bit) 15997 { 15998 /* 32/64 bit address mode */ 15999 int base = modrm.rm; 16000 16001 /* Check SIB byte. */ 16002 if (base == 4) 16003 { 16004 FETCH_DATA (the_info, codep + 1); 16005 base = *codep & 7; 16006 /* When decoding the third source, don't increase 16007 bytes_before_imm as this has already been incremented 16008 by one in OP_E_memory while decoding the second 16009 source operand. */ 16010 if (opnum == 0) 16011 bytes_before_imm++; 16012 } 16013 16014 /* Don't increase bytes_before_imm when decoding the third source, 16015 it has already been incremented by OP_E_memory while decoding 16016 the second source operand. */ 16017 if (opnum == 0) 16018 { 16019 switch (modrm.mod) 16020 { 16021 case 0: 16022 /* When modrm.rm == 5 or modrm.rm == 4 and base in 16023 SIB == 5, there is a 4 byte displacement. */ 16024 if (base != 5) 16025 /* No displacement. */ 16026 break; 16027 /* Fall through. */ 16028 case 2: 16029 /* 4 byte displacement. */ 16030 bytes_before_imm += 4; 16031 break; 16032 case 1: 16033 /* 1 byte displacement. */ 16034 bytes_before_imm++; 16035 break; 16036 } 16037 } 16038 } 16039 else 16040 { 16041 /* 16 bit address mode */ 16042 /* Don't increase bytes_before_imm when decoding the third source, 16043 it has already been incremented by OP_E_memory while decoding 16044 the second source operand. */ 16045 if (opnum == 0) 16046 { 16047 switch (modrm.mod) 16048 { 16049 case 0: 16050 /* When modrm.rm == 6, there is a 2 byte displacement. */ 16051 if (modrm.rm != 6) 16052 /* No displacement. */ 16053 break; 16054 /* Fall through. */ 16055 case 2: 16056 /* 2 byte displacement. */ 16057 bytes_before_imm += 2; 16058 break; 16059 case 1: 16060 /* 1 byte displacement: when decoding the third source, 16061 don't increase bytes_before_imm as this has already 16062 been incremented by one in OP_E_memory while decoding 16063 the second source operand. */ 16064 if (opnum == 0) 16065 bytes_before_imm++; 16066 16067 break; 16068 } 16069 } 16070 } 16071 } 16072 16073 FETCH_DATA (the_info, codep + bytes_before_imm + 1); 16074 return codep [bytes_before_imm]; 16075 } 16076 16077 static void 16078 OP_EX_VexReg (int bytemode, int sizeflag, int reg) 16079 { 16080 const char **names; 16081 16082 if (reg == -1 && modrm.mod != 3) 16083 { 16084 OP_E_memory (bytemode, sizeflag); 16085 return; 16086 } 16087 else 16088 { 16089 if (reg == -1) 16090 { 16091 reg = modrm.rm; 16092 USED_REX (REX_B); 16093 if (rex & REX_B) 16094 reg += 8; 16095 } 16096 if (address_mode != mode_64bit) 16097 reg &= 7; 16098 } 16099 16100 switch (vex.length) 16101 { 16102 case 128: 16103 names = names_xmm; 16104 break; 16105 case 256: 16106 names = names_ymm; 16107 break; 16108 default: 16109 abort (); 16110 } 16111 oappend (names[reg]); 16112 } 16113 16114 static void 16115 OP_EX_VexImmW (int bytemode, int sizeflag) 16116 { 16117 int reg = -1; 16118 static unsigned char vex_imm8; 16119 16120 if (vex_w_done == 0) 16121 { 16122 vex_w_done = 1; 16123 16124 /* Skip mod/rm byte. */ 16125 MODRM_CHECK; 16126 codep++; 16127 16128 vex_imm8 = get_vex_imm8 (sizeflag, 0); 16129 16130 if (vex.w) 16131 reg = vex_imm8 >> 4; 16132 16133 OP_EX_VexReg (bytemode, sizeflag, reg); 16134 } 16135 else if (vex_w_done == 1) 16136 { 16137 vex_w_done = 2; 16138 16139 if (!vex.w) 16140 reg = vex_imm8 >> 4; 16141 16142 OP_EX_VexReg (bytemode, sizeflag, reg); 16143 } 16144 else 16145 { 16146 /* Output the imm8 directly. */ 16147 scratchbuf[0] = '$'; 16148 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf); 16149 oappend_maybe_intel (scratchbuf); 16150 scratchbuf[0] = '\0'; 16151 codep++; 16152 } 16153 } 16154 16155 static void 16156 OP_Vex_2src (int bytemode, int sizeflag) 16157 { 16158 if (modrm.mod == 3) 16159 { 16160 int reg = modrm.rm; 16161 USED_REX (REX_B); 16162 if (rex & REX_B) 16163 reg += 8; 16164 oappend (names_xmm[reg]); 16165 } 16166 else 16167 { 16168 if (intel_syntax 16169 && (bytemode == v_mode || bytemode == v_swap_mode)) 16170 { 16171 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode; 16172 used_prefixes |= (prefixes & PREFIX_DATA); 16173 } 16174 OP_E (bytemode, sizeflag); 16175 } 16176 } 16177 16178 static void 16179 OP_Vex_2src_1 (int bytemode, int sizeflag) 16180 { 16181 if (modrm.mod == 3) 16182 { 16183 /* Skip mod/rm byte. */ 16184 MODRM_CHECK; 16185 codep++; 16186 } 16187 16188 if (vex.w) 16189 { 16190 unsigned int reg = vex.register_specifier; 16191 16192 if (address_mode != mode_64bit) 16193 reg &= 7; 16194 oappend (names_xmm[reg]); 16195 } 16196 else 16197 OP_Vex_2src (bytemode, sizeflag); 16198 } 16199 16200 static void 16201 OP_Vex_2src_2 (int bytemode, int sizeflag) 16202 { 16203 if (vex.w) 16204 OP_Vex_2src (bytemode, sizeflag); 16205 else 16206 { 16207 unsigned int reg = vex.register_specifier; 16208 16209 if (address_mode != mode_64bit) 16210 reg &= 7; 16211 oappend (names_xmm[reg]); 16212 } 16213 } 16214 16215 static void 16216 OP_EX_VexW (int bytemode, int sizeflag) 16217 { 16218 int reg = -1; 16219 16220 if (!vex_w_done) 16221 { 16222 /* Skip mod/rm byte. */ 16223 MODRM_CHECK; 16224 codep++; 16225 16226 if (vex.w) 16227 reg = get_vex_imm8 (sizeflag, 0) >> 4; 16228 } 16229 else 16230 { 16231 if (!vex.w) 16232 reg = get_vex_imm8 (sizeflag, 1) >> 4; 16233 } 16234 16235 OP_EX_VexReg (bytemode, sizeflag, reg); 16236 16237 if (vex_w_done) 16238 codep++; 16239 vex_w_done = 1; 16240 } 16241 16242 static void 16243 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED) 16244 { 16245 int reg; 16246 const char **names; 16247 16248 FETCH_DATA (the_info, codep + 1); 16249 reg = *codep++; 16250 16251 if (bytemode != x_mode) 16252 abort (); 16253 16254 reg >>= 4; 16255 if (address_mode != mode_64bit) 16256 reg &= 7; 16257 16258 switch (vex.length) 16259 { 16260 case 128: 16261 names = names_xmm; 16262 break; 16263 case 256: 16264 names = names_ymm; 16265 break; 16266 default: 16267 abort (); 16268 } 16269 oappend (names[reg]); 16270 } 16271 16272 static void 16273 OP_XMM_VexW (int bytemode, int sizeflag) 16274 { 16275 /* Turn off the REX.W bit since it is used for swapping operands 16276 now. */ 16277 rex &= ~REX_W; 16278 OP_XMM (bytemode, sizeflag); 16279 } 16280 16281 static void 16282 OP_EX_Vex (int bytemode, int sizeflag) 16283 { 16284 if (modrm.mod != 3) 16285 { 16286 if (vex.register_specifier != 0) 16287 BadOp (); 16288 need_vex_reg = 0; 16289 } 16290 OP_EX (bytemode, sizeflag); 16291 } 16292 16293 static void 16294 OP_XMM_Vex (int bytemode, int sizeflag) 16295 { 16296 if (modrm.mod != 3) 16297 { 16298 if (vex.register_specifier != 0) 16299 BadOp (); 16300 need_vex_reg = 0; 16301 } 16302 OP_XMM (bytemode, sizeflag); 16303 } 16304 16305 static struct op vex_cmp_op[] = 16306 { 16307 { STRING_COMMA_LEN ("eq") }, 16308 { STRING_COMMA_LEN ("lt") }, 16309 { STRING_COMMA_LEN ("le") }, 16310 { STRING_COMMA_LEN ("unord") }, 16311 { STRING_COMMA_LEN ("neq") }, 16312 { STRING_COMMA_LEN ("nlt") }, 16313 { STRING_COMMA_LEN ("nle") }, 16314 { STRING_COMMA_LEN ("ord") }, 16315 { STRING_COMMA_LEN ("eq_uq") }, 16316 { STRING_COMMA_LEN ("nge") }, 16317 { STRING_COMMA_LEN ("ngt") }, 16318 { STRING_COMMA_LEN ("false") }, 16319 { STRING_COMMA_LEN ("neq_oq") }, 16320 { STRING_COMMA_LEN ("ge") }, 16321 { STRING_COMMA_LEN ("gt") }, 16322 { STRING_COMMA_LEN ("true") }, 16323 { STRING_COMMA_LEN ("eq_os") }, 16324 { STRING_COMMA_LEN ("lt_oq") }, 16325 { STRING_COMMA_LEN ("le_oq") }, 16326 { STRING_COMMA_LEN ("unord_s") }, 16327 { STRING_COMMA_LEN ("neq_us") }, 16328 { STRING_COMMA_LEN ("nlt_uq") }, 16329 { STRING_COMMA_LEN ("nle_uq") }, 16330 { STRING_COMMA_LEN ("ord_s") }, 16331 { STRING_COMMA_LEN ("eq_us") }, 16332 { STRING_COMMA_LEN ("nge_uq") }, 16333 { STRING_COMMA_LEN ("ngt_uq") }, 16334 { STRING_COMMA_LEN ("false_os") }, 16335 { STRING_COMMA_LEN ("neq_os") }, 16336 { STRING_COMMA_LEN ("ge_oq") }, 16337 { STRING_COMMA_LEN ("gt_oq") }, 16338 { STRING_COMMA_LEN ("true_us") }, 16339 }; 16340 16341 static void 16342 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 16343 { 16344 unsigned int cmp_type; 16345 16346 FETCH_DATA (the_info, codep + 1); 16347 cmp_type = *codep++ & 0xff; 16348 if (cmp_type < ARRAY_SIZE (vex_cmp_op)) 16349 { 16350 char suffix [3]; 16351 char *p = mnemonicendp - 2; 16352 suffix[0] = p[0]; 16353 suffix[1] = p[1]; 16354 suffix[2] = '\0'; 16355 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix); 16356 mnemonicendp += vex_cmp_op[cmp_type].len; 16357 } 16358 else 16359 { 16360 /* We have a reserved extension byte. Output it directly. */ 16361 scratchbuf[0] = '$'; 16362 print_operand_value (scratchbuf + 1, 1, cmp_type); 16363 oappend_maybe_intel (scratchbuf); 16364 scratchbuf[0] = '\0'; 16365 } 16366 } 16367 16368 static void 16369 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, 16370 int sizeflag ATTRIBUTE_UNUSED) 16371 { 16372 unsigned int cmp_type; 16373 16374 if (!vex.evex) 16375 abort (); 16376 16377 FETCH_DATA (the_info, codep + 1); 16378 cmp_type = *codep++ & 0xff; 16379 /* There are aliases for immediates 0, 1, 2, 4, 5, 6. 16380 If it's the case, print suffix, otherwise - print the immediate. */ 16381 if (cmp_type < ARRAY_SIZE (simd_cmp_op) 16382 && cmp_type != 3 16383 && cmp_type != 7) 16384 { 16385 char suffix [3]; 16386 char *p = mnemonicendp - 2; 16387 16388 /* vpcmp* can have both one- and two-lettered suffix. */ 16389 if (p[0] == 'p') 16390 { 16391 p++; 16392 suffix[0] = p[0]; 16393 suffix[1] = '\0'; 16394 } 16395 else 16396 { 16397 suffix[0] = p[0]; 16398 suffix[1] = p[1]; 16399 suffix[2] = '\0'; 16400 } 16401 16402 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix); 16403 mnemonicendp += simd_cmp_op[cmp_type].len; 16404 } 16405 else 16406 { 16407 /* We have a reserved extension byte. Output it directly. */ 16408 scratchbuf[0] = '$'; 16409 print_operand_value (scratchbuf + 1, 1, cmp_type); 16410 oappend_maybe_intel (scratchbuf); 16411 scratchbuf[0] = '\0'; 16412 } 16413 } 16414 16415 static const struct op xop_cmp_op[] = 16416 { 16417 { STRING_COMMA_LEN ("lt") }, 16418 { STRING_COMMA_LEN ("le") }, 16419 { STRING_COMMA_LEN ("gt") }, 16420 { STRING_COMMA_LEN ("ge") }, 16421 { STRING_COMMA_LEN ("eq") }, 16422 { STRING_COMMA_LEN ("neq") }, 16423 { STRING_COMMA_LEN ("false") }, 16424 { STRING_COMMA_LEN ("true") } 16425 }; 16426 16427 static void 16428 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED, 16429 int sizeflag ATTRIBUTE_UNUSED) 16430 { 16431 unsigned int cmp_type; 16432 16433 FETCH_DATA (the_info, codep + 1); 16434 cmp_type = *codep++ & 0xff; 16435 if (cmp_type < ARRAY_SIZE (xop_cmp_op)) 16436 { 16437 char suffix[3]; 16438 char *p = mnemonicendp - 2; 16439 16440 /* vpcom* can have both one- and two-lettered suffix. */ 16441 if (p[0] == 'm') 16442 { 16443 p++; 16444 suffix[0] = p[0]; 16445 suffix[1] = '\0'; 16446 } 16447 else 16448 { 16449 suffix[0] = p[0]; 16450 suffix[1] = p[1]; 16451 suffix[2] = '\0'; 16452 } 16453 16454 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix); 16455 mnemonicendp += xop_cmp_op[cmp_type].len; 16456 } 16457 else 16458 { 16459 /* We have a reserved extension byte. Output it directly. */ 16460 scratchbuf[0] = '$'; 16461 print_operand_value (scratchbuf + 1, 1, cmp_type); 16462 oappend_maybe_intel (scratchbuf); 16463 scratchbuf[0] = '\0'; 16464 } 16465 } 16466 16467 static const struct op pclmul_op[] = 16468 { 16469 { STRING_COMMA_LEN ("lql") }, 16470 { STRING_COMMA_LEN ("hql") }, 16471 { STRING_COMMA_LEN ("lqh") }, 16472 { STRING_COMMA_LEN ("hqh") } 16473 }; 16474 16475 static void 16476 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED, 16477 int sizeflag ATTRIBUTE_UNUSED) 16478 { 16479 unsigned int pclmul_type; 16480 16481 FETCH_DATA (the_info, codep + 1); 16482 pclmul_type = *codep++ & 0xff; 16483 switch (pclmul_type) 16484 { 16485 case 0x10: 16486 pclmul_type = 2; 16487 break; 16488 case 0x11: 16489 pclmul_type = 3; 16490 break; 16491 default: 16492 break; 16493 } 16494 if (pclmul_type < ARRAY_SIZE (pclmul_op)) 16495 { 16496 char suffix [4]; 16497 char *p = mnemonicendp - 3; 16498 suffix[0] = p[0]; 16499 suffix[1] = p[1]; 16500 suffix[2] = p[2]; 16501 suffix[3] = '\0'; 16502 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix); 16503 mnemonicendp += pclmul_op[pclmul_type].len; 16504 } 16505 else 16506 { 16507 /* We have a reserved extension byte. Output it directly. */ 16508 scratchbuf[0] = '$'; 16509 print_operand_value (scratchbuf + 1, 1, pclmul_type); 16510 oappend_maybe_intel (scratchbuf); 16511 scratchbuf[0] = '\0'; 16512 } 16513 } 16514 16515 static void 16516 MOVBE_Fixup (int bytemode, int sizeflag) 16517 { 16518 /* Add proper suffix to "movbe". */ 16519 char *p = mnemonicendp; 16520 16521 switch (bytemode) 16522 { 16523 case v_mode: 16524 if (intel_syntax) 16525 goto skip; 16526 16527 USED_REX (REX_W); 16528 if (sizeflag & SUFFIX_ALWAYS) 16529 { 16530 if (rex & REX_W) 16531 *p++ = 'q'; 16532 else 16533 { 16534 if (sizeflag & DFLAG) 16535 *p++ = 'l'; 16536 else 16537 *p++ = 'w'; 16538 used_prefixes |= (prefixes & PREFIX_DATA); 16539 } 16540 } 16541 break; 16542 default: 16543 oappend (INTERNAL_DISASSEMBLER_ERROR); 16544 break; 16545 } 16546 mnemonicendp = p; 16547 *p = '\0'; 16548 16549 skip: 16550 OP_M (bytemode, sizeflag); 16551 } 16552 16553 static void 16554 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 16555 { 16556 int reg; 16557 const char **names; 16558 16559 /* Skip mod/rm byte. */ 16560 MODRM_CHECK; 16561 codep++; 16562 16563 if (rex & REX_W) 16564 names = names64; 16565 else 16566 names = names32; 16567 16568 reg = modrm.rm; 16569 USED_REX (REX_B); 16570 if (rex & REX_B) 16571 reg += 8; 16572 16573 oappend (names[reg]); 16574 } 16575 16576 static void 16577 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) 16578 { 16579 const char **names; 16580 unsigned int reg = vex.register_specifier; 16581 16582 if (rex & REX_W) 16583 names = names64; 16584 else 16585 names = names32; 16586 16587 if (address_mode != mode_64bit) 16588 reg &= 7; 16589 oappend (names[reg]); 16590 } 16591 16592 static void 16593 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED) 16594 { 16595 if (!vex.evex 16596 || (bytemode != mask_mode && bytemode != mask_bd_mode)) 16597 abort (); 16598 16599 USED_REX (REX_R); 16600 if ((rex & REX_R) != 0 || !vex.r) 16601 { 16602 BadOp (); 16603 return; 16604 } 16605 16606 oappend (names_mask [modrm.reg]); 16607 } 16608 16609 static void 16610 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED) 16611 { 16612 if (!vex.evex 16613 || (bytemode != evex_rounding_mode 16614 && bytemode != evex_rounding_64_mode 16615 && bytemode != evex_sae_mode)) 16616 abort (); 16617 if (modrm.mod == 3 && vex.b) 16618 switch (bytemode) 16619 { 16620 case evex_rounding_64_mode: 16621 if (address_mode != mode_64bit) 16622 { 16623 oappend ("(bad)"); 16624 break; 16625 } 16626 /* Fall through. */ 16627 case evex_rounding_mode: 16628 oappend (names_rounding[vex.ll]); 16629 break; 16630 case evex_sae_mode: 16631 oappend ("{sae}"); 16632 break; 16633 default: 16634 break; 16635 } 16636 } 16637