17c478bd9Sstevel@tonic-gate /* 2d0f8ff6eSkk * 37c478bd9Sstevel@tonic-gate * CDDL HEADER START 47c478bd9Sstevel@tonic-gate * 57c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 6dc0093f4Seschrock * Common Development and Distribution License (the "License"). 7dc0093f4Seschrock * You may not use this file except in compliance with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 23ab47273fSEdward Gillett * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 24c1e9bf00SRobert Mustacchi * Copyright 2019 Joyent, Inc. 25a25e615dSRobert Mustacchi * Copyright 2020 Robert Mustacchi 26ab47273fSEdward Gillett */ 27ab47273fSEdward Gillett 28ab47273fSEdward Gillett /* 29ab47273fSEdward Gillett * Copyright (c) 2010, Intel Corporation. 30ab47273fSEdward Gillett * All rights reserved. 317c478bd9Sstevel@tonic-gate */ 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate /* Copyright (c) 1988 AT&T */ 34cff040f3SRobert Mustacchi /* All Rights Reserved */ 357c478bd9Sstevel@tonic-gate 367c478bd9Sstevel@tonic-gate #include "dis_tables.h" 377c478bd9Sstevel@tonic-gate 387c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate /* 417c478bd9Sstevel@tonic-gate * Disassembly begins in dis_distable, which is equivalent to the One-byte 427c478bd9Sstevel@tonic-gate * Opcode Map in the Intel IA32 ISA Reference (page A-6 in my copy). The 437c478bd9Sstevel@tonic-gate * decoding loops then traverse out through the other tables as necessary to 447c478bd9Sstevel@tonic-gate * decode a given instruction. 457c478bd9Sstevel@tonic-gate * 467c478bd9Sstevel@tonic-gate * The behavior of this file can be controlled by one of the following flags: 477c478bd9Sstevel@tonic-gate * 48cff040f3SRobert Mustacchi * DIS_TEXT Include text for disassembly 49cff040f3SRobert Mustacchi * DIS_MEM Include memory-size calculations 507c478bd9Sstevel@tonic-gate * 517c478bd9Sstevel@tonic-gate * Either or both of these can be defined. 527c478bd9Sstevel@tonic-gate * 537c478bd9Sstevel@tonic-gate * This file is not, and will never be, cstyled. If anything, the tables should 547c478bd9Sstevel@tonic-gate * be taken out another tab stop or two so nothing overlaps. 557c478bd9Sstevel@tonic-gate */ 567c478bd9Sstevel@tonic-gate 577c478bd9Sstevel@tonic-gate /* 587c478bd9Sstevel@tonic-gate * These functions must be provided for the consumer to do disassembly. 597c478bd9Sstevel@tonic-gate */ 607c478bd9Sstevel@tonic-gate #ifdef DIS_TEXT 617c478bd9Sstevel@tonic-gate extern char *strncpy(char *, const char *, size_t); 627c478bd9Sstevel@tonic-gate extern size_t strlen(const char *); 637c478bd9Sstevel@tonic-gate extern int strcmp(const char *, const char *); 647c478bd9Sstevel@tonic-gate extern int strncmp(const char *, const char *, size_t); 657c478bd9Sstevel@tonic-gate extern size_t strlcat(char *, const char *, size_t); 667c478bd9Sstevel@tonic-gate #endif 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gate 69cff040f3SRobert Mustacchi #define TERM 0 /* used to indicate that the 'indirect' */ 707c478bd9Sstevel@tonic-gate /* field terminates - no pointer. */ 717c478bd9Sstevel@tonic-gate 727c478bd9Sstevel@tonic-gate /* Used to decode instructions. */ 737c478bd9Sstevel@tonic-gate typedef struct instable { 747c478bd9Sstevel@tonic-gate struct instable *it_indirect; /* for decode op codes */ 757c478bd9Sstevel@tonic-gate uchar_t it_adrmode; 767c478bd9Sstevel@tonic-gate #ifdef DIS_TEXT 777c478bd9Sstevel@tonic-gate char it_name[NCPS]; 78d267098bSdmick uint_t it_suffix:1; /* mnem + "w", "l", or "d" */ 797c478bd9Sstevel@tonic-gate #endif 807c478bd9Sstevel@tonic-gate #ifdef DIS_MEM 817c478bd9Sstevel@tonic-gate uint_t it_size:16; 827c478bd9Sstevel@tonic-gate #endif 837c478bd9Sstevel@tonic-gate uint_t it_invalid64:1; /* opcode invalid in amd64 */ 847c478bd9Sstevel@tonic-gate uint_t it_always64:1; /* 64 bit when in 64 bit mode */ 857c478bd9Sstevel@tonic-gate uint_t it_invalid32:1; /* invalid in IA32 */ 867c478bd9Sstevel@tonic-gate uint_t it_stackop:1; /* push/pop stack operation */ 87245ac945SRobert Mustacchi uint_t it_vexwoxmm:1; /* VEX instructions that don't use XMM/YMM */ 88d242cdf5SJerry Jelinek uint_t it_avxsuf:2; /* AVX2/AVX512 suffix rqd. */ 89a4e73d5dSJerry Jelinek uint_t it_vexopmask:1; /* VEX inst. that use opmask */ 907c478bd9Sstevel@tonic-gate } instable_t; 917c478bd9Sstevel@tonic-gate 927c478bd9Sstevel@tonic-gate /* 937c478bd9Sstevel@tonic-gate * Instruction formats. 947c478bd9Sstevel@tonic-gate */ 957c478bd9Sstevel@tonic-gate enum { 967c478bd9Sstevel@tonic-gate UNKNOWN, 977c478bd9Sstevel@tonic-gate MRw, 987c478bd9Sstevel@tonic-gate IMlw, 997c478bd9Sstevel@tonic-gate IMw, 1007c478bd9Sstevel@tonic-gate IR, 1017c478bd9Sstevel@tonic-gate OA, 1027c478bd9Sstevel@tonic-gate AO, 1037c478bd9Sstevel@tonic-gate MS, 1047c478bd9Sstevel@tonic-gate SM, 1057c478bd9Sstevel@tonic-gate Mv, 1067c478bd9Sstevel@tonic-gate Mw, 1077c478bd9Sstevel@tonic-gate M, /* register or memory */ 1087aa76ffcSBryan Cantrill MG9, /* register or memory in group 9 (prefix optional) */ 1097c478bd9Sstevel@tonic-gate Mb, /* register or memory, always byte sized */ 1107c478bd9Sstevel@tonic-gate MO, /* memory only (no registers) */ 1117c478bd9Sstevel@tonic-gate PREF, 112eb23829fSBryan Cantrill SWAPGS_RDTSCP, 113f8801251Skk MONITOR_MWAIT, 1147c478bd9Sstevel@tonic-gate R, 1157c478bd9Sstevel@tonic-gate RA, 1167c478bd9Sstevel@tonic-gate SEG, 1177c478bd9Sstevel@tonic-gate MR, 1187c478bd9Sstevel@tonic-gate RM, 119cff040f3SRobert Mustacchi RM_66r, /* RM, but with a required 0x66 prefix */ 1207c478bd9Sstevel@tonic-gate IA, 1217c478bd9Sstevel@tonic-gate MA, 1227c478bd9Sstevel@tonic-gate SD, 1237c478bd9Sstevel@tonic-gate AD, 1247c478bd9Sstevel@tonic-gate SA, 1257c478bd9Sstevel@tonic-gate D, 1267c478bd9Sstevel@tonic-gate INM, 1277c478bd9Sstevel@tonic-gate SO, 1287c478bd9Sstevel@tonic-gate BD, 1297c478bd9Sstevel@tonic-gate I, 1307c478bd9Sstevel@tonic-gate P, 1317c478bd9Sstevel@tonic-gate V, 1327c478bd9Sstevel@tonic-gate DSHIFT, /* for double shift that has an 8-bit immediate */ 1337c478bd9Sstevel@tonic-gate U, 1347c478bd9Sstevel@tonic-gate OVERRIDE, 1357c478bd9Sstevel@tonic-gate NORM, /* instructions w/o ModR/M byte, no memory access */ 1367c478bd9Sstevel@tonic-gate IMPLMEM, /* instructions w/o ModR/M byte, implicit mem access */ 1377c478bd9Sstevel@tonic-gate O, /* for call */ 138cff040f3SRobert Mustacchi JTAB, /* jump table */ 1397c478bd9Sstevel@tonic-gate IMUL, /* for 186 iimul instr */ 1407c478bd9Sstevel@tonic-gate CBW, /* so data16 can be evaluated for cbw and variants */ 1417c478bd9Sstevel@tonic-gate MvI, /* for 186 logicals */ 1427c478bd9Sstevel@tonic-gate ENTER, /* for 186 enter instr */ 1437c478bd9Sstevel@tonic-gate RMw, /* for 286 arpl instr */ 1447c478bd9Sstevel@tonic-gate Ib, /* for push immediate byte */ 1457c478bd9Sstevel@tonic-gate F, /* for 287 instructions */ 1467c478bd9Sstevel@tonic-gate FF, /* for 287 instructions */ 1477c478bd9Sstevel@tonic-gate FFC, /* for 287 instructions */ 1487c478bd9Sstevel@tonic-gate DM, /* 16-bit data */ 1497c478bd9Sstevel@tonic-gate AM, /* 16-bit addr */ 1507c478bd9Sstevel@tonic-gate LSEG, /* for 3-bit seg reg encoding */ 1517c478bd9Sstevel@tonic-gate MIb, /* for 386 logicals */ 1527c478bd9Sstevel@tonic-gate SREG, /* for 386 special registers */ 1537c478bd9Sstevel@tonic-gate PREFIX, /* a REP instruction prefix */ 1547c478bd9Sstevel@tonic-gate LOCK, /* a LOCK instruction prefix */ 1557c478bd9Sstevel@tonic-gate INT3, /* The int 3 instruction, which has a fake operand */ 1567c478bd9Sstevel@tonic-gate INTx, /* The normal int instruction, with explicit int num */ 1577c478bd9Sstevel@tonic-gate DSHIFTcl, /* for double shift that implicitly uses %cl */ 1587c478bd9Sstevel@tonic-gate CWD, /* so data16 can be evaluated for cwd and variants */ 1597c478bd9Sstevel@tonic-gate RET, /* single immediate 16-bit operand */ 1607c478bd9Sstevel@tonic-gate MOVZ, /* for movs and movz, with different size operands */ 161d0f8ff6eSkk CRC32, /* for crc32, with different size operands */ 1627c478bd9Sstevel@tonic-gate XADDB, /* for xaddb */ 1637c478bd9Sstevel@tonic-gate MOVSXZ, /* AMD64 mov sign extend 32 to 64 bit instruction */ 16482d5eb48SKrishnendu Sadhukhan - Sun Microsystems MOVBE, /* movbe instruction */ 1657c478bd9Sstevel@tonic-gate 1667c478bd9Sstevel@tonic-gate /* 1677c478bd9Sstevel@tonic-gate * MMX/SIMD addressing modes. 1687c478bd9Sstevel@tonic-gate */ 1697c478bd9Sstevel@tonic-gate 1707c478bd9Sstevel@tonic-gate MMO, /* Prefixable MMX/SIMD-Int mm/mem -> mm */ 1717c478bd9Sstevel@tonic-gate MMOIMPL, /* Prefixable MMX/SIMD-Int mm -> mm (mem) */ 1727c478bd9Sstevel@tonic-gate MMO3P, /* Prefixable MMX/SIMD-Int mm -> r32,imm8 */ 173cff040f3SRobert Mustacchi MMOM3, /* Prefixable MMX/SIMD-Int mm -> r32 */ 1747c478bd9Sstevel@tonic-gate MMOS, /* Prefixable MMX/SIMD-Int mm -> mm/mem */ 1757c478bd9Sstevel@tonic-gate MMOMS, /* Prefixable MMX/SIMD-Int mm -> mem */ 1767c478bd9Sstevel@tonic-gate MMOPM, /* MMX/SIMD-Int mm/mem -> mm,imm8 */ 177d0f8ff6eSkk MMOPM_66o, /* MMX/SIMD-Int 0x66 optional mm/mem -> mm,imm8 */ 1787c478bd9Sstevel@tonic-gate MMOPRM, /* Prefixable MMX/SIMD-Int r32/mem -> mm,imm8 */ 1797c478bd9Sstevel@tonic-gate MMOSH, /* Prefixable MMX mm,imm8 */ 1807c478bd9Sstevel@tonic-gate MM, /* MMX/SIMD-Int mm/mem -> mm */ 1817c478bd9Sstevel@tonic-gate MMS, /* MMX/SIMD-Int mm -> mm/mem */ 1827c478bd9Sstevel@tonic-gate MMSH, /* MMX mm,imm8 */ 1837c478bd9Sstevel@tonic-gate XMMO, /* Prefixable SIMD xmm/mem -> xmm */ 1847c478bd9Sstevel@tonic-gate XMMOS, /* Prefixable SIMD xmm -> xmm/mem */ 1857c478bd9Sstevel@tonic-gate XMMOPM, /* Prefixable SIMD xmm/mem w/to xmm,imm8 */ 1867c478bd9Sstevel@tonic-gate XMMOMX, /* Prefixable SIMD mm/mem -> xmm */ 1877c478bd9Sstevel@tonic-gate XMMOX3, /* Prefixable SIMD xmm -> r32 */ 1887c478bd9Sstevel@tonic-gate XMMOXMM, /* Prefixable SIMD xmm/mem -> mm */ 1897c478bd9Sstevel@tonic-gate XMMOM, /* Prefixable SIMD xmm -> mem */ 1907c478bd9Sstevel@tonic-gate XMMOMS, /* Prefixable SIMD mem -> xmm */ 191cff040f3SRobert Mustacchi XMM, /* SIMD xmm/mem -> xmm */ 192d0f8ff6eSkk XMM_66r, /* SIMD 0x66 prefix required xmm/mem -> xmm */ 193cff040f3SRobert Mustacchi XMM_66o, /* SIMD 0x66 prefix optional xmm/mem -> xmm */ 1947c478bd9Sstevel@tonic-gate XMMXIMPL, /* SIMD xmm -> xmm (mem) */ 1957c478bd9Sstevel@tonic-gate XMM3P, /* SIMD xmm -> r32,imm8 */ 196d0f8ff6eSkk XMM3PM_66r, /* SIMD 0x66 prefix required xmm -> r32/mem,imm8 */ 197cff040f3SRobert Mustacchi XMMP, /* SIMD xmm/mem w/to xmm,imm8 */ 198d0f8ff6eSkk XMMP_66o, /* SIMD 0x66 prefix optional xmm/mem w/to xmm,imm8 */ 199d0f8ff6eSkk XMMP_66r, /* SIMD 0x66 prefix required xmm/mem w/to xmm,imm8 */ 200cff040f3SRobert Mustacchi XMMPRM, /* SIMD r32/mem -> xmm,imm8 */ 201d0f8ff6eSkk XMMPRM_66r, /* SIMD 0x66 prefix required r32/mem -> xmm,imm8 */ 2027c478bd9Sstevel@tonic-gate XMMS, /* SIMD xmm -> xmm/mem */ 203cff040f3SRobert Mustacchi XMMM, /* SIMD mem -> xmm */ 204d0f8ff6eSkk XMMM_66r, /* SIMD 0x66 prefix required mem -> xmm */ 2057c478bd9Sstevel@tonic-gate XMMMS, /* SIMD xmm -> mem */ 206cff040f3SRobert Mustacchi XMM3MX, /* SIMD r32/mem -> xmm */ 207cff040f3SRobert Mustacchi XMM3MXS, /* SIMD xmm -> r32/mem */ 208cff040f3SRobert Mustacchi XMMSH, /* SIMD xmm,imm8 */ 209cff040f3SRobert Mustacchi XMMXM3, /* SIMD xmm/mem -> r32 */ 210cff040f3SRobert Mustacchi XMMX3, /* SIMD xmm -> r32 */ 211cff040f3SRobert Mustacchi XMMXMM, /* SIMD xmm/mem -> mm */ 212cff040f3SRobert Mustacchi XMMMX, /* SIMD mm -> xmm */ 213cff040f3SRobert Mustacchi XMMXM, /* SIMD xmm -> mm */ 214cff040f3SRobert Mustacchi XMMX2I, /* SIMD xmm -> xmm, imm, imm */ 215cff040f3SRobert Mustacchi XMM2I, /* SIMD xmm, imm, imm */ 2167c478bd9Sstevel@tonic-gate XMMFENCE, /* SIMD lfence or mfence */ 217ab47273fSEdward Gillett XMMSFNC, /* SIMD sfence (none or mem) */ 218cff040f3SRobert Mustacchi FSGS, /* FSGSBASE if reg */ 219ab47273fSEdward Gillett XGETBV_XSETBV, 220ab47273fSEdward Gillett VEX_NONE, /* VEX no operand */ 221ab47273fSEdward Gillett VEX_MO, /* VEX mod_rm -> implicit reg */ 222ab47273fSEdward Gillett VEX_RMrX, /* VEX VEX.vvvv, mod_rm -> mod_reg */ 223245ac945SRobert Mustacchi VEX_VRMrX, /* VEX mod_rm, VEX.vvvv -> mod_rm */ 224ab47273fSEdward Gillett VEX_RRX, /* VEX VEX.vvvv, mod_reg -> mod_rm */ 225ab47273fSEdward Gillett VEX_RMRX, /* VEX VEX.vvvv, mod_rm, imm8[7:4] -> mod_reg */ 226cff040f3SRobert Mustacchi VEX_MX, /* VEX mod_rm -> mod_reg */ 227cff040f3SRobert Mustacchi VEX_MXI, /* VEX mod_rm, imm8 -> mod_reg */ 228cff040f3SRobert Mustacchi VEX_XXI, /* VEX mod_rm, imm8 -> VEX.vvvv */ 229cff040f3SRobert Mustacchi VEX_MR, /* VEX mod_rm -> mod_reg */ 230cff040f3SRobert Mustacchi VEX_RRI, /* VEX mod_reg, mod_rm -> implicit(eflags/r32) */ 231cff040f3SRobert Mustacchi VEX_RX, /* VEX mod_reg -> mod_rm */ 232cff040f3SRobert Mustacchi VEX_KRR, /* VEX mod_rm -> mod_reg */ 233cff040f3SRobert Mustacchi VEX_KMR, /* VEX mod_reg -> mod_rm */ 234cff040f3SRobert Mustacchi VEX_KRM, /* VEX mod_rm -> mod_reg */ 235cff040f3SRobert Mustacchi VEX_RR, /* VEX mod_rm -> mod_reg */ 236cff040f3SRobert Mustacchi VEX_RRi, /* VEX mod_rm, imm8 -> mod_reg */ 237cff040f3SRobert Mustacchi VEX_RM, /* VEX mod_reg -> mod_rm */ 238245ac945SRobert Mustacchi VEX_RIM, /* VEX mod_reg, imm8 -> mod_rm */ 239cff040f3SRobert Mustacchi VEX_RRM, /* VEX VEX.vvvv, mod_reg -> mod_rm */ 240cff040f3SRobert Mustacchi VEX_RMX, /* VEX VEX.vvvv, mod_rm -> mod_reg */ 241245ac945SRobert Mustacchi VEX_SbVM, /* VEX SIB, VEX.vvvv -> mod_rm */ 2427aa76ffcSBryan Cantrill VMx, /* vmcall/vmlaunch/vmresume/vmxoff */ 24370dc7639SRichard Lowe VMxo, /* VMx instruction with optional prefix */ 244245ac945SRobert Mustacchi SVM, /* AMD SVM instructions */ 245245ac945SRobert Mustacchi BLS, /* BLSR, BLSMSK, BLSI */ 2468889c875SRobert Mustacchi FMA, /* FMA instructions, all VEX_RMrX */ 24781b505b7SJerry Jelinek ADX, /* ADX instructions, support REX.w, mod_rm->mod_reg */ 248cff040f3SRobert Mustacchi EVEX_RX, /* EVEX mod_reg -> mod_rm */ 249cff040f3SRobert Mustacchi EVEX_MX, /* EVEX mod_rm -> mod_reg */ 250a25e615dSRobert Mustacchi EVEX_RMrX, /* EVEX EVEX.vvvv, mod_rm -> mod_reg */ 251a25e615dSRobert Mustacchi EVEX_RMRX /* EVEX EVEX.vvvv, mod_rm, imm8 -> mod_reg */ 2527c478bd9Sstevel@tonic-gate }; 2537c478bd9Sstevel@tonic-gate 254ab47273fSEdward Gillett /* 255ab47273fSEdward Gillett * VEX prefixes 256ab47273fSEdward Gillett */ 257ab47273fSEdward Gillett #define VEX_2bytes 0xC5 /* the first byte of two-byte form */ 258ab47273fSEdward Gillett #define VEX_3bytes 0xC4 /* the first byte of three-byte form */ 259ab47273fSEdward Gillett 2607c478bd9Sstevel@tonic-gate #define FILL 0x90 /* Fill byte used for alignment (nop) */ 2617c478bd9Sstevel@tonic-gate 2627c478bd9Sstevel@tonic-gate /* 2637c478bd9Sstevel@tonic-gate ** Register numbers for the i386 2647c478bd9Sstevel@tonic-gate */ 2657c478bd9Sstevel@tonic-gate #define EAX_REGNO 0 2667c478bd9Sstevel@tonic-gate #define ECX_REGNO 1 2677c478bd9Sstevel@tonic-gate #define EDX_REGNO 2 2687c478bd9Sstevel@tonic-gate #define EBX_REGNO 3 2697c478bd9Sstevel@tonic-gate #define ESP_REGNO 4 2707c478bd9Sstevel@tonic-gate #define EBP_REGNO 5 2717c478bd9Sstevel@tonic-gate #define ESI_REGNO 6 2727c478bd9Sstevel@tonic-gate #define EDI_REGNO 7 2737c478bd9Sstevel@tonic-gate 2747c478bd9Sstevel@tonic-gate /* 2757c478bd9Sstevel@tonic-gate * modes for immediate values 2767c478bd9Sstevel@tonic-gate */ 2777c478bd9Sstevel@tonic-gate #define MODE_NONE 0 2787c478bd9Sstevel@tonic-gate #define MODE_IPREL 1 /* signed IP relative value */ 2797c478bd9Sstevel@tonic-gate #define MODE_SIGNED 2 /* sign extended immediate */ 2807c478bd9Sstevel@tonic-gate #define MODE_IMPLIED 3 /* constant value implied from opcode */ 2817c478bd9Sstevel@tonic-gate #define MODE_OFFSET 4 /* offset part of an address */ 282d267098bSdmick #define MODE_RIPREL 5 /* like IPREL, but from %rip (amd64) */ 2837c478bd9Sstevel@tonic-gate 2847c478bd9Sstevel@tonic-gate /* 2857c478bd9Sstevel@tonic-gate * The letters used in these macros are: 2867c478bd9Sstevel@tonic-gate * IND - indirect to another to another table 2877c478bd9Sstevel@tonic-gate * "T" - means to Terminate indirections (this is the final opcode) 2887c478bd9Sstevel@tonic-gate * "S" - means "operand length suffix required" 289d242cdf5SJerry Jelinek * "Sa" - means AVX2 suffix (q/d) required 290d242cdf5SJerry Jelinek * "Sq" - means AVX512 suffix (q/d) required 291d242cdf5SJerry Jelinek * "Sd" - means AVX512 suffix (d/s) required 2927c478bd9Sstevel@tonic-gate * "NS" - means "no suffix" which is the operand length suffix of the opcode 2937c478bd9Sstevel@tonic-gate * "Z" - means instruction size arg required 2947c478bd9Sstevel@tonic-gate * "u" - means the opcode is invalid in IA32 but valid in amd64 2957c478bd9Sstevel@tonic-gate * "x" - means the opcode is invalid in amd64, but not IA32 2967c478bd9Sstevel@tonic-gate * "y" - means the operand size is always 64 bits in 64 bit mode 2977c478bd9Sstevel@tonic-gate * "p" - means push/pop stack operation 298245ac945SRobert Mustacchi * "vr" - means VEX instruction that operates on normal registers, not fpu 299a4e73d5dSJerry Jelinek * "vo" - means VEX instruction that operates on opmask registers, not fpu 3007c478bd9Sstevel@tonic-gate */ 3017c478bd9Sstevel@tonic-gate 302d242cdf5SJerry Jelinek #define AVS2 (uint_t)1 /* it_avxsuf: AVX2 q/d suffix handling */ 303d242cdf5SJerry Jelinek #define AVS5Q (uint_t)2 /* it_avxsuf: AVX512 q/d suffix handling */ 304d242cdf5SJerry Jelinek #define AVS5D (uint_t)3 /* it_avxsuf: AVX512 d/s suffix handling */ 305d242cdf5SJerry Jelinek 3067c478bd9Sstevel@tonic-gate #if defined(DIS_TEXT) && defined(DIS_MEM) 3077c478bd9Sstevel@tonic-gate #define IND(table) {(instable_t *)table, 0, "", 0, 0, 0, 0, 0, 0} 3087c478bd9Sstevel@tonic-gate #define INDx(table) {(instable_t *)table, 0, "", 0, 0, 1, 0, 0, 0} 3097c478bd9Sstevel@tonic-gate #define TNS(name, amode) {TERM, amode, name, 0, 0, 0, 0, 0, 0} 3107c478bd9Sstevel@tonic-gate #define TNSu(name, amode) {TERM, amode, name, 0, 0, 0, 0, 1, 0} 3117c478bd9Sstevel@tonic-gate #define TNSx(name, amode) {TERM, amode, name, 0, 0, 1, 0, 0, 0} 3127c478bd9Sstevel@tonic-gate #define TNSy(name, amode) {TERM, amode, name, 0, 0, 0, 1, 0, 0} 3137c478bd9Sstevel@tonic-gate #define TNSyp(name, amode) {TERM, amode, name, 0, 0, 0, 1, 0, 1} 3147c478bd9Sstevel@tonic-gate #define TNSZ(name, amode, sz) {TERM, amode, name, 0, sz, 0, 0, 0, 0} 3157c478bd9Sstevel@tonic-gate #define TNSZy(name, amode, sz) {TERM, amode, name, 0, sz, 0, 1, 0, 0} 316245ac945SRobert Mustacchi #define TNSZvr(name, amode, sz) {TERM, amode, name, 0, sz, 0, 0, 0, 0, 1} 317a4e73d5dSJerry Jelinek #define TSvo(name, amode) {TERM, amode, name, 1, 0, 0, 0, 0, 0, 0, 0, 1} 3187c478bd9Sstevel@tonic-gate #define TS(name, amode) {TERM, amode, name, 1, 0, 0, 0, 0, 0} 3197c478bd9Sstevel@tonic-gate #define TSx(name, amode) {TERM, amode, name, 1, 0, 1, 0, 0, 0} 3207c478bd9Sstevel@tonic-gate #define TSy(name, amode) {TERM, amode, name, 1, 0, 0, 1, 0, 0} 3217c478bd9Sstevel@tonic-gate #define TSp(name, amode) {TERM, amode, name, 1, 0, 0, 0, 0, 1} 3227c478bd9Sstevel@tonic-gate #define TSZ(name, amode, sz) {TERM, amode, name, 1, sz, 0, 0, 0, 0} 323d242cdf5SJerry Jelinek #define TSaZ(name, amode, sz) {TERM, amode, name, 1, sz, 0, 0, 0, 0, 0, AVS2} 324d242cdf5SJerry Jelinek #define TSq(name, amode) {TERM, amode, name, 0, 0, 0, 0, 0, 0, 0, AVS5Q} 325d242cdf5SJerry Jelinek #define TSd(name, amode) {TERM, amode, name, 0, 0, 0, 0, 0, 0, 0, AVS5D} 3267c478bd9Sstevel@tonic-gate #define TSZx(name, amode, sz) {TERM, amode, name, 1, sz, 1, 0, 0, 0} 3277c478bd9Sstevel@tonic-gate #define TSZy(name, amode, sz) {TERM, amode, name, 1, sz, 0, 1, 0, 0} 3287c478bd9Sstevel@tonic-gate #define INVALID {TERM, UNKNOWN, "", 0, 0, 0, 0, 0} 3297c478bd9Sstevel@tonic-gate #elif defined(DIS_TEXT) 3307c478bd9Sstevel@tonic-gate #define IND(table) {(instable_t *)table, 0, "", 0, 0, 0, 0, 0} 3317c478bd9Sstevel@tonic-gate #define INDx(table) {(instable_t *)table, 0, "", 0, 1, 0, 0, 0} 3327c478bd9Sstevel@tonic-gate #define TNS(name, amode) {TERM, amode, name, 0, 0, 0, 0, 0} 3337c478bd9Sstevel@tonic-gate #define TNSu(name, amode) {TERM, amode, name, 0, 0, 0, 1, 0} 3347c478bd9Sstevel@tonic-gate #define TNSx(name, amode) {TERM, amode, name, 0, 1, 0, 0, 0} 3357c478bd9Sstevel@tonic-gate #define TNSy(name, amode) {TERM, amode, name, 0, 0, 1, 0, 0} 3367c478bd9Sstevel@tonic-gate #define TNSyp(name, amode) {TERM, amode, name, 0, 0, 1, 0, 1} 3377c478bd9Sstevel@tonic-gate #define TNSZ(name, amode, sz) {TERM, amode, name, 0, 0, 0, 0, 0} 3387c478bd9Sstevel@tonic-gate #define TNSZy(name, amode, sz) {TERM, amode, name, 0, 0, 1, 0, 0} 339245ac945SRobert Mustacchi #define TNSZvr(name, amode, sz) {TERM, amode, name, 0, 0, 0, 0, 0, 1} 340a4e73d5dSJerry Jelinek #define TSvo(name, amode) {TERM, amode, name, 1, 0, 0, 0, 0, 0, 0, 1} 3417c478bd9Sstevel@tonic-gate #define TS(name, amode) {TERM, amode, name, 1, 0, 0, 0, 0} 3427c478bd9Sstevel@tonic-gate #define TSx(name, amode) {TERM, amode, name, 1, 1, 0, 0, 0} 3437c478bd9Sstevel@tonic-gate #define TSy(name, amode) {TERM, amode, name, 1, 0, 1, 0, 0} 3447c478bd9Sstevel@tonic-gate #define TSp(name, amode) {TERM, amode, name, 1, 0, 0, 0, 1} 3457c478bd9Sstevel@tonic-gate #define TSZ(name, amode, sz) {TERM, amode, name, 1, 0, 0, 0, 0} 346d242cdf5SJerry Jelinek #define TSaZ(name, amode, sz) {TERM, amode, name, 1, 0, 0, 0, 0, 0, AVS2} 347d242cdf5SJerry Jelinek #define TSq(name, amode) {TERM, amode, name, 0, 0, 0, 0, 0, 0, AVS5Q} 3487c478bd9Sstevel@tonic-gate #define TSZx(name, amode, sz) {TERM, amode, name, 1, 1, 0, 0, 0} 3497c478bd9Sstevel@tonic-gate #define TSZy(name, amode, sz) {TERM, amode, name, 1, 0, 1, 0, 0} 3507c478bd9Sstevel@tonic-gate #define INVALID {TERM, UNKNOWN, "", 0, 0, 0, 0, 0} 3517c478bd9Sstevel@tonic-gate #elif defined(DIS_MEM) 3527c478bd9Sstevel@tonic-gate #define IND(table) {(instable_t *)table, 0, 0, 0, 0, 0, 0} 3537c478bd9Sstevel@tonic-gate #define INDx(table) {(instable_t *)table, 0, 0, 1, 0, 0, 0} 3547c478bd9Sstevel@tonic-gate #define TNS(name, amode) {TERM, amode, 0, 0, 0, 0, 0} 3557c478bd9Sstevel@tonic-gate #define TNSu(name, amode) {TERM, amode, 0, 0, 0, 1, 0} 3567c478bd9Sstevel@tonic-gate #define TNSy(name, amode) {TERM, amode, 0, 0, 1, 0, 0} 3577c478bd9Sstevel@tonic-gate #define TNSyp(name, amode) {TERM, amode, 0, 0, 1, 0, 1} 3587c478bd9Sstevel@tonic-gate #define TNSx(name, amode) {TERM, amode, 0, 1, 0, 0, 0} 3597c478bd9Sstevel@tonic-gate #define TNSZ(name, amode, sz) {TERM, amode, sz, 0, 0, 0, 0} 3607c478bd9Sstevel@tonic-gate #define TNSZy(name, amode, sz) {TERM, amode, sz, 0, 1, 0, 0} 361245ac945SRobert Mustacchi #define TNSZvr(name, amode, sz) {TERM, amode, sz, 0, 0, 0, 0, 1} 362a4e73d5dSJerry Jelinek #define TSvo(name, amode) {TERM, amode, 0, 0, 0, 0, 0, 0, 0, 1} 3637c478bd9Sstevel@tonic-gate #define TS(name, amode) {TERM, amode, 0, 0, 0, 0, 0} 3647c478bd9Sstevel@tonic-gate #define TSx(name, amode) {TERM, amode, 0, 1, 0, 0, 0} 3657c478bd9Sstevel@tonic-gate #define TSy(name, amode) {TERM, amode, 0, 0, 1, 0, 0} 3667c478bd9Sstevel@tonic-gate #define TSp(name, amode) {TERM, amode, 0, 0, 0, 0, 1} 3677c478bd9Sstevel@tonic-gate #define TSZ(name, amode, sz) {TERM, amode, sz, 0, 0, 0, 0} 368d242cdf5SJerry Jelinek #define TSaZ(name, amode, sz) {TERM, amode, sz, 0, 0, 0, 0, 0, AVS2} 369d242cdf5SJerry Jelinek #define TSq(name, amode) {TERM, amode, 0, 0, 0, 0, 0, 0, AVS5Q} 3707c478bd9Sstevel@tonic-gate #define TSZx(name, amode, sz) {TERM, amode, sz, 1, 0, 0, 0} 3717c478bd9Sstevel@tonic-gate #define TSZy(name, amode, sz) {TERM, amode, sz, 0, 1, 0, 0} 3727c478bd9Sstevel@tonic-gate #define INVALID {TERM, UNKNOWN, 0, 0, 0, 0, 0} 3737c478bd9Sstevel@tonic-gate #else 3747c478bd9Sstevel@tonic-gate #define IND(table) {(instable_t *)table, 0, 0, 0, 0, 0} 3757c478bd9Sstevel@tonic-gate #define INDx(table) {(instable_t *)table, 0, 1, 0, 0, 0} 3767c478bd9Sstevel@tonic-gate #define TNS(name, amode) {TERM, amode, 0, 0, 0, 0} 3777c478bd9Sstevel@tonic-gate #define TNSu(name, amode) {TERM, amode, 0, 0, 1, 0} 3787c478bd9Sstevel@tonic-gate #define TNSy(name, amode) {TERM, amode, 0, 1, 0, 0} 3797c478bd9Sstevel@tonic-gate #define TNSyp(name, amode) {TERM, amode, 0, 1, 0, 1} 3807c478bd9Sstevel@tonic-gate #define TNSx(name, amode) {TERM, amode, 1, 0, 0, 0} 3817c478bd9Sstevel@tonic-gate #define TNSZ(name, amode, sz) {TERM, amode, 0, 0, 0, 0} 3827c478bd9Sstevel@tonic-gate #define TNSZy(name, amode, sz) {TERM, amode, 0, 1, 0, 0} 383245ac945SRobert Mustacchi #define TNSZvr(name, amode, sz) {TERM, amode, 0, 0, 0, 0, 1} 384a4e73d5dSJerry Jelinek #define TSvo(name, amode) {TERM, amode, 0, 0, 0, 0, 0, 0, 1} 3857c478bd9Sstevel@tonic-gate #define TS(name, amode) {TERM, amode, 0, 0, 0, 0} 3867c478bd9Sstevel@tonic-gate #define TSx(name, amode) {TERM, amode, 1, 0, 0, 0} 3877c478bd9Sstevel@tonic-gate #define TSy(name, amode) {TERM, amode, 0, 1, 0, 0} 3887c478bd9Sstevel@tonic-gate #define TSp(name, amode) {TERM, amode, 0, 0, 0, 1} 3897c478bd9Sstevel@tonic-gate #define TSZ(name, amode, sz) {TERM, amode, 0, 0, 0, 0} 390d242cdf5SJerry Jelinek #define TSaZ(name, amode, sz) {TERM, amode, 0, 0, 0, 0, 0, AVS2} 391d242cdf5SJerry Jelinek #define TSq(name, amode) {TERM, amode, 0, 0, 0, 0, 0, AVS5Q} 392d242cdf5SJerry Jelinek #define TSd(name, amode) {TERM, amode, 0, 0, 0, 0, 0, AVS5D} 3937c478bd9Sstevel@tonic-gate #define TSZx(name, amode, sz) {TERM, amode, 1, 0, 0, 0} 3947c478bd9Sstevel@tonic-gate #define TSZy(name, amode, sz) {TERM, amode, 0, 1, 0, 0} 3957c478bd9Sstevel@tonic-gate #define INVALID {TERM, UNKNOWN, 0, 0, 0, 0} 3967c478bd9Sstevel@tonic-gate #endif 3977c478bd9Sstevel@tonic-gate 3987c478bd9Sstevel@tonic-gate #ifdef DIS_TEXT 3997c478bd9Sstevel@tonic-gate /* 4007c478bd9Sstevel@tonic-gate * this decodes the r_m field for mode's 0, 1, 2 in 16 bit mode 4017c478bd9Sstevel@tonic-gate */ 4027c478bd9Sstevel@tonic-gate const char *const dis_addr16[3][8] = { 4037c478bd9Sstevel@tonic-gate "(%bx,%si)", "(%bx,%di)", "(%bp,%si)", "(%bp,%di)", "(%si)", "(%di)", "", 4047c478bd9Sstevel@tonic-gate "(%bx)", 4057c478bd9Sstevel@tonic-gate "(%bx,%si)", "(%bx,%di)", "(%bp,%si)", "(%bp,%di)", "(%si)", "(%di", "(%bp)", 4067c478bd9Sstevel@tonic-gate "(%bx)", 4077c478bd9Sstevel@tonic-gate "(%bx,%si)", "(%bx,%di)", "(%bp,%si)", "(%bp,%di)", "(%si)", "(%di)", "(%bp)", 4087c478bd9Sstevel@tonic-gate "(%bx)", 4097c478bd9Sstevel@tonic-gate }; 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate 4127c478bd9Sstevel@tonic-gate /* 4137c478bd9Sstevel@tonic-gate * This decodes 32 bit addressing mode r_m field for modes 0, 1, 2 4147c478bd9Sstevel@tonic-gate */ 4157c478bd9Sstevel@tonic-gate const char *const dis_addr32_mode0[16] = { 4167c478bd9Sstevel@tonic-gate "(%eax)", "(%ecx)", "(%edx)", "(%ebx)", "", "", "(%esi)", "(%edi)", 4177c478bd9Sstevel@tonic-gate "(%r8d)", "(%r9d)", "(%r10d)", "(%r11d)", "", "", "(%r14d)", "(%r15d)" 4187c478bd9Sstevel@tonic-gate }; 4197c478bd9Sstevel@tonic-gate 4207c478bd9Sstevel@tonic-gate const char *const dis_addr32_mode12[16] = { 4217c478bd9Sstevel@tonic-gate "(%eax)", "(%ecx)", "(%edx)", "(%ebx)", "", "(%ebp)", "(%esi)", "(%edi)", 4227c478bd9Sstevel@tonic-gate "(%r8d)", "(%r9d)", "(%r10d)", "(%r11d)", "", "(%r13d)", "(%r14d)", "(%r15d)" 4237c478bd9Sstevel@tonic-gate }; 4247c478bd9Sstevel@tonic-gate 4257c478bd9Sstevel@tonic-gate /* 4267c478bd9Sstevel@tonic-gate * This decodes 64 bit addressing mode r_m field for modes 0, 1, 2 4277c478bd9Sstevel@tonic-gate */ 4287c478bd9Sstevel@tonic-gate const char *const dis_addr64_mode0[16] = { 4297c478bd9Sstevel@tonic-gate "(%rax)", "(%rcx)", "(%rdx)", "(%rbx)", "", "(%rip)", "(%rsi)", "(%rdi)", 4307c478bd9Sstevel@tonic-gate "(%r8)", "(%r9)", "(%r10)", "(%r11)", "(%r12)", "(%rip)", "(%r14)", "(%r15)" 4317c478bd9Sstevel@tonic-gate }; 4327c478bd9Sstevel@tonic-gate const char *const dis_addr64_mode12[16] = { 4337c478bd9Sstevel@tonic-gate "(%rax)", "(%rcx)", "(%rdx)", "(%rbx)", "", "(%rbp)", "(%rsi)", "(%rdi)", 4347c478bd9Sstevel@tonic-gate "(%r8)", "(%r9)", "(%r10)", "(%r11)", "(%r12)", "(%r13)", "(%r14)", "(%r15)" 4357c478bd9Sstevel@tonic-gate }; 4367c478bd9Sstevel@tonic-gate 4377c478bd9Sstevel@tonic-gate /* 4387c478bd9Sstevel@tonic-gate * decode for scale from SIB byte 4397c478bd9Sstevel@tonic-gate */ 4407c478bd9Sstevel@tonic-gate const char *const dis_scale_factor[4] = { ")", ",2)", ",4)", ",8)" }; 4417c478bd9Sstevel@tonic-gate 442245ac945SRobert Mustacchi /* 443245ac945SRobert Mustacchi * decode for scale from VSIB byte, note that we always include the scale factor 444245ac945SRobert Mustacchi * to match gas. 445245ac945SRobert Mustacchi */ 446245ac945SRobert Mustacchi const char *const dis_vscale_factor[4] = { ",1)", ",2)", ",4)", ",8)" }; 447245ac945SRobert Mustacchi 4487c478bd9Sstevel@tonic-gate /* 4497c478bd9Sstevel@tonic-gate * register decoding for normal references to registers (ie. not addressing) 4507c478bd9Sstevel@tonic-gate */ 4517c478bd9Sstevel@tonic-gate const char *const dis_REG8[16] = { 4527c478bd9Sstevel@tonic-gate "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh", 4537c478bd9Sstevel@tonic-gate "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" 4547c478bd9Sstevel@tonic-gate }; 4557c478bd9Sstevel@tonic-gate 4567c478bd9Sstevel@tonic-gate const char *const dis_REG8_REX[16] = { 4577c478bd9Sstevel@tonic-gate "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", 4587c478bd9Sstevel@tonic-gate "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" 4597c478bd9Sstevel@tonic-gate }; 4607c478bd9Sstevel@tonic-gate 4617c478bd9Sstevel@tonic-gate const char *const dis_REG16[16] = { 4627c478bd9Sstevel@tonic-gate "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", 4637c478bd9Sstevel@tonic-gate "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" 4647c478bd9Sstevel@tonic-gate }; 4657c478bd9Sstevel@tonic-gate 4667c478bd9Sstevel@tonic-gate const char *const dis_REG32[16] = { 4677c478bd9Sstevel@tonic-gate "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", 4687c478bd9Sstevel@tonic-gate "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" 4697c478bd9Sstevel@tonic-gate }; 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate const char *const dis_REG64[16] = { 4727c478bd9Sstevel@tonic-gate "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", 4737c478bd9Sstevel@tonic-gate "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" 4747c478bd9Sstevel@tonic-gate }; 4757c478bd9Sstevel@tonic-gate 4767c478bd9Sstevel@tonic-gate const char *const dis_DEBUGREG[16] = { 4777c478bd9Sstevel@tonic-gate "%db0", "%db1", "%db2", "%db3", "%db4", "%db5", "%db6", "%db7", 4787c478bd9Sstevel@tonic-gate "%db8", "%db9", "%db10", "%db11", "%db12", "%db13", "%db14", "%db15" 4797c478bd9Sstevel@tonic-gate }; 4807c478bd9Sstevel@tonic-gate 4817c478bd9Sstevel@tonic-gate const char *const dis_CONTROLREG[16] = { 4827c478bd9Sstevel@tonic-gate "%cr0", "%cr1", "%cr2", "%cr3", "%cr4", "%cr5?", "%cr6?", "%cr7?", 4837c478bd9Sstevel@tonic-gate "%cr8", "%cr9?", "%cr10?", "%cr11?", "%cr12?", "%cr13?", "%cr14?", "%cr15?" 4847c478bd9Sstevel@tonic-gate }; 4857c478bd9Sstevel@tonic-gate 4867c478bd9Sstevel@tonic-gate const char *const dis_TESTREG[16] = { 4877c478bd9Sstevel@tonic-gate "%tr0?", "%tr1?", "%tr2?", "%tr3", "%tr4", "%tr5", "%tr6", "%tr7", 4887c478bd9Sstevel@tonic-gate "%tr0?", "%tr1?", "%tr2?", "%tr3", "%tr4", "%tr5", "%tr6", "%tr7" 4897c478bd9Sstevel@tonic-gate }; 4907c478bd9Sstevel@tonic-gate 4917c478bd9Sstevel@tonic-gate const char *const dis_MMREG[16] = { 4927c478bd9Sstevel@tonic-gate "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7", 4937c478bd9Sstevel@tonic-gate "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" 4947c478bd9Sstevel@tonic-gate }; 4957c478bd9Sstevel@tonic-gate 49681b505b7SJerry Jelinek const char *const dis_XMMREG[32] = { 49781b505b7SJerry Jelinek "%xmm0", "%xmm1", "%xmm2", "%xmm3", 49881b505b7SJerry Jelinek "%xmm4", "%xmm5", "%xmm6", "%xmm7", 49981b505b7SJerry Jelinek "%xmm8", "%xmm9", "%xmm10", "%xmm11", 50081b505b7SJerry Jelinek "%xmm12", "%xmm13", "%xmm14", "%xmm15", 50181b505b7SJerry Jelinek "%xmm16", "%xmm17", "%xmm18", "%xmm19", 50281b505b7SJerry Jelinek "%xmm20", "%xmm21", "%xmm22", "%xmm23", 50381b505b7SJerry Jelinek "%xmm24", "%xmm25", "%xmm26", "%xmm27", 50481b505b7SJerry Jelinek "%xmm28", "%xmm29", "%xmm30", "%xmm31", 5057c478bd9Sstevel@tonic-gate }; 5067c478bd9Sstevel@tonic-gate 50781b505b7SJerry Jelinek const char *const dis_YMMREG[32] = { 50881b505b7SJerry Jelinek "%ymm0", "%ymm1", "%ymm2", "%ymm3", 50981b505b7SJerry Jelinek "%ymm4", "%ymm5", "%ymm6", "%ymm7", 51081b505b7SJerry Jelinek "%ymm8", "%ymm9", "%ymm10", "%ymm11", 51181b505b7SJerry Jelinek "%ymm12", "%ymm13", "%ymm14", "%ymm15", 51281b505b7SJerry Jelinek "%ymm16", "%ymm17", "%ymm18", "%ymm19", 51381b505b7SJerry Jelinek "%ymm20", "%ymm21", "%ymm22", "%ymm23", 51481b505b7SJerry Jelinek "%ymm24", "%ymm25", "%ymm26", "%ymm27", 51581b505b7SJerry Jelinek "%ymm28", "%ymm29", "%ymm30", "%ymm31", 51681b505b7SJerry Jelinek }; 51781b505b7SJerry Jelinek 51881b505b7SJerry Jelinek const char *const dis_ZMMREG[32] = { 51981b505b7SJerry Jelinek "%zmm0", "%zmm1", "%zmm2", "%zmm3", 52081b505b7SJerry Jelinek "%zmm4", "%zmm5", "%zmm6", "%zmm7", 52181b505b7SJerry Jelinek "%zmm8", "%zmm9", "%zmm10", "%zmm11", 52281b505b7SJerry Jelinek "%zmm12", "%zmm13", "%zmm14", "%zmm15", 52381b505b7SJerry Jelinek "%zmm16", "%zmm17", "%zmm18", "%zmm19", 52481b505b7SJerry Jelinek "%zmm20", "%zmm21", "%zmm22", "%zmm23", 52581b505b7SJerry Jelinek "%zmm24", "%zmm25", "%zmm26", "%zmm27", 52681b505b7SJerry Jelinek "%zmm28", "%zmm29", "%zmm30", "%zmm31", 527ab47273fSEdward Gillett }; 528ab47273fSEdward Gillett 529a4e73d5dSJerry Jelinek const char *const dis_KOPMASKREG[8] = { 530a4e73d5dSJerry Jelinek "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7" 531a4e73d5dSJerry Jelinek }; 532a4e73d5dSJerry Jelinek 5337c478bd9Sstevel@tonic-gate const char *const dis_SEGREG[16] = { 5347c478bd9Sstevel@tonic-gate "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "<reserved>", "<reserved>", 5357c478bd9Sstevel@tonic-gate "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "<reserved>", "<reserved>" 5367c478bd9Sstevel@tonic-gate }; 5377c478bd9Sstevel@tonic-gate 5387c478bd9Sstevel@tonic-gate /* 5397c478bd9Sstevel@tonic-gate * SIMD predicate suffixes 5407c478bd9Sstevel@tonic-gate */ 5417c478bd9Sstevel@tonic-gate const char *const dis_PREDSUFFIX[8] = { 5427c478bd9Sstevel@tonic-gate "eq", "lt", "le", "unord", "neq", "nlt", "nle", "ord" 5437c478bd9Sstevel@tonic-gate }; 5447c478bd9Sstevel@tonic-gate 545ab47273fSEdward Gillett const char *const dis_AVXvgrp7[3][8] = { 546ab47273fSEdward Gillett /*0 1 2 3 4 5 6 7*/ 547ab47273fSEdward Gillett /*71*/ {"", "", "vpsrlw", "", "vpsraw", "", "vpsllw", ""}, 548ab47273fSEdward Gillett /*72*/ {"", "", "vpsrld", "", "vpsrad", "", "vpslld", ""}, 549ab47273fSEdward Gillett /*73*/ {"", "", "vpsrlq", "vpsrldq", "", "", "vpsllq", "vpslldq"} 550ab47273fSEdward Gillett }; 5517c478bd9Sstevel@tonic-gate 5527c478bd9Sstevel@tonic-gate #endif /* DIS_TEXT */ 5537c478bd9Sstevel@tonic-gate 5547c478bd9Sstevel@tonic-gate /* 5557c478bd9Sstevel@tonic-gate * "decode table" for 64 bit mode MOVSXD instruction (opcode 0x63) 5567c478bd9Sstevel@tonic-gate */ 5577c478bd9Sstevel@tonic-gate const instable_t dis_opMOVSLD = TNS("movslq",MOVSXZ); 5587c478bd9Sstevel@tonic-gate 5597c478bd9Sstevel@tonic-gate /* 5607c478bd9Sstevel@tonic-gate * "decode table" for pause and clflush instructions 5617c478bd9Sstevel@tonic-gate */ 5627c478bd9Sstevel@tonic-gate const instable_t dis_opPause = TNS("pause", NORM); 5637c478bd9Sstevel@tonic-gate 564c1e9bf00SRobert Mustacchi /* 565c1e9bf00SRobert Mustacchi * "decode table" for wbnoinvd instruction 566c1e9bf00SRobert Mustacchi */ 567c1e9bf00SRobert Mustacchi const instable_t dis_opWbnoinvd = TNS("wbnoinvd", NORM); 568c1e9bf00SRobert Mustacchi 5697c478bd9Sstevel@tonic-gate /* 5707c478bd9Sstevel@tonic-gate * Decode table for 0x0F00 opcodes 5717c478bd9Sstevel@tonic-gate */ 5727c478bd9Sstevel@tonic-gate const instable_t dis_op0F00[8] = { 5737c478bd9Sstevel@tonic-gate 574cff040f3SRobert Mustacchi /* [0] */ TNS("sldt",M), TNS("str",M), TNSy("lldt",M), TNSy("ltr",M), 5757c478bd9Sstevel@tonic-gate /* [4] */ TNSZ("verr",M,2), TNSZ("verw",M,2), INVALID, INVALID, 5767c478bd9Sstevel@tonic-gate }; 5777c478bd9Sstevel@tonic-gate 5787c478bd9Sstevel@tonic-gate 5797c478bd9Sstevel@tonic-gate /* 5807c478bd9Sstevel@tonic-gate * Decode table for 0x0F01 opcodes 5817c478bd9Sstevel@tonic-gate */ 5827c478bd9Sstevel@tonic-gate const instable_t dis_op0F01[8] = { 5837c478bd9Sstevel@tonic-gate 58470dc7639SRichard Lowe /* [0] */ TNSZ("sgdt",VMx,6), TNSZ("sidt",MONITOR_MWAIT,6), TNSZ("lgdt",XGETBV_XSETBV,6), TNSZ("lidt",SVM,6), 585cff040f3SRobert Mustacchi /* [4] */ TNSZ("smsw",M,2), INVALID, TNSZ("lmsw",M,2), TNS("invlpg",SWAPGS_RDTSCP), 5867c478bd9Sstevel@tonic-gate }; 5877c478bd9Sstevel@tonic-gate 5887c478bd9Sstevel@tonic-gate /* 5897c478bd9Sstevel@tonic-gate * Decode table for 0x0F18 opcodes -- SIMD prefetch 5907c478bd9Sstevel@tonic-gate */ 5917c478bd9Sstevel@tonic-gate const instable_t dis_op0F18[8] = { 5927c478bd9Sstevel@tonic-gate 5937c478bd9Sstevel@tonic-gate /* [0] */ TNS("prefetchnta",PREF),TNS("prefetcht0",PREF), TNS("prefetcht1",PREF), TNS("prefetcht2",PREF), 5947c478bd9Sstevel@tonic-gate /* [4] */ INVALID, INVALID, INVALID, INVALID, 5957c478bd9Sstevel@tonic-gate }; 5967c478bd9Sstevel@tonic-gate 5977c478bd9Sstevel@tonic-gate /* 598cff040f3SRobert Mustacchi * Decode table for 0x0FAE opcodes -- SIMD state save/restore 5997c478bd9Sstevel@tonic-gate */ 6007c478bd9Sstevel@tonic-gate const instable_t dis_op0FAE[8] = { 601cff040f3SRobert Mustacchi /* [0] */ TNSZ("fxsave",FSGS,512),TNSZ("fxrstor",FSGS,512),TNS("ldmxcsr",FSGS), TNS("stmxcsr",FSGS), 602ab47273fSEdward Gillett /* [4] */ TNSZ("xsave",M,512), TNS("lfence",XMMFENCE), TNS("mfence",XMMFENCE), TNS("sfence",XMMSFNC), 6037c478bd9Sstevel@tonic-gate }; 6047c478bd9Sstevel@tonic-gate 605cff040f3SRobert Mustacchi /* 606cff040f3SRobert Mustacchi * Decode table for 0xF30FAE opcodes -- FSGSBASE 607cff040f3SRobert Mustacchi */ 608cff040f3SRobert Mustacchi const instable_t dis_opF30FAE[8] = { 609cff040f3SRobert Mustacchi /* [0] */ TNSx("rdfsbase",FSGS), TNSx("rdgsbase",FSGS), TNSx("wrfsbase",FSGS), TNSx("wrgsbase",FSGS), 610cff040f3SRobert Mustacchi /* [4] */ INVALID, INVALID, INVALID, INVALID, 611cff040f3SRobert Mustacchi }; 612cff040f3SRobert Mustacchi 6137c478bd9Sstevel@tonic-gate /* 6147c478bd9Sstevel@tonic-gate * Decode table for 0x0FBA opcodes 6157c478bd9Sstevel@tonic-gate */ 6167c478bd9Sstevel@tonic-gate 6177c478bd9Sstevel@tonic-gate const instable_t dis_op0FBA[8] = { 6187c478bd9Sstevel@tonic-gate 6197c478bd9Sstevel@tonic-gate /* [0] */ INVALID, INVALID, INVALID, INVALID, 6207c478bd9Sstevel@tonic-gate /* [4] */ TS("bt",MIb), TS("bts",MIb), TS("btr",MIb), TS("btc",MIb), 6217c478bd9Sstevel@tonic-gate }; 6227c478bd9Sstevel@tonic-gate 6237c478bd9Sstevel@tonic-gate /* 624cff040f3SRobert Mustacchi * Decode table for 0x0FC7 opcode (group 9) 6257c478bd9Sstevel@tonic-gate */ 6267c478bd9Sstevel@tonic-gate 6277c478bd9Sstevel@tonic-gate const instable_t dis_op0FC7[8] = { 6287c478bd9Sstevel@tonic-gate 62992381362SJerry Jelinek /* [0] */ INVALID, TNS("cmpxchg8b",M), INVALID, TNS("xrstors",MG9), 63092381362SJerry Jelinek /* [4] */ TNS("xsavec",MG9), TNS("xsaves",MG9), TNS("vmptrld",MG9), TNS("vmptrst",MG9), 6317c478bd9Sstevel@tonic-gate }; 6327c478bd9Sstevel@tonic-gate 633ebb8ac07SRobert Mustacchi /* 634cff040f3SRobert Mustacchi * Decode table for 0x0FC7 opcode (group 9) mode 3 635ebb8ac07SRobert Mustacchi */ 636ebb8ac07SRobert Mustacchi 637ebb8ac07SRobert Mustacchi const instable_t dis_op0FC7m3[8] = { 638ebb8ac07SRobert Mustacchi 639ebb8ac07SRobert Mustacchi /* [0] */ INVALID, INVALID, INVALID, INVALID, 6408889c875SRobert Mustacchi /* [4] */ INVALID, INVALID, TNS("rdrand",MG9), TNS("rdseed", MG9), 641ebb8ac07SRobert Mustacchi }; 642ebb8ac07SRobert Mustacchi 6437aa76ffcSBryan Cantrill /* 644cff040f3SRobert Mustacchi * Decode table for 0x0FC7 opcode with 0x66 prefix 6457aa76ffcSBryan Cantrill */ 6467aa76ffcSBryan Cantrill 6477aa76ffcSBryan Cantrill const instable_t dis_op660FC7[8] = { 6487aa76ffcSBryan Cantrill 6497aa76ffcSBryan Cantrill /* [0] */ INVALID, INVALID, INVALID, INVALID, 6507aa76ffcSBryan Cantrill /* [4] */ INVALID, INVALID, TNS("vmclear",M), INVALID, 6517aa76ffcSBryan Cantrill }; 6527aa76ffcSBryan Cantrill 6537aa76ffcSBryan Cantrill /* 654cff040f3SRobert Mustacchi * Decode table for 0x0FC7 opcode with 0xF3 prefix 6557aa76ffcSBryan Cantrill */ 6567aa76ffcSBryan Cantrill 6577aa76ffcSBryan Cantrill const instable_t dis_opF30FC7[8] = { 6587aa76ffcSBryan Cantrill 6597aa76ffcSBryan Cantrill /* [0] */ INVALID, INVALID, INVALID, INVALID, 6607aa76ffcSBryan Cantrill /* [4] */ INVALID, INVALID, TNS("vmxon",M), INVALID, 6617aa76ffcSBryan Cantrill }; 6627c478bd9Sstevel@tonic-gate 6637c478bd9Sstevel@tonic-gate /* 6647c478bd9Sstevel@tonic-gate * Decode table for 0x0FC8 opcode -- 486 bswap instruction 6657c478bd9Sstevel@tonic-gate * 6667c478bd9Sstevel@tonic-gate *bit pattern: 0000 1111 1100 1reg 6677c478bd9Sstevel@tonic-gate */ 6687c478bd9Sstevel@tonic-gate const instable_t dis_op0FC8[4] = { 6697c478bd9Sstevel@tonic-gate /* [0] */ TNS("bswap",R), INVALID, INVALID, INVALID, 6707c478bd9Sstevel@tonic-gate }; 6717c478bd9Sstevel@tonic-gate 6727c478bd9Sstevel@tonic-gate /* 6737c478bd9Sstevel@tonic-gate * Decode table for 0x0F71, 0x0F72, and 0x0F73 opcodes -- MMX instructions 6747c478bd9Sstevel@tonic-gate */ 6757c478bd9Sstevel@tonic-gate const instable_t dis_op0F7123[4][8] = { 6767c478bd9Sstevel@tonic-gate { 6777c478bd9Sstevel@tonic-gate /* [70].0 */ INVALID, INVALID, INVALID, INVALID, 6787c478bd9Sstevel@tonic-gate /* .4 */ INVALID, INVALID, INVALID, INVALID, 6797c478bd9Sstevel@tonic-gate }, { 6807c478bd9Sstevel@tonic-gate /* [71].0 */ INVALID, INVALID, TNS("psrlw",MMOSH), INVALID, 6817c478bd9Sstevel@tonic-gate /* .4 */ TNS("psraw",MMOSH), INVALID, TNS("psllw",MMOSH), INVALID, 6827c478bd9Sstevel@tonic-gate }, { 6837c478bd9Sstevel@tonic-gate /* [72].0 */ INVALID, INVALID, TNS("psrld",MMOSH), INVALID, 6847c478bd9Sstevel@tonic-gate /* .4 */ TNS("psrad",MMOSH), INVALID, TNS("pslld",MMOSH), INVALID, 6857c478bd9Sstevel@tonic-gate }, { 6867c478bd9Sstevel@tonic-gate /* [73].0 */ INVALID, INVALID, TNS("psrlq",MMOSH), TNS("INVALID",MMOSH), 687cff040f3SRobert Mustacchi /* .4 */ INVALID, INVALID, TNS("psllq",MMOSH), TNS("INVALID",MMOSH), 6887c478bd9Sstevel@tonic-gate } }; 6897c478bd9Sstevel@tonic-gate 6907c478bd9Sstevel@tonic-gate /* 6917c478bd9Sstevel@tonic-gate * Decode table for SIMD extensions to above 0x0F71-0x0F73 opcodes. 6927c478bd9Sstevel@tonic-gate */ 6937c478bd9Sstevel@tonic-gate const instable_t dis_opSIMD7123[32] = { 6947c478bd9Sstevel@tonic-gate /* [70].0 */ INVALID, INVALID, INVALID, INVALID, 6957c478bd9Sstevel@tonic-gate /* .4 */ INVALID, INVALID, INVALID, INVALID, 6967c478bd9Sstevel@tonic-gate 6977c478bd9Sstevel@tonic-gate /* [71].0 */ INVALID, INVALID, TNS("psrlw",XMMSH), INVALID, 6987c478bd9Sstevel@tonic-gate /* .4 */ TNS("psraw",XMMSH), INVALID, TNS("psllw",XMMSH), INVALID, 6997c478bd9Sstevel@tonic-gate 7007c478bd9Sstevel@tonic-gate /* [72].0 */ INVALID, INVALID, TNS("psrld",XMMSH), INVALID, 7017c478bd9Sstevel@tonic-gate /* .4 */ TNS("psrad",XMMSH), INVALID, TNS("pslld",XMMSH), INVALID, 7027c478bd9Sstevel@tonic-gate 7037c478bd9Sstevel@tonic-gate /* [73].0 */ INVALID, INVALID, TNS("psrlq",XMMSH), TNS("psrldq",XMMSH), 7047c478bd9Sstevel@tonic-gate /* .4 */ INVALID, INVALID, TNS("psllq",XMMSH), TNS("pslldq",XMMSH), 7057c478bd9Sstevel@tonic-gate }; 7067c478bd9Sstevel@tonic-gate 7077c478bd9Sstevel@tonic-gate /* 7087c478bd9Sstevel@tonic-gate * SIMD instructions have been wedged into the existing IA32 instruction 7097c478bd9Sstevel@tonic-gate * set through the use of prefixes. That is, while 0xf0 0x58 may be 7107c478bd9Sstevel@tonic-gate * addps, 0xf3 0xf0 0x58 (literally, repz addps) is a completely different 7117c478bd9Sstevel@tonic-gate * instruction - addss. At present, three prefixes have been coopted in 7127c478bd9Sstevel@tonic-gate * this manner - address size (0x66), repnz (0xf2) and repz (0xf3). The 7137c478bd9Sstevel@tonic-gate * following tables are used to provide the prefixed instruction names. 7147c478bd9Sstevel@tonic-gate * The arrays are sparse, but they're fast. 7157c478bd9Sstevel@tonic-gate */ 7167c478bd9Sstevel@tonic-gate 7177c478bd9Sstevel@tonic-gate /* 7187c478bd9Sstevel@tonic-gate * Decode table for SIMD instructions with the address size (0x66) prefix. 7197c478bd9Sstevel@tonic-gate */ 7207c478bd9Sstevel@tonic-gate const instable_t dis_opSIMDdata16[256] = { 7217c478bd9Sstevel@tonic-gate /* [00] */ INVALID, INVALID, INVALID, INVALID, 7227c478bd9Sstevel@tonic-gate /* [04] */ INVALID, INVALID, INVALID, INVALID, 7237c478bd9Sstevel@tonic-gate /* [08] */ INVALID, INVALID, INVALID, INVALID, 7247c478bd9Sstevel@tonic-gate /* [0C] */ INVALID, INVALID, INVALID, INVALID, 7257c478bd9Sstevel@tonic-gate 7267c478bd9Sstevel@tonic-gate /* [10] */ TNSZ("movupd",XMM,16), TNSZ("movupd",XMMS,16), TNSZ("movlpd",XMMM,8), TNSZ("movlpd",XMMMS,8), 7277c478bd9Sstevel@tonic-gate /* [14] */ TNSZ("unpcklpd",XMM,16),TNSZ("unpckhpd",XMM,16),TNSZ("movhpd",XMMM,8), TNSZ("movhpd",XMMMS,8), 7287c478bd9Sstevel@tonic-gate /* [18] */ INVALID, INVALID, INVALID, INVALID, 7297c478bd9Sstevel@tonic-gate /* [1C] */ INVALID, INVALID, INVALID, INVALID, 7307c478bd9Sstevel@tonic-gate 7317c478bd9Sstevel@tonic-gate /* [20] */ INVALID, INVALID, INVALID, INVALID, 7327c478bd9Sstevel@tonic-gate /* [24] */ INVALID, INVALID, INVALID, INVALID, 7337c478bd9Sstevel@tonic-gate /* [28] */ TNSZ("movapd",XMM,16), TNSZ("movapd",XMMS,16), TNSZ("cvtpi2pd",XMMOMX,8),TNSZ("movntpd",XMMOMS,16), 7347c478bd9Sstevel@tonic-gate /* [2C] */ TNSZ("cvttpd2pi",XMMXMM,16),TNSZ("cvtpd2pi",XMMXMM,16),TNSZ("ucomisd",XMM,8),TNSZ("comisd",XMM,8), 7357c478bd9Sstevel@tonic-gate 7367c478bd9Sstevel@tonic-gate /* [30] */ INVALID, INVALID, INVALID, INVALID, 7377c478bd9Sstevel@tonic-gate /* [34] */ INVALID, INVALID, INVALID, INVALID, 7387c478bd9Sstevel@tonic-gate /* [38] */ INVALID, INVALID, INVALID, INVALID, 7397c478bd9Sstevel@tonic-gate /* [3C] */ INVALID, INVALID, INVALID, INVALID, 7407c478bd9Sstevel@tonic-gate 7417c478bd9Sstevel@tonic-gate /* [40] */ INVALID, INVALID, INVALID, INVALID, 7427c478bd9Sstevel@tonic-gate /* [44] */ INVALID, INVALID, INVALID, INVALID, 7437c478bd9Sstevel@tonic-gate /* [48] */ INVALID, INVALID, INVALID, INVALID, 7447c478bd9Sstevel@tonic-gate /* [4C] */ INVALID, INVALID, INVALID, INVALID, 7457c478bd9Sstevel@tonic-gate 7467c478bd9Sstevel@tonic-gate /* [50] */ TNS("movmskpd",XMMOX3), TNSZ("sqrtpd",XMM,16), INVALID, INVALID, 7477c478bd9Sstevel@tonic-gate /* [54] */ TNSZ("andpd",XMM,16), TNSZ("andnpd",XMM,16), TNSZ("orpd",XMM,16), TNSZ("xorpd",XMM,16), 7487c478bd9Sstevel@tonic-gate /* [58] */ TNSZ("addpd",XMM,16), TNSZ("mulpd",XMM,16), TNSZ("cvtpd2ps",XMM,16),TNSZ("cvtps2dq",XMM,16), 7497c478bd9Sstevel@tonic-gate /* [5C] */ TNSZ("subpd",XMM,16), TNSZ("minpd",XMM,16), TNSZ("divpd",XMM,16), TNSZ("maxpd",XMM,16), 7507c478bd9Sstevel@tonic-gate 7517c478bd9Sstevel@tonic-gate /* [60] */ TNSZ("punpcklbw",XMM,16),TNSZ("punpcklwd",XMM,16),TNSZ("punpckldq",XMM,16),TNSZ("packsswb",XMM,16), 7527c478bd9Sstevel@tonic-gate /* [64] */ TNSZ("pcmpgtb",XMM,16), TNSZ("pcmpgtw",XMM,16), TNSZ("pcmpgtd",XMM,16), TNSZ("packuswb",XMM,16), 7537c478bd9Sstevel@tonic-gate /* [68] */ TNSZ("punpckhbw",XMM,16),TNSZ("punpckhwd",XMM,16),TNSZ("punpckhdq",XMM,16),TNSZ("packssdw",XMM,16), 7547c478bd9Sstevel@tonic-gate /* [6C] */ TNSZ("punpcklqdq",XMM,16),TNSZ("punpckhqdq",XMM,16),TNSZ("movd",XMM3MX,4),TNSZ("movdqa",XMM,16), 7557c478bd9Sstevel@tonic-gate 7567c478bd9Sstevel@tonic-gate /* [70] */ TNSZ("pshufd",XMMP,16), INVALID, INVALID, INVALID, 7577c478bd9Sstevel@tonic-gate /* [74] */ TNSZ("pcmpeqb",XMM,16), TNSZ("pcmpeqw",XMM,16), TNSZ("pcmpeqd",XMM,16), INVALID, 758f8801251Skk /* [78] */ TNSZ("extrq",XMM2I,16), TNSZ("extrq",XMM,16), INVALID, INVALID, 759d4c899eeSRobert Mustacchi /* [7C] */ TNSZ("haddpd",XMM,16), TNSZ("hsubpd",XMM,16), TNSZ("movd",XMM3MXS,4), TNSZ("movdqa",XMMS,16), 7607c478bd9Sstevel@tonic-gate 7617c478bd9Sstevel@tonic-gate /* [80] */ INVALID, INVALID, INVALID, INVALID, 7627c478bd9Sstevel@tonic-gate /* [84] */ INVALID, INVALID, INVALID, INVALID, 7637c478bd9Sstevel@tonic-gate /* [88] */ INVALID, INVALID, INVALID, INVALID, 7647c478bd9Sstevel@tonic-gate /* [8C] */ INVALID, INVALID, INVALID, INVALID, 7657c478bd9Sstevel@tonic-gate 7667c478bd9Sstevel@tonic-gate /* [90] */ INVALID, INVALID, INVALID, INVALID, 7677c478bd9Sstevel@tonic-gate /* [94] */ INVALID, INVALID, INVALID, INVALID, 7687c478bd9Sstevel@tonic-gate /* [98] */ INVALID, INVALID, INVALID, INVALID, 7697c478bd9Sstevel@tonic-gate /* [9C] */ INVALID, INVALID, INVALID, INVALID, 7707c478bd9Sstevel@tonic-gate 7717c478bd9Sstevel@tonic-gate /* [A0] */ INVALID, INVALID, INVALID, INVALID, 7727c478bd9Sstevel@tonic-gate /* [A4] */ INVALID, INVALID, INVALID, INVALID, 7737c478bd9Sstevel@tonic-gate /* [A8] */ INVALID, INVALID, INVALID, INVALID, 7747c478bd9Sstevel@tonic-gate /* [AC] */ INVALID, INVALID, INVALID, INVALID, 7757c478bd9Sstevel@tonic-gate 7767c478bd9Sstevel@tonic-gate /* [B0] */ INVALID, INVALID, INVALID, INVALID, 7777c478bd9Sstevel@tonic-gate /* [B4] */ INVALID, INVALID, INVALID, INVALID, 7787c478bd9Sstevel@tonic-gate /* [B8] */ INVALID, INVALID, INVALID, INVALID, 7797c478bd9Sstevel@tonic-gate /* [BC] */ INVALID, INVALID, INVALID, INVALID, 7807c478bd9Sstevel@tonic-gate 7817c478bd9Sstevel@tonic-gate /* [C0] */ INVALID, INVALID, TNSZ("cmppd",XMMP,16), INVALID, 7827c478bd9Sstevel@tonic-gate /* [C4] */ TNSZ("pinsrw",XMMPRM,2),TNS("pextrw",XMM3P), TNSZ("shufpd",XMMP,16), INVALID, 7837c478bd9Sstevel@tonic-gate /* [C8] */ INVALID, INVALID, INVALID, INVALID, 7847c478bd9Sstevel@tonic-gate /* [CC] */ INVALID, INVALID, INVALID, INVALID, 7857c478bd9Sstevel@tonic-gate 786d4c899eeSRobert Mustacchi /* [D0] */ TNSZ("addsubpd",XMM,16),TNSZ("psrlw",XMM,16), TNSZ("psrld",XMM,16), TNSZ("psrlq",XMM,16), 7877c478bd9Sstevel@tonic-gate /* [D4] */ TNSZ("paddq",XMM,16), TNSZ("pmullw",XMM,16), TNSZ("movq",XMMS,8), TNS("pmovmskb",XMMX3), 7887c478bd9Sstevel@tonic-gate /* [D8] */ TNSZ("psubusb",XMM,16), TNSZ("psubusw",XMM,16), TNSZ("pminub",XMM,16), TNSZ("pand",XMM,16), 7897c478bd9Sstevel@tonic-gate /* [DC] */ TNSZ("paddusb",XMM,16), TNSZ("paddusw",XMM,16), TNSZ("pmaxub",XMM,16), TNSZ("pandn",XMM,16), 7907c478bd9Sstevel@tonic-gate 7917c478bd9Sstevel@tonic-gate /* [E0] */ TNSZ("pavgb",XMM,16), TNSZ("psraw",XMM,16), TNSZ("psrad",XMM,16), TNSZ("pavgw",XMM,16), 7927c478bd9Sstevel@tonic-gate /* [E4] */ TNSZ("pmulhuw",XMM,16), TNSZ("pmulhw",XMM,16), TNSZ("cvttpd2dq",XMM,16),TNSZ("movntdq",XMMS,16), 7937c478bd9Sstevel@tonic-gate /* [E8] */ TNSZ("psubsb",XMM,16), TNSZ("psubsw",XMM,16), TNSZ("pminsw",XMM,16), TNSZ("por",XMM,16), 7947c478bd9Sstevel@tonic-gate /* [EC] */ TNSZ("paddsb",XMM,16), TNSZ("paddsw",XMM,16), TNSZ("pmaxsw",XMM,16), TNSZ("pxor",XMM,16), 7957c478bd9Sstevel@tonic-gate 7967c478bd9Sstevel@tonic-gate /* [F0] */ INVALID, TNSZ("psllw",XMM,16), TNSZ("pslld",XMM,16), TNSZ("psllq",XMM,16), 7977c478bd9Sstevel@tonic-gate /* [F4] */ TNSZ("pmuludq",XMM,16), TNSZ("pmaddwd",XMM,16), TNSZ("psadbw",XMM,16), TNSZ("maskmovdqu", XMMXIMPL,16), 7987c478bd9Sstevel@tonic-gate /* [F8] */ TNSZ("psubb",XMM,16), TNSZ("psubw",XMM,16), TNSZ("psubd",XMM,16), TNSZ("psubq",XMM,16), 7997c478bd9Sstevel@tonic-gate /* [FC] */ TNSZ("paddb",XMM,16), TNSZ("paddw",XMM,16), TNSZ("paddd",XMM,16), INVALID, 8007c478bd9Sstevel@tonic-gate }; 8017c478bd9Sstevel@tonic-gate 802ab47273fSEdward Gillett const instable_t dis_opAVX660F[256] = { 803ab47273fSEdward Gillett /* [00] */ INVALID, INVALID, INVALID, INVALID, 804ab47273fSEdward Gillett /* [04] */ INVALID, INVALID, INVALID, INVALID, 805ab47273fSEdward Gillett /* [08] */ INVALID, INVALID, INVALID, INVALID, 806ab47273fSEdward Gillett /* [0C] */ INVALID, INVALID, INVALID, INVALID, 807ab47273fSEdward Gillett 808ab47273fSEdward Gillett /* [10] */ TNSZ("vmovupd",VEX_MX,16), TNSZ("vmovupd",VEX_RX,16), TNSZ("vmovlpd",VEX_RMrX,8), TNSZ("vmovlpd",VEX_RM,8), 809ab47273fSEdward Gillett /* [14] */ TNSZ("vunpcklpd",VEX_RMrX,16),TNSZ("vunpckhpd",VEX_RMrX,16),TNSZ("vmovhpd",VEX_RMrX,8), TNSZ("vmovhpd",VEX_RM,8), 810ab47273fSEdward Gillett /* [18] */ INVALID, INVALID, INVALID, INVALID, 811ab47273fSEdward Gillett /* [1C] */ INVALID, INVALID, INVALID, INVALID, 812ab47273fSEdward Gillett 813ab47273fSEdward Gillett /* [20] */ INVALID, INVALID, INVALID, INVALID, 814ab47273fSEdward Gillett /* [24] */ INVALID, INVALID, INVALID, INVALID, 815ab47273fSEdward Gillett /* [28] */ TNSZ("vmovapd",VEX_MX,16), TNSZ("vmovapd",VEX_RX,16), INVALID, TNSZ("vmovntpd",VEX_RM,16), 816ab47273fSEdward Gillett /* [2C] */ INVALID, INVALID, TNSZ("vucomisd",VEX_MX,8),TNSZ("vcomisd",VEX_MX,8), 817ab47273fSEdward Gillett 818ab47273fSEdward Gillett /* [30] */ INVALID, INVALID, INVALID, INVALID, 819ab47273fSEdward Gillett /* [34] */ INVALID, INVALID, INVALID, INVALID, 820ab47273fSEdward Gillett /* [38] */ INVALID, INVALID, INVALID, INVALID, 821ab47273fSEdward Gillett /* [3C] */ INVALID, INVALID, INVALID, INVALID, 822ab47273fSEdward Gillett 823a4e73d5dSJerry Jelinek /* [40] */ INVALID, TSvo("kand",VEX_RMX), TSvo("kandn",VEX_RMX), INVALID, 824a4e73d5dSJerry Jelinek /* [44] */ TSvo("knot",VEX_MX), TSvo("kor",VEX_RMX), TSvo("kxnor",VEX_RMX), TSvo("kxor",VEX_RMX), 825a4e73d5dSJerry Jelinek /* [48] */ INVALID, INVALID, TSvo("kadd",VEX_RMX), TSvo("kunpck",VEX_RMX), 826ab47273fSEdward Gillett /* [4C] */ INVALID, INVALID, INVALID, INVALID, 827ab47273fSEdward Gillett 828ab47273fSEdward Gillett /* [50] */ TNS("vmovmskpd",VEX_MR), TNSZ("vsqrtpd",VEX_MX,16), INVALID, INVALID, 829ab47273fSEdward Gillett /* [54] */ TNSZ("vandpd",VEX_RMrX,16), TNSZ("vandnpd",VEX_RMrX,16), TNSZ("vorpd",VEX_RMrX,16), TNSZ("vxorpd",VEX_RMrX,16), 830ab47273fSEdward Gillett /* [58] */ TNSZ("vaddpd",VEX_RMrX,16), TNSZ("vmulpd",VEX_RMrX,16), TNSZ("vcvtpd2ps",VEX_MX,16),TNSZ("vcvtps2dq",VEX_MX,16), 831ab47273fSEdward Gillett /* [5C] */ TNSZ("vsubpd",VEX_RMrX,16), TNSZ("vminpd",VEX_RMrX,16), TNSZ("vdivpd",VEX_RMrX,16), TNSZ("vmaxpd",VEX_RMrX,16), 832ab47273fSEdward Gillett 833ab47273fSEdward Gillett /* [60] */ TNSZ("vpunpcklbw",VEX_RMrX,16),TNSZ("vpunpcklwd",VEX_RMrX,16),TNSZ("vpunpckldq",VEX_RMrX,16),TNSZ("vpacksswb",VEX_RMrX,16), 834ab47273fSEdward Gillett /* [64] */ TNSZ("vpcmpgtb",VEX_RMrX,16), TNSZ("vpcmpgtw",VEX_RMrX,16), TNSZ("vpcmpgtd",VEX_RMrX,16), TNSZ("vpackuswb",VEX_RMrX,16), 835ab47273fSEdward Gillett /* [68] */ TNSZ("vpunpckhbw",VEX_RMrX,16),TNSZ("vpunpckhwd",VEX_RMrX,16),TNSZ("vpunpckhdq",VEX_RMrX,16),TNSZ("vpackssdw",VEX_RMrX,16), 836ab47273fSEdward Gillett /* [6C] */ TNSZ("vpunpcklqdq",VEX_RMrX,16),TNSZ("vpunpckhqdq",VEX_RMrX,16),TNSZ("vmovd",VEX_MX,4),TNSZ("vmovdqa",VEX_MX,16), 837ab47273fSEdward Gillett 838ab47273fSEdward Gillett /* [70] */ TNSZ("vpshufd",VEX_MXI,16), TNSZ("vgrp71",VEX_XXI,16), TNSZ("vgrp72",VEX_XXI,16), TNSZ("vgrp73",VEX_XXI,16), 839ab47273fSEdward Gillett /* [74] */ TNSZ("vpcmpeqb",VEX_RMrX,16), TNSZ("vpcmpeqw",VEX_RMrX,16), TNSZ("vpcmpeqd",VEX_RMrX,16), INVALID, 840ab47273fSEdward Gillett /* [78] */ INVALID, INVALID, INVALID, INVALID, 841ab47273fSEdward Gillett /* [7C] */ TNSZ("vhaddpd",VEX_RMrX,16), TNSZ("vhsubpd",VEX_RMrX,16), TNSZ("vmovd",VEX_RR,4), TNSZ("vmovdqa",VEX_RX,16), 842ab47273fSEdward Gillett 843ab47273fSEdward Gillett /* [80] */ INVALID, INVALID, INVALID, INVALID, 844ab47273fSEdward Gillett /* [84] */ INVALID, INVALID, INVALID, INVALID, 845ab47273fSEdward Gillett /* [88] */ INVALID, INVALID, INVALID, INVALID, 846ab47273fSEdward Gillett /* [8C] */ INVALID, INVALID, INVALID, INVALID, 847ab47273fSEdward Gillett 848a4e73d5dSJerry Jelinek /* [90] */ TSvo("kmov",VEX_KRM), TSvo("kmov",VEX_KMR), TSvo("kmov",VEX_KRR), TSvo("kmov",VEX_MR), 849ab47273fSEdward Gillett /* [94] */ INVALID, INVALID, INVALID, INVALID, 850a4e73d5dSJerry Jelinek /* [98] */ TSvo("kortest",VEX_MX), TSvo("ktest",VEX_MX), INVALID, INVALID, 851ab47273fSEdward Gillett /* [9C] */ INVALID, INVALID, INVALID, INVALID, 852ab47273fSEdward Gillett 853ab47273fSEdward Gillett /* [A0] */ INVALID, INVALID, INVALID, INVALID, 854ab47273fSEdward Gillett /* [A4] */ INVALID, INVALID, INVALID, INVALID, 855ab47273fSEdward Gillett /* [A8] */ INVALID, INVALID, INVALID, INVALID, 856ab47273fSEdward Gillett /* [AC] */ INVALID, INVALID, INVALID, INVALID, 857ab47273fSEdward Gillett 858ab47273fSEdward Gillett /* [B0] */ INVALID, INVALID, INVALID, INVALID, 859ab47273fSEdward Gillett /* [B4] */ INVALID, INVALID, INVALID, INVALID, 860ab47273fSEdward Gillett /* [B8] */ INVALID, INVALID, INVALID, INVALID, 861ab47273fSEdward Gillett /* [BC] */ INVALID, INVALID, INVALID, INVALID, 862ab47273fSEdward Gillett 863ab47273fSEdward Gillett /* [C0] */ INVALID, INVALID, TNSZ("vcmppd",VEX_RMRX,16), INVALID, 864ab47273fSEdward Gillett /* [C4] */ TNSZ("vpinsrw",VEX_RMRX,2),TNS("vpextrw",VEX_MR), TNSZ("vshufpd",VEX_RMRX,16), INVALID, 865ab47273fSEdward Gillett /* [C8] */ INVALID, INVALID, INVALID, INVALID, 866ab47273fSEdward Gillett /* [CC] */ INVALID, INVALID, INVALID, INVALID, 867ab47273fSEdward Gillett 868ab47273fSEdward Gillett /* [D0] */ TNSZ("vaddsubpd",VEX_RMrX,16),TNSZ("vpsrlw",VEX_RMrX,16), TNSZ("vpsrld",VEX_RMrX,16), TNSZ("vpsrlq",VEX_RMrX,16), 869ab47273fSEdward Gillett /* [D4] */ TNSZ("vpaddq",VEX_RMrX,16), TNSZ("vpmullw",VEX_RMrX,16), TNSZ("vmovq",VEX_RX,8), TNS("vpmovmskb",VEX_MR), 870ab47273fSEdward Gillett /* [D8] */ TNSZ("vpsubusb",VEX_RMrX,16), TNSZ("vpsubusw",VEX_RMrX,16), TNSZ("vpminub",VEX_RMrX,16), TNSZ("vpand",VEX_RMrX,16), 871ab47273fSEdward Gillett /* [DC] */ TNSZ("vpaddusb",VEX_RMrX,16), TNSZ("vpaddusw",VEX_RMrX,16), TNSZ("vpmaxub",VEX_RMrX,16), TNSZ("vpandn",VEX_RMrX,16), 872