1b305b0f1Sespie /* opcode/i386.h -- Intel 80386 opcode table 2b55d4692Sfgsch Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 3007c2a45Smiod 2000, 2001, 2002, 2003, 2004 4b55d4692Sfgsch Free Software Foundation, Inc. 52159047fSniklas 62159047fSniklas This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger. 72159047fSniklas 82159047fSniklas This program is free software; you can redistribute it and/or modify 92159047fSniklas it under the terms of the GNU General Public License as published by 102159047fSniklas the Free Software Foundation; either version 2 of the License, or 112159047fSniklas (at your option) any later version. 122159047fSniklas 132159047fSniklas This program is distributed in the hope that it will be useful, 142159047fSniklas but WITHOUT ANY WARRANTY; without even the implied warranty of 152159047fSniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 162159047fSniklas GNU General Public License for more details. 172159047fSniklas 182159047fSniklas You should have received a copy of the GNU General Public License 192159047fSniklas along with this program; if not, write to the Free Software 202159047fSniklas Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 212159047fSniklas 22b305b0f1Sespie /* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived 23b305b0f1Sespie ix86 Unix assemblers, generate floating point instructions with 24b305b0f1Sespie reversed source and destination registers in certain cases. 25b305b0f1Sespie Unfortunately, gcc and possibly many other programs use this 26b305b0f1Sespie reversed syntax, so we're stuck with it. 27b305b0f1Sespie 28b305b0f1Sespie eg. `fsub %st(3),%st' results in st = st - st(3) as expected, but 29b305b0f1Sespie `fsub %st,%st(3)' results in st(3) = st - st(3), rather than 30b305b0f1Sespie the expected st(3) = st(3) - st 31b305b0f1Sespie 32b305b0f1Sespie This happens with all the non-commutative arithmetic floating point 33b305b0f1Sespie operations with two register operands, where the source register is 34b305b0f1Sespie %st, and destination register is %st(i). See FloatDR below. 35b305b0f1Sespie 36b305b0f1Sespie The affected opcode map is dceX, dcfX, deeX, defX. */ 37b305b0f1Sespie 38b305b0f1Sespie #ifndef SYSV386_COMPAT 39b305b0f1Sespie /* Set non-zero for broken, compatible instructions. Set to zero for 40b305b0f1Sespie non-broken opcodes at your peril. gcc generates SystemV/386 41b305b0f1Sespie compatible instructions. */ 42b305b0f1Sespie #define SYSV386_COMPAT 1 43b305b0f1Sespie #endif 44b305b0f1Sespie #ifndef OLDGCC_COMPAT 45b305b0f1Sespie /* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could 46b305b0f1Sespie generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands 47b305b0f1Sespie reversed. */ 48b305b0f1Sespie #define OLDGCC_COMPAT SYSV386_COMPAT 49b305b0f1Sespie #endif 50b305b0f1Sespie 512159047fSniklas static const template i386_optab[] = { 522159047fSniklas 53b305b0f1Sespie #define X None 54b55d4692Sfgsch #define NoSuf (No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf|No_qSuf) 55b55d4692Sfgsch #define b_Suf (No_wSuf|No_lSuf|No_sSuf|No_xSuf|No_qSuf) 56b55d4692Sfgsch #define w_Suf (No_bSuf|No_lSuf|No_sSuf|No_xSuf|No_qSuf) 57b55d4692Sfgsch #define l_Suf (No_bSuf|No_wSuf|No_sSuf|No_xSuf|No_qSuf) 58b55d4692Sfgsch #define q_Suf (No_bSuf|No_wSuf|No_sSuf|No_lSuf|No_xSuf) 59b55d4692Sfgsch #define x_Suf (No_bSuf|No_wSuf|No_sSuf|No_lSuf|No_qSuf) 60b55d4692Sfgsch #define bw_Suf (No_lSuf|No_sSuf|No_xSuf|No_qSuf) 61b55d4692Sfgsch #define bl_Suf (No_wSuf|No_sSuf|No_xSuf|No_qSuf) 62b55d4692Sfgsch #define wl_Suf (No_bSuf|No_sSuf|No_xSuf|No_qSuf) 63b55d4692Sfgsch #define wlq_Suf (No_bSuf|No_sSuf|No_xSuf) 64b55d4692Sfgsch #define lq_Suf (No_bSuf|No_wSuf|No_sSuf|No_xSuf) 65c074d1c9Sdrahn #define wq_Suf (No_bSuf|No_lSuf|No_sSuf|No_xSuf) 66b55d4692Sfgsch #define sl_Suf (No_bSuf|No_wSuf|No_xSuf|No_qSuf) 67b55d4692Sfgsch #define sldx_Suf (No_bSuf|No_wSuf|No_qSuf) 68b55d4692Sfgsch #define bwl_Suf (No_sSuf|No_xSuf|No_qSuf) 69b55d4692Sfgsch #define bwlq_Suf (No_sSuf|No_xSuf) 70b305b0f1Sespie #define FP (NoSuf|IgnoreSize) 71b305b0f1Sespie #define l_FP (l_Suf|IgnoreSize) 72b305b0f1Sespie #define x_FP (x_Suf|IgnoreSize) 73b305b0f1Sespie #define sl_FP (sl_Suf|IgnoreSize) 74b305b0f1Sespie #if SYSV386_COMPAT 75b305b0f1Sespie /* Someone forgot that the FloatR bit reverses the operation when not 76b305b0f1Sespie equal to the FloatD bit. ie. Changing only FloatD results in the 77b305b0f1Sespie destination being swapped *and* the direction being reversed. */ 78b305b0f1Sespie #define FloatDR FloatD 79b305b0f1Sespie #else 80b305b0f1Sespie #define FloatDR (FloatD|FloatR) 81b305b0f1Sespie #endif 82b305b0f1Sespie 83b305b0f1Sespie /* Move instructions. */ 842159047fSniklas #define MOV_AX_DISP32 0xa0 85b55d4692Sfgsch /* In the 64bit mode the short form mov immediate is redefined to have 86b55d4692Sfgsch 64bit displacement value. */ 87b55d4692Sfgsch { "mov", 2, 0xa0, X, CpuNo64,bwlq_Suf|D|W, { Disp16|Disp32, Acc, 0 } }, 88b55d4692Sfgsch { "mov", 2, 0x88, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 89b55d4692Sfgsch /* In the 64bit mode the short form mov immediate is redefined to have 90b55d4692Sfgsch 64bit displacement value. */ 91b55d4692Sfgsch { "mov", 2, 0xb0, X, 0, bwl_Suf|W|ShortForm, { EncImm, Reg8|Reg16|Reg32, 0 } }, 92b55d4692Sfgsch { "mov", 2, 0xc6, 0, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0 } }, 93b55d4692Sfgsch { "mov", 2, 0xb0, X, Cpu64, q_Suf|W|ShortForm, { Imm64, Reg64, 0 } }, 94b55d4692Sfgsch /* The segment register moves accept WordReg so that a segment register 95b305b0f1Sespie can be copied to a 32 bit register, and vice versa, without using a 96b305b0f1Sespie size prefix. When moving to a 32 bit register, the upper 16 bits 97b305b0f1Sespie are set to an implementation defined value (on the Pentium Pro, 98b305b0f1Sespie the implementation defined value is zero). */ 99b55d4692Sfgsch { "mov", 2, 0x8c, X, 0, wl_Suf|Modrm, { SReg2, WordReg|WordMem, 0 } }, 100b55d4692Sfgsch { "mov", 2, 0x8c, X, Cpu386, wl_Suf|Modrm, { SReg3, WordReg|WordMem, 0 } }, 101b55d4692Sfgsch { "mov", 2, 0x8e, X, 0, wl_Suf|Modrm|IgnoreSize, { WordReg|WordMem, SReg2, 0 } }, 102b55d4692Sfgsch { "mov", 2, 0x8e, X, Cpu386, wl_Suf|Modrm|IgnoreSize, { WordReg|WordMem, SReg3, 0 } }, 103b55d4692Sfgsch /* Move to/from control debug registers. In the 16 or 32bit modes they are 32bit. In the 64bit 104b55d4692Sfgsch mode they are 64bit.*/ 105b55d4692Sfgsch { "mov", 2, 0x0f20, X, Cpu386|CpuNo64, l_Suf|D|Modrm|IgnoreSize,{ Control, Reg32|InvMem, 0} }, 106b55d4692Sfgsch { "mov", 2, 0x0f20, X, Cpu64, q_Suf|D|Modrm|IgnoreSize|NoRex64,{ Control, Reg64|InvMem, 0} }, 107b55d4692Sfgsch { "mov", 2, 0x0f21, X, Cpu386|CpuNo64, l_Suf|D|Modrm|IgnoreSize,{ Debug, Reg32|InvMem, 0} }, 108b55d4692Sfgsch { "mov", 2, 0x0f21, X, Cpu64, q_Suf|D|Modrm|IgnoreSize|NoRex64,{ Debug, Reg64|InvMem, 0} }, 109b55d4692Sfgsch { "mov", 2, 0x0f24, X, Cpu386, l_Suf|D|Modrm|IgnoreSize, { Test, Reg32|InvMem, 0} }, 110b55d4692Sfgsch { "movabs",2, 0xa0, X, Cpu64, bwlq_Suf|D|W, { Disp64, Acc, 0 } }, 111b55d4692Sfgsch { "movabs",2, 0xb0, X, Cpu64, q_Suf|W|ShortForm, { Imm64, Reg64, 0 } }, 1122159047fSniklas 113b305b0f1Sespie /* Move with sign extend. */ 1142159047fSniklas /* "movsbl" & "movsbw" must not be unified into "movsb" to avoid 115b305b0f1Sespie conflict with the "movs" string move instruction. */ 116b55d4692Sfgsch {"movsbl", 2, 0x0fbe, X, Cpu386, NoSuf|Modrm, { Reg8|ByteMem, Reg32, 0} }, 117b55d4692Sfgsch {"movsbw", 2, 0x0fbe, X, Cpu386, NoSuf|Modrm, { Reg8|ByteMem, Reg16, 0} }, 118b55d4692Sfgsch {"movswl", 2, 0x0fbf, X, Cpu386, NoSuf|Modrm, { Reg16|ShortMem,Reg32, 0} }, 119b55d4692Sfgsch {"movsbq", 2, 0x0fbe, X, Cpu64, NoSuf|Modrm|Rex64, { Reg8|ByteMem, Reg64, 0} }, 120b55d4692Sfgsch {"movswq", 2, 0x0fbf, X, Cpu64, NoSuf|Modrm|Rex64, { Reg16|ShortMem,Reg64, 0} }, 121b55d4692Sfgsch {"movslq", 2, 0x63, X, Cpu64, NoSuf|Modrm|Rex64, { Reg32|WordMem, Reg64, 0} }, 122b55d4692Sfgsch /* Intel Syntax next 5 insns */ 123b55d4692Sfgsch {"movsx", 2, 0x0fbe, X, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, WordReg, 0} }, 124c074d1c9Sdrahn {"movsx", 2, 0x0fbf, X, Cpu386, w_Suf|Modrm, { Reg16|ShortMem, Reg32, 0} }, 125b55d4692Sfgsch {"movsx", 2, 0x0fbe, X, Cpu64, b_Suf|Modrm|Rex64, { Reg8|ByteMem, Reg64, 0} }, 126c074d1c9Sdrahn {"movsx", 2, 0x0fbf, X, Cpu64, w_Suf|Modrm|Rex64, { Reg16|ShortMem, Reg64, 0} }, 127b55d4692Sfgsch {"movsx", 2, 0x63, X, Cpu64, l_Suf|Modrm|Rex64, { Reg32|WordMem, Reg64, 0} }, 1282159047fSniklas 129b305b0f1Sespie /* Move with zero extend. */ 130b55d4692Sfgsch {"movzb", 2, 0x0fb6, X, Cpu386, wl_Suf|Modrm, { Reg8|ByteMem, WordReg, 0} }, 131b55d4692Sfgsch {"movzwl", 2, 0x0fb7, X, Cpu386, NoSuf|Modrm, { Reg16|ShortMem, Reg32, 0} }, 132b55d4692Sfgsch /* These instructions are not particulary usefull, since the zero extend 133b55d4692Sfgsch 32->64 is implicit, but we can encode them. */ 134b55d4692Sfgsch {"movzbq", 2, 0x0fb6, X, Cpu64, NoSuf|Modrm|Rex64, { Reg8|ByteMem, Reg64, 0} }, 135b55d4692Sfgsch {"movzwq", 2, 0x0fb7, X, Cpu64, NoSuf|Modrm|Rex64, { Reg16|ShortMem, Reg64, 0} }, 136b55d4692Sfgsch /* Intel Syntax next 4 insns */ 137b55d4692Sfgsch {"movzx", 2, 0x0fb6, X, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, WordReg, 0} }, 138c074d1c9Sdrahn {"movzx", 2, 0x0fb7, X, Cpu386, w_Suf|Modrm, { Reg16|ShortMem, Reg32, 0} }, 139b55d4692Sfgsch /* These instructions are not particulary usefull, since the zero extend 140b55d4692Sfgsch 32->64 is implicit, but we can encode them. */ 141b55d4692Sfgsch {"movzx", 2, 0x0fb6, X, Cpu386, b_Suf|Modrm|Rex64, { Reg8|ByteMem, Reg64, 0} }, 142c074d1c9Sdrahn {"movzx", 2, 0x0fb7, X, Cpu386, w_Suf|Modrm|Rex64, { Reg16|ShortMem, Reg64, 0} }, 1432159047fSniklas 144b305b0f1Sespie /* Push instructions. */ 145b55d4692Sfgsch {"push", 1, 0x50, X, CpuNo64, wl_Suf|ShortForm|DefaultSize, { WordReg, 0, 0 } }, 146b55d4692Sfgsch {"push", 1, 0xff, 6, CpuNo64, wl_Suf|Modrm|DefaultSize, { WordReg|WordMem, 0, 0 } }, 147b55d4692Sfgsch {"push", 1, 0x6a, X, Cpu186|CpuNo64, wl_Suf|DefaultSize, { Imm8S, 0, 0} }, 148b55d4692Sfgsch {"push", 1, 0x68, X, Cpu186|CpuNo64, wl_Suf|DefaultSize, { Imm16|Imm32, 0, 0} }, 149b55d4692Sfgsch {"push", 1, 0x06, X, 0|CpuNo64, wl_Suf|Seg2ShortForm|DefaultSize, { SReg2, 0, 0 } }, 150b55d4692Sfgsch {"push", 1, 0x0fa0, X, Cpu386|CpuNo64, wl_Suf|Seg3ShortForm|DefaultSize, { SReg3, 0, 0 } }, 151b55d4692Sfgsch /* In 64bit mode, the operand size is implicitly 64bit. */ 152c074d1c9Sdrahn {"push", 1, 0x50, X, Cpu64, wq_Suf|ShortForm|DefaultSize|NoRex64, { WordReg, 0, 0 } }, 153c074d1c9Sdrahn {"push", 1, 0xff, 6, Cpu64, wq_Suf|Modrm|DefaultSize|NoRex64, { WordReg|WordMem, 0, 0 } }, 154c074d1c9Sdrahn {"push", 1, 0x6a, X, Cpu186|Cpu64, wq_Suf|DefaultSize|NoRex64, { Imm8S, 0, 0} }, 155c074d1c9Sdrahn {"push", 1, 0x68, X, Cpu186|Cpu64, wq_Suf|DefaultSize|NoRex64, { Imm32S|Imm16, 0, 0} }, 156c074d1c9Sdrahn {"push", 1, 0x06, X, Cpu64, wq_Suf|Seg2ShortForm|DefaultSize|NoRex64, { SReg2, 0, 0 } }, 157c074d1c9Sdrahn {"push", 1, 0x0fa0, X, Cpu386|Cpu64, wq_Suf|Seg3ShortForm|DefaultSize|NoRex64, { SReg3, 0, 0 } }, 158b55d4692Sfgsch 159b55d4692Sfgsch {"pusha", 0, 0x60, X, Cpu186|CpuNo64, wl_Suf|DefaultSize, { 0, 0, 0 } }, 1602159047fSniklas 161b305b0f1Sespie /* Pop instructions. */ 162b55d4692Sfgsch {"pop", 1, 0x58, X, CpuNo64, wl_Suf|ShortForm|DefaultSize, { WordReg, 0, 0 } }, 163b55d4692Sfgsch {"pop", 1, 0x8f, 0, CpuNo64, wl_Suf|Modrm|DefaultSize, { WordReg|WordMem, 0, 0 } }, 164b305b0f1Sespie #define POP_SEG_SHORT 0x07 165b55d4692Sfgsch {"pop", 1, 0x07, X, CpuNo64, wl_Suf|Seg2ShortForm|DefaultSize, { SReg2, 0, 0 } }, 166b55d4692Sfgsch {"pop", 1, 0x0fa1, X, Cpu386|CpuNo64, wl_Suf|Seg3ShortForm|DefaultSize, { SReg3, 0, 0 } }, 167b55d4692Sfgsch /* In 64bit mode, the operand size is implicitly 64bit. */ 168c074d1c9Sdrahn {"pop", 1, 0x58, X, Cpu64, wq_Suf|ShortForm|DefaultSize|NoRex64, { WordReg, 0, 0 } }, 169c074d1c9Sdrahn {"pop", 1, 0x8f, 0, Cpu64, wq_Suf|Modrm|DefaultSize|NoRex64, { WordReg|WordMem, 0, 0 } }, 170c074d1c9Sdrahn {"pop", 1, 0x07, X, Cpu64, wq_Suf|Seg2ShortForm|DefaultSize|NoRex64, { SReg2, 0, 0 } }, 171c074d1c9Sdrahn {"pop", 1, 0x0fa1, X, Cpu64, wq_Suf|Seg3ShortForm|DefaultSize|NoRex64, { SReg3, 0, 0 } }, 172b55d4692Sfgsch 173b55d4692Sfgsch {"popa", 0, 0x61, X, Cpu186|CpuNo64, wl_Suf|DefaultSize, { 0, 0, 0 } }, 1742159047fSniklas 175b305b0f1Sespie /* Exchange instructions. 176b55d4692Sfgsch xchg commutes: we allow both operand orders. 177b55d4692Sfgsch 178b55d4692Sfgsch In the 64bit code, xchg eax, eax is reused for new nop instruction. 179b55d4692Sfgsch */ 180c074d1c9Sdrahn {"xchg", 2, 0x90, X, 0, wlq_Suf|ShortForm, { WordReg, Acc, 0 } }, 181c074d1c9Sdrahn {"xchg", 2, 0x90, X, 0, wlq_Suf|ShortForm, { Acc, WordReg, 0 } }, 182b55d4692Sfgsch {"xchg", 2, 0x86, X, 0, bwlq_Suf|W|Modrm, { Reg, Reg|AnyMem, 0 } }, 183b55d4692Sfgsch {"xchg", 2, 0x86, X, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, Reg, 0 } }, 1842159047fSniklas 185b305b0f1Sespie /* In/out from ports. */ 186c074d1c9Sdrahn {"in", 2, 0xe4, X, 0, bwl_Suf|W, { Imm8, Acc, 0 } }, 187c074d1c9Sdrahn {"in", 2, 0xec, X, 0, bwl_Suf|W, { InOutPortReg, Acc, 0 } }, 188c074d1c9Sdrahn {"in", 1, 0xe4, X, 0, bwl_Suf|W, { Imm8, 0, 0 } }, 189c074d1c9Sdrahn {"in", 1, 0xec, X, 0, bwl_Suf|W, { InOutPortReg, 0, 0 } }, 190c074d1c9Sdrahn {"out", 2, 0xe6, X, 0, bwl_Suf|W, { Acc, Imm8, 0 } }, 191c074d1c9Sdrahn {"out", 2, 0xee, X, 0, bwl_Suf|W, { Acc, InOutPortReg, 0 } }, 192c074d1c9Sdrahn {"out", 1, 0xe6, X, 0, bwl_Suf|W, { Imm8, 0, 0 } }, 193c074d1c9Sdrahn {"out", 1, 0xee, X, 0, bwl_Suf|W, { InOutPortReg, 0, 0 } }, 1942159047fSniklas 195b305b0f1Sespie /* Load effective address. */ 196b55d4692Sfgsch {"lea", 2, 0x8d, X, 0, wlq_Suf|Modrm, { WordMem, WordReg, 0 } }, 1972159047fSniklas 198b305b0f1Sespie /* Load segment registers from memory. */ 199b55d4692Sfgsch {"lds", 2, 0xc5, X, CpuNo64, wlq_Suf|Modrm, { WordMem, WordReg, 0} }, 200b55d4692Sfgsch {"les", 2, 0xc4, X, CpuNo64, wlq_Suf|Modrm, { WordMem, WordReg, 0} }, 201b55d4692Sfgsch {"lfs", 2, 0x0fb4, X, Cpu386, wlq_Suf|Modrm, { WordMem, WordReg, 0} }, 202b55d4692Sfgsch {"lgs", 2, 0x0fb5, X, Cpu386, wlq_Suf|Modrm, { WordMem, WordReg, 0} }, 203b55d4692Sfgsch {"lss", 2, 0x0fb2, X, Cpu386, wlq_Suf|Modrm, { WordMem, WordReg, 0} }, 2042159047fSniklas 205b305b0f1Sespie /* Flags register instructions. */ 206b55d4692Sfgsch {"clc", 0, 0xf8, X, 0, NoSuf, { 0, 0, 0} }, 207b55d4692Sfgsch {"cld", 0, 0xfc, X, 0, NoSuf, { 0, 0, 0} }, 208b55d4692Sfgsch {"cli", 0, 0xfa, X, 0, NoSuf, { 0, 0, 0} }, 209b55d4692Sfgsch {"clts", 0, 0x0f06, X, Cpu286, NoSuf, { 0, 0, 0} }, 210b55d4692Sfgsch {"cmc", 0, 0xf5, X, 0, NoSuf, { 0, 0, 0} }, 211e92ccebbSjsg {"lahf", 0, 0x9f, X, 0, NoSuf, { 0, 0, 0} }, 212e92ccebbSjsg {"sahf", 0, 0x9e, X, 0, NoSuf, { 0, 0, 0} }, 213b55d4692Sfgsch {"pushf", 0, 0x9c, X, CpuNo64,wlq_Suf|DefaultSize, { 0, 0, 0} }, 214c074d1c9Sdrahn {"pushf", 0, 0x9c, X, Cpu64, wq_Suf|DefaultSize|NoRex64,{ 0, 0, 0} }, 215b55d4692Sfgsch {"popf", 0, 0x9d, X, CpuNo64,wlq_Suf|DefaultSize, { 0, 0, 0} }, 216c074d1c9Sdrahn {"popf", 0, 0x9d, X, Cpu64, wq_Suf|DefaultSize|NoRex64,{ 0, 0, 0} }, 217b55d4692Sfgsch {"stc", 0, 0xf9, X, 0, NoSuf, { 0, 0, 0} }, 218b55d4692Sfgsch {"std", 0, 0xfd, X, 0, NoSuf, { 0, 0, 0} }, 219b55d4692Sfgsch {"sti", 0, 0xfb, X, 0, NoSuf, { 0, 0, 0} }, 2202159047fSniklas 221b305b0f1Sespie /* Arithmetic. */ 222b55d4692Sfgsch {"add", 2, 0x00, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 223b55d4692Sfgsch {"add", 2, 0x83, 0, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 224b55d4692Sfgsch {"add", 2, 0x04, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 225b55d4692Sfgsch {"add", 2, 0x80, 0, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2262159047fSniklas 227b55d4692Sfgsch {"inc", 1, 0x40, X, CpuNo64,wl_Suf|ShortForm, { WordReg, 0, 0} }, 228b55d4692Sfgsch {"inc", 1, 0xfe, 0, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 2292159047fSniklas 230b55d4692Sfgsch {"sub", 2, 0x28, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 231b55d4692Sfgsch {"sub", 2, 0x83, 5, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 232b55d4692Sfgsch {"sub", 2, 0x2c, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 233b55d4692Sfgsch {"sub", 2, 0x80, 5, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2342159047fSniklas 235b55d4692Sfgsch {"dec", 1, 0x48, X, CpuNo64, wl_Suf|ShortForm, { WordReg, 0, 0} }, 236b55d4692Sfgsch {"dec", 1, 0xfe, 1, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 2372159047fSniklas 238b55d4692Sfgsch {"sbb", 2, 0x18, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 239b55d4692Sfgsch {"sbb", 2, 0x83, 3, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 240b55d4692Sfgsch {"sbb", 2, 0x1c, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 241b55d4692Sfgsch {"sbb", 2, 0x80, 3, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2422159047fSniklas 243b55d4692Sfgsch {"cmp", 2, 0x38, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 244b55d4692Sfgsch {"cmp", 2, 0x83, 7, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 245b55d4692Sfgsch {"cmp", 2, 0x3c, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 246b55d4692Sfgsch {"cmp", 2, 0x80, 7, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2472159047fSniklas 248b55d4692Sfgsch {"test", 2, 0x84, X, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, Reg, 0} }, 249b55d4692Sfgsch {"test", 2, 0x84, X, 0, bwlq_Suf|W|Modrm, { Reg, Reg|AnyMem, 0} }, 250b55d4692Sfgsch {"test", 2, 0xa8, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 251b55d4692Sfgsch {"test", 2, 0xf6, 0, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2522159047fSniklas 253b55d4692Sfgsch {"and", 2, 0x20, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 254b55d4692Sfgsch {"and", 2, 0x83, 4, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 255b55d4692Sfgsch {"and", 2, 0x24, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 256b55d4692Sfgsch {"and", 2, 0x80, 4, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2572159047fSniklas 258b55d4692Sfgsch {"or", 2, 0x08, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 259b55d4692Sfgsch {"or", 2, 0x83, 1, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 260b55d4692Sfgsch {"or", 2, 0x0c, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 261b55d4692Sfgsch {"or", 2, 0x80, 1, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2622159047fSniklas 263b55d4692Sfgsch {"xor", 2, 0x30, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 264b55d4692Sfgsch {"xor", 2, 0x83, 6, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 265b55d4692Sfgsch {"xor", 2, 0x34, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 266b55d4692Sfgsch {"xor", 2, 0x80, 6, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2672159047fSniklas 268b305b0f1Sespie /* clr with 1 operand is really xor with 2 operands. */ 269b55d4692Sfgsch {"clr", 1, 0x30, X, 0, bwlq_Suf|W|Modrm|regKludge, { Reg, 0, 0 } }, 2702159047fSniklas 271b55d4692Sfgsch {"adc", 2, 0x10, X, 0, bwlq_Suf|D|W|Modrm, { Reg, Reg|AnyMem, 0} }, 272b55d4692Sfgsch {"adc", 2, 0x83, 2, 0, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, 0} }, 273b55d4692Sfgsch {"adc", 2, 0x14, X, 0, bwlq_Suf|W, { EncImm, Acc, 0} }, 274b55d4692Sfgsch {"adc", 2, 0x80, 2, 0, bwlq_Suf|W|Modrm, { EncImm, Reg|AnyMem, 0} }, 2752159047fSniklas 276b55d4692Sfgsch {"neg", 1, 0xf6, 3, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 277b55d4692Sfgsch {"not", 1, 0xf6, 2, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 2782159047fSniklas 279b55d4692Sfgsch {"aaa", 0, 0x37, X, 0, NoSuf, { 0, 0, 0} }, 280b55d4692Sfgsch {"aas", 0, 0x3f, X, 0, NoSuf, { 0, 0, 0} }, 281b55d4692Sfgsch {"daa", 0, 0x27, X, 0, NoSuf, { 0, 0, 0} }, 282b55d4692Sfgsch {"das", 0, 0x2f, X, 0, NoSuf, { 0, 0, 0} }, 283b55d4692Sfgsch {"aad", 0, 0xd50a, X, 0, NoSuf, { 0, 0, 0} }, 284b55d4692Sfgsch {"aad", 1, 0xd5, X, 0, NoSuf, { Imm8S, 0, 0} }, 285b55d4692Sfgsch {"aam", 0, 0xd40a, X, 0, NoSuf, { 0, 0, 0} }, 286b55d4692Sfgsch {"aam", 1, 0xd4, X, 0, NoSuf, { Imm8S, 0, 0} }, 287b305b0f1Sespie 288b305b0f1Sespie /* Conversion insns. */ 289b305b0f1Sespie /* Intel naming */ 290b55d4692Sfgsch {"cbw", 0, 0x98, X, 0, NoSuf|Size16, { 0, 0, 0} }, 291b55d4692Sfgsch {"cdqe", 0, 0x98, X, Cpu64, NoSuf|Size64, { 0, 0, 0} }, 292b55d4692Sfgsch {"cwde", 0, 0x98, X, 0, NoSuf|Size32, { 0, 0, 0} }, 293b55d4692Sfgsch {"cwd", 0, 0x99, X, 0, NoSuf|Size16, { 0, 0, 0} }, 294b55d4692Sfgsch {"cdq", 0, 0x99, X, 0, NoSuf|Size32, { 0, 0, 0} }, 295b55d4692Sfgsch {"cqo", 0, 0x99, X, Cpu64, NoSuf|Size64, { 0, 0, 0} }, 296b305b0f1Sespie /* AT&T naming */ 297b55d4692Sfgsch {"cbtw", 0, 0x98, X, 0, NoSuf|Size16, { 0, 0, 0} }, 298b55d4692Sfgsch {"cltq", 0, 0x98, X, Cpu64, NoSuf|Size64, { 0, 0, 0} }, 299b55d4692Sfgsch {"cwtl", 0, 0x98, X, 0, NoSuf|Size32, { 0, 0, 0} }, 300b55d4692Sfgsch {"cwtd", 0, 0x99, X, 0, NoSuf|Size16, { 0, 0, 0} }, 301b55d4692Sfgsch {"cltd", 0, 0x99, X, 0, NoSuf|Size32, { 0, 0, 0} }, 302b55d4692Sfgsch {"cqto", 0, 0x99, X, Cpu64, NoSuf|Size64, { 0, 0, 0} }, 3032159047fSniklas 3042159047fSniklas /* Warning! the mul/imul (opcode 0xf6) must only have 1 operand! They are 3052159047fSniklas expanding 64-bit multiplies, and *cannot* be selected to accomplish 3062159047fSniklas 'imul %ebx, %eax' (opcode 0x0faf must be used in this case) 3072159047fSniklas These multiplies can only be selected with single operand forms. */ 308b55d4692Sfgsch {"mul", 1, 0xf6, 4, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 309b55d4692Sfgsch {"imul", 1, 0xf6, 5, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 310b55d4692Sfgsch {"imul", 2, 0x0faf, X, Cpu386, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 311b55d4692Sfgsch {"imul", 3, 0x6b, X, Cpu186, wlq_Suf|Modrm, { Imm8S, WordReg|WordMem, WordReg} }, 312b55d4692Sfgsch {"imul", 3, 0x69, X, Cpu186, wlq_Suf|Modrm, { Imm16|Imm32S|Imm32, WordReg|WordMem, WordReg} }, 313b305b0f1Sespie /* imul with 2 operands mimics imul with 3 by putting the register in 314b305b0f1Sespie both i.rm.reg & i.rm.regmem fields. regKludge enables this 315b305b0f1Sespie transformation. */ 316b55d4692Sfgsch {"imul", 2, 0x6b, X, Cpu186, wlq_Suf|Modrm|regKludge,{ Imm8S, WordReg, 0} }, 317b55d4692Sfgsch {"imul", 2, 0x69, X, Cpu186, wlq_Suf|Modrm|regKludge,{ Imm16|Imm32S|Imm32, WordReg, 0} }, 3182159047fSniklas 319b55d4692Sfgsch {"div", 1, 0xf6, 6, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 320b55d4692Sfgsch {"div", 2, 0xf6, 6, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, Acc, 0} }, 321b55d4692Sfgsch {"idiv", 1, 0xf6, 7, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 322b55d4692Sfgsch {"idiv", 2, 0xf6, 7, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, Acc, 0} }, 3232159047fSniklas 324b55d4692Sfgsch {"rol", 2, 0xd0, 0, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 325b55d4692Sfgsch {"rol", 2, 0xc0, 0, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 326b55d4692Sfgsch {"rol", 2, 0xd2, 0, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 327b55d4692Sfgsch {"rol", 1, 0xd0, 0, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3282159047fSniklas 329b55d4692Sfgsch {"ror", 2, 0xd0, 1, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 330b55d4692Sfgsch {"ror", 2, 0xc0, 1, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 331b55d4692Sfgsch {"ror", 2, 0xd2, 1, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 332b55d4692Sfgsch {"ror", 1, 0xd0, 1, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3332159047fSniklas 334b55d4692Sfgsch {"rcl", 2, 0xd0, 2, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 335b55d4692Sfgsch {"rcl", 2, 0xc0, 2, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 336b55d4692Sfgsch {"rcl", 2, 0xd2, 2, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 337b55d4692Sfgsch {"rcl", 1, 0xd0, 2, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3382159047fSniklas 339b55d4692Sfgsch {"rcr", 2, 0xd0, 3, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 340b55d4692Sfgsch {"rcr", 2, 0xc0, 3, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 341b55d4692Sfgsch {"rcr", 2, 0xd2, 3, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 342b55d4692Sfgsch {"rcr", 1, 0xd0, 3, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3432159047fSniklas 344b55d4692Sfgsch {"sal", 2, 0xd0, 4, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 345b55d4692Sfgsch {"sal", 2, 0xc0, 4, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 346b55d4692Sfgsch {"sal", 2, 0xd2, 4, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 347b55d4692Sfgsch {"sal", 1, 0xd0, 4, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3482159047fSniklas 349b55d4692Sfgsch {"shl", 2, 0xd0, 4, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 350b55d4692Sfgsch {"shl", 2, 0xc0, 4, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 351b55d4692Sfgsch {"shl", 2, 0xd2, 4, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 352b55d4692Sfgsch {"shl", 1, 0xd0, 4, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3532159047fSniklas 354b55d4692Sfgsch {"shr", 2, 0xd0, 5, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 355b55d4692Sfgsch {"shr", 2, 0xc0, 5, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 356b55d4692Sfgsch {"shr", 2, 0xd2, 5, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 357b55d4692Sfgsch {"shr", 1, 0xd0, 5, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3582159047fSniklas 359b55d4692Sfgsch {"sar", 2, 0xd0, 7, 0, bwlq_Suf|W|Modrm, { Imm1, Reg|AnyMem, 0} }, 360b55d4692Sfgsch {"sar", 2, 0xc0, 7, Cpu186, bwlq_Suf|W|Modrm, { Imm8, Reg|AnyMem, 0} }, 361b55d4692Sfgsch {"sar", 2, 0xd2, 7, 0, bwlq_Suf|W|Modrm, { ShiftCount, Reg|AnyMem, 0} }, 362b55d4692Sfgsch {"sar", 1, 0xd0, 7, 0, bwlq_Suf|W|Modrm, { Reg|AnyMem, 0, 0} }, 3632159047fSniklas 364b55d4692Sfgsch {"shld", 3, 0x0fa4, X, Cpu386, wlq_Suf|Modrm, { Imm8, WordReg, WordReg|WordMem} }, 365b55d4692Sfgsch {"shld", 3, 0x0fa5, X, Cpu386, wlq_Suf|Modrm, { ShiftCount, WordReg, WordReg|WordMem} }, 366b55d4692Sfgsch {"shld", 2, 0x0fa5, X, Cpu386, wlq_Suf|Modrm, { WordReg, WordReg|WordMem, 0} }, 367b55d4692Sfgsch 368b55d4692Sfgsch {"shrd", 3, 0x0fac, X, Cpu386, wlq_Suf|Modrm, { Imm8, WordReg, WordReg|WordMem} }, 369b55d4692Sfgsch {"shrd", 3, 0x0fad, X, Cpu386, wlq_Suf|Modrm, { ShiftCount, WordReg, WordReg|WordMem} }, 370b55d4692Sfgsch {"shrd", 2, 0x0fad, X, Cpu386, wlq_Suf|Modrm, { WordReg, WordReg|WordMem, 0} }, 3712159047fSniklas 372b305b0f1Sespie /* Control transfer instructions. */ 373b55d4692Sfgsch {"call", 1, 0xe8, X, 0, wlq_Suf|JumpDword|DefaultSize, { Disp16|Disp32, 0, 0} }, 374c074d1c9Sdrahn {"call", 1, 0xff, 2, CpuNo64, wl_Suf|Modrm|DefaultSize, { WordReg|WordMem|JumpAbsolute, 0, 0} }, 375c074d1c9Sdrahn {"call", 1, 0xff, 2, Cpu64, wq_Suf|Modrm|DefaultSize|NoRex64,{ WordReg|WordMem|JumpAbsolute, 0, 0} }, 376b305b0f1Sespie /* Intel Syntax */ 377b55d4692Sfgsch {"call", 2, 0x9a, X, CpuNo64,wlq_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} }, 378b305b0f1Sespie /* Intel Syntax */ 379b55d4692Sfgsch {"call", 1, 0xff, 3, 0, x_Suf|Modrm|DefaultSize, { WordMem, 0, 0} }, 380b55d4692Sfgsch {"lcall", 2, 0x9a, X, CpuNo64, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} }, 381b55d4692Sfgsch {"lcall", 1, 0xff, 3, CpuNo64, wl_Suf|Modrm|DefaultSize, { WordMem|JumpAbsolute, 0, 0} }, 382b55d4692Sfgsch {"lcall", 1, 0xff, 3, Cpu64, q_Suf|Modrm|DefaultSize|NoRex64,{ WordMem|JumpAbsolute, 0, 0} }, 3832159047fSniklas 3842159047fSniklas #define JUMP_PC_RELATIVE 0xeb 385b55d4692Sfgsch {"jmp", 1, 0xeb, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 386c074d1c9Sdrahn {"jmp", 1, 0xff, 4, CpuNo64, wl_Suf|Modrm, { WordReg|WordMem|JumpAbsolute, 0, 0} }, 387c074d1c9Sdrahn {"jmp", 1, 0xff, 4, Cpu64, wq_Suf|Modrm|NoRex64, { WordReg|WordMem|JumpAbsolute, 0, 0} }, 388b305b0f1Sespie /* Intel Syntax */ 389b55d4692Sfgsch {"jmp", 2, 0xea, X, CpuNo64,wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} }, 390b305b0f1Sespie /* Intel Syntax */ 391b55d4692Sfgsch {"jmp", 1, 0xff, 5, 0, x_Suf|Modrm, { WordMem, 0, 0} }, 392b55d4692Sfgsch {"ljmp", 2, 0xea, X, CpuNo64, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} }, 393b55d4692Sfgsch {"ljmp", 1, 0xff, 5, CpuNo64, wl_Suf|Modrm, { WordMem|JumpAbsolute, 0, 0} }, 394b55d4692Sfgsch {"ljmp", 1, 0xff, 5, Cpu64, q_Suf|Modrm|NoRex64, { WordMem|JumpAbsolute, 0, 0} }, 3952159047fSniklas 396b55d4692Sfgsch {"ret", 0, 0xc3, X, CpuNo64,wlq_Suf|DefaultSize, { 0, 0, 0} }, 397b55d4692Sfgsch {"ret", 1, 0xc2, X, CpuNo64,wlq_Suf|DefaultSize, { Imm16, 0, 0} }, 398b55d4692Sfgsch {"ret", 0, 0xc3, X, Cpu64, q_Suf|DefaultSize|NoRex64,{ 0, 0, 0} }, 399b55d4692Sfgsch {"ret", 1, 0xc2, X, Cpu64, q_Suf|DefaultSize|NoRex64,{ Imm16, 0, 0} }, 400b55d4692Sfgsch {"lret", 0, 0xcb, X, 0, wlq_Suf|DefaultSize, { 0, 0, 0} }, 401b55d4692Sfgsch {"lret", 1, 0xca, X, 0, wlq_Suf|DefaultSize, { Imm16, 0, 0} }, 402b55d4692Sfgsch {"enter", 2, 0xc8, X, Cpu186, wlq_Suf|DefaultSize, { Imm16, Imm8, 0} }, 403b55d4692Sfgsch {"leave", 0, 0xc9, X, Cpu186, wlq_Suf|DefaultSize, { 0, 0, 0} }, 4042159047fSniklas 405b305b0f1Sespie /* Conditional jumps. */ 406b55d4692Sfgsch {"jo", 1, 0x70, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 407b55d4692Sfgsch {"jno", 1, 0x71, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 408b55d4692Sfgsch {"jb", 1, 0x72, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 409b55d4692Sfgsch {"jc", 1, 0x72, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 410b55d4692Sfgsch {"jnae", 1, 0x72, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 411b55d4692Sfgsch {"jnb", 1, 0x73, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 412b55d4692Sfgsch {"jnc", 1, 0x73, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 413b55d4692Sfgsch {"jae", 1, 0x73, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 414b55d4692Sfgsch {"je", 1, 0x74, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 415b55d4692Sfgsch {"jz", 1, 0x74, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 416b55d4692Sfgsch {"jne", 1, 0x75, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 417b55d4692Sfgsch {"jnz", 1, 0x75, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 418b55d4692Sfgsch {"jbe", 1, 0x76, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 419b55d4692Sfgsch {"jna", 1, 0x76, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 420b55d4692Sfgsch {"jnbe", 1, 0x77, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 421b55d4692Sfgsch {"ja", 1, 0x77, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 422b55d4692Sfgsch {"js", 1, 0x78, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 423b55d4692Sfgsch {"jns", 1, 0x79, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 424b55d4692Sfgsch {"jp", 1, 0x7a, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 425b55d4692Sfgsch {"jpe", 1, 0x7a, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 426b55d4692Sfgsch {"jnp", 1, 0x7b, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 427b55d4692Sfgsch {"jpo", 1, 0x7b, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 428b55d4692Sfgsch {"jl", 1, 0x7c, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 429b55d4692Sfgsch {"jnge", 1, 0x7c, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 430b55d4692Sfgsch {"jnl", 1, 0x7d, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 431b55d4692Sfgsch {"jge", 1, 0x7d, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 432b55d4692Sfgsch {"jle", 1, 0x7e, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 433b55d4692Sfgsch {"jng", 1, 0x7e, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 434b55d4692Sfgsch {"jnle", 1, 0x7f, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 435b55d4692Sfgsch {"jg", 1, 0x7f, X, 0, NoSuf|Jump, { Disp, 0, 0} }, 4362159047fSniklas 437b305b0f1Sespie /* jcxz vs. jecxz is chosen on the basis of the address size prefix. */ 438c074d1c9Sdrahn {"jcxz", 1, 0xe3, X, CpuNo64,NoSuf|JumpByte|Size16, { Disp, 0, 0} }, 439c074d1c9Sdrahn {"jecxz", 1, 0xe3, X, CpuNo64,NoSuf|JumpByte|Size32, { Disp, 0, 0} }, 440c074d1c9Sdrahn {"jecxz", 1, 0x67e3, X, Cpu64,NoSuf|JumpByte|Size32, { Disp, 0, 0} }, 441c074d1c9Sdrahn {"jrcxz", 1, 0xe3, X, Cpu64, NoSuf|JumpByte|Size64|NoRex64, { Disp, 0, 0} }, 4422159047fSniklas 443b305b0f1Sespie /* The loop instructions also use the address size prefix to select 444b305b0f1Sespie %cx rather than %ecx for the loop count, so the `w' form of these 445b305b0f1Sespie instructions emit an address size prefix rather than a data size 446b305b0f1Sespie prefix. */ 447c074d1c9Sdrahn {"loop", 1, 0xe2, X, CpuNo64,wl_Suf|JumpByte,{ Disp, 0, 0} }, 448c074d1c9Sdrahn {"loop", 1, 0xe2, X, Cpu64, lq_Suf|JumpByte|NoRex64,{ Disp, 0, 0} }, 449c074d1c9Sdrahn {"loopz", 1, 0xe1, X, CpuNo64,wl_Suf|JumpByte,{ Disp, 0, 0} }, 450c074d1c9Sdrahn {"loopz", 1, 0xe1, X, Cpu64, lq_Suf|JumpByte|NoRex64,{ Disp, 0, 0} }, 451c074d1c9Sdrahn {"loope", 1, 0xe1, X, CpuNo64,wl_Suf|JumpByte,{ Disp, 0, 0} }, 452c074d1c9Sdrahn {"loope", 1, 0xe1, X, Cpu64, lq_Suf|JumpByte|NoRex64,{ Disp, 0, 0} }, 453c074d1c9Sdrahn {"loopnz", 1, 0xe0, X, CpuNo64,wl_Suf|JumpByte,{ Disp, 0, 0} }, 454c074d1c9Sdrahn {"loopnz", 1, 0xe0, X, Cpu64, lq_Suf|JumpByte|NoRex64,{ Disp, 0, 0} }, 455c074d1c9Sdrahn {"loopne", 1, 0xe0, X, CpuNo64,wl_Suf|JumpByte,{ Disp, 0, 0} }, 456c074d1c9Sdrahn {"loopne", 1, 0xe0, X, Cpu64, lq_Suf|JumpByte|NoRex64,{ Disp, 0, 0} }, 4572159047fSniklas 458b305b0f1Sespie /* Set byte on flag instructions. */ 459b55d4692Sfgsch {"seto", 1, 0x0f90, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 460b55d4692Sfgsch {"setno", 1, 0x0f91, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 461b55d4692Sfgsch {"setb", 1, 0x0f92, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 462b55d4692Sfgsch {"setc", 1, 0x0f92, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 463b55d4692Sfgsch {"setnae", 1, 0x0f92, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 464b55d4692Sfgsch {"setnb", 1, 0x0f93, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 465b55d4692Sfgsch {"setnc", 1, 0x0f93, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 466b55d4692Sfgsch {"setae", 1, 0x0f93, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 467b55d4692Sfgsch {"sete", 1, 0x0f94, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 468b55d4692Sfgsch {"setz", 1, 0x0f94, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 469b55d4692Sfgsch {"setne", 1, 0x0f95, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 470b55d4692Sfgsch {"setnz", 1, 0x0f95, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 471b55d4692Sfgsch {"setbe", 1, 0x0f96, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 472b55d4692Sfgsch {"setna", 1, 0x0f96, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 473b55d4692Sfgsch {"setnbe", 1, 0x0f97, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 474b55d4692Sfgsch {"seta", 1, 0x0f97, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 475b55d4692Sfgsch {"sets", 1, 0x0f98, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 476b55d4692Sfgsch {"setns", 1, 0x0f99, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 477b55d4692Sfgsch {"setp", 1, 0x0f9a, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 478b55d4692Sfgsch {"setpe", 1, 0x0f9a, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 479b55d4692Sfgsch {"setnp", 1, 0x0f9b, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 480b55d4692Sfgsch {"setpo", 1, 0x0f9b, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 481b55d4692Sfgsch {"setl", 1, 0x0f9c, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 482b55d4692Sfgsch {"setnge", 1, 0x0f9c, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 483b55d4692Sfgsch {"setnl", 1, 0x0f9d, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 484b55d4692Sfgsch {"setge", 1, 0x0f9d, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 485b55d4692Sfgsch {"setle", 1, 0x0f9e, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 486b55d4692Sfgsch {"setng", 1, 0x0f9e, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 487b55d4692Sfgsch {"setnle", 1, 0x0f9f, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 488b55d4692Sfgsch {"setg", 1, 0x0f9f, 0, Cpu386, b_Suf|Modrm, { Reg8|ByteMem, 0, 0} }, 4892159047fSniklas 490b305b0f1Sespie /* String manipulation. */ 491b55d4692Sfgsch {"cmps", 0, 0xa6, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 492b55d4692Sfgsch {"cmps", 2, 0xa6, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, AnyMem, 0} }, 493b55d4692Sfgsch {"scmp", 0, 0xa6, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 494b55d4692Sfgsch {"scmp", 2, 0xa6, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, AnyMem, 0} }, 495c074d1c9Sdrahn {"ins", 0, 0x6c, X, Cpu186, bwl_Suf|W|IsString, { 0, 0, 0} }, 496c074d1c9Sdrahn {"ins", 2, 0x6c, X, Cpu186, bwl_Suf|W|IsString, { InOutPortReg, AnyMem|EsSeg, 0} }, 497c074d1c9Sdrahn {"outs", 0, 0x6e, X, Cpu186, bwl_Suf|W|IsString, { 0, 0, 0} }, 498c074d1c9Sdrahn {"outs", 2, 0x6e, X, Cpu186, bwl_Suf|W|IsString, { AnyMem, InOutPortReg, 0} }, 499b55d4692Sfgsch {"lods", 0, 0xac, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 500b55d4692Sfgsch {"lods", 1, 0xac, X, 0, bwlq_Suf|W|IsString, { AnyMem, 0, 0} }, 501b55d4692Sfgsch {"lods", 2, 0xac, X, 0, bwlq_Suf|W|IsString, { AnyMem, Acc, 0} }, 502b55d4692Sfgsch {"slod", 0, 0xac, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 503b55d4692Sfgsch {"slod", 1, 0xac, X, 0, bwlq_Suf|W|IsString, { AnyMem, 0, 0} }, 504b55d4692Sfgsch {"slod", 2, 0xac, X, 0, bwlq_Suf|W|IsString, { AnyMem, Acc, 0} }, 505b55d4692Sfgsch {"movs", 0, 0xa4, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 506b55d4692Sfgsch {"movs", 2, 0xa4, X, 0, bwlq_Suf|W|IsString, { AnyMem, AnyMem|EsSeg, 0} }, 507b55d4692Sfgsch {"smov", 0, 0xa4, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 508b55d4692Sfgsch {"smov", 2, 0xa4, X, 0, bwlq_Suf|W|IsString, { AnyMem, AnyMem|EsSeg, 0} }, 509b55d4692Sfgsch {"scas", 0, 0xae, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 510b55d4692Sfgsch {"scas", 1, 0xae, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, 0, 0} }, 511b55d4692Sfgsch {"scas", 2, 0xae, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, Acc, 0} }, 512b55d4692Sfgsch {"ssca", 0, 0xae, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 513b55d4692Sfgsch {"ssca", 1, 0xae, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, 0, 0} }, 514b55d4692Sfgsch {"ssca", 2, 0xae, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, Acc, 0} }, 515b55d4692Sfgsch {"stos", 0, 0xaa, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 516b55d4692Sfgsch {"stos", 1, 0xaa, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, 0, 0} }, 517b55d4692Sfgsch {"stos", 2, 0xaa, X, 0, bwlq_Suf|W|IsString, { Acc, AnyMem|EsSeg, 0} }, 518b55d4692Sfgsch {"ssto", 0, 0xaa, X, 0, bwlq_Suf|W|IsString, { 0, 0, 0} }, 519b55d4692Sfgsch {"ssto", 1, 0xaa, X, 0, bwlq_Suf|W|IsString, { AnyMem|EsSeg, 0, 0} }, 520b55d4692Sfgsch {"ssto", 2, 0xaa, X, 0, bwlq_Suf|W|IsString, { Acc, AnyMem|EsSeg, 0} }, 521b55d4692Sfgsch {"xlat", 0, 0xd7, X, 0, b_Suf|IsString, { 0, 0, 0} }, 522b55d4692Sfgsch {"xlat", 1, 0xd7, X, 0, b_Suf|IsString, { AnyMem, 0, 0} }, 5232159047fSniklas 524b305b0f1Sespie /* Bit manipulation. */ 525b55d4692Sfgsch {"bsf", 2, 0x0fbc, X, Cpu386, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 526b55d4692Sfgsch {"bsr", 2, 0x0fbd, X, Cpu386, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 527b55d4692Sfgsch {"bt", 2, 0x0fa3, X, Cpu386, wlq_Suf|Modrm, { WordReg, WordReg|WordMem, 0} }, 528b55d4692Sfgsch {"bt", 2, 0x0fba, 4, Cpu386, wlq_Suf|Modrm, { Imm8, WordReg|WordMem, 0} }, 529b55d4692Sfgsch {"btc", 2, 0x0fbb, X, Cpu386, wlq_Suf|Modrm, { WordReg, WordReg|WordMem, 0} }, 530b55d4692Sfgsch {"btc", 2, 0x0fba, 7, Cpu386, wlq_Suf|Modrm, { Imm8, WordReg|WordMem, 0} }, 531b55d4692Sfgsch {"btr", 2, 0x0fb3, X, Cpu386, wlq_Suf|Modrm, { WordReg, WordReg|WordMem, 0} }, 532b55d4692Sfgsch {"btr", 2, 0x0fba, 6, Cpu386, wlq_Suf|Modrm, { Imm8, WordReg|WordMem, 0} }, 533b55d4692Sfgsch {"bts", 2, 0x0fab, X, Cpu386, wlq_Suf|Modrm, { WordReg, WordReg|WordMem, 0} }, 534b55d4692Sfgsch {"bts", 2, 0x0fba, 5, Cpu386, wlq_Suf|Modrm, { Imm8, WordReg|WordMem, 0} }, 5352159047fSniklas 536b305b0f1Sespie /* Interrupts & op. sys insns. */ 5372159047fSniklas /* See gas/config/tc-i386.c for conversion of 'int $3' into the special 5382159047fSniklas int 3 insn. */ 5392159047fSniklas #define INT_OPCODE 0xcd 5402159047fSniklas #define INT3_OPCODE 0xcc 541b55d4692Sfgsch {"int", 1, 0xcd, X, 0, NoSuf, { Imm8, 0, 0} }, 542b55d4692Sfgsch {"int3", 0, 0xcc, X, 0, NoSuf, { 0, 0, 0} }, 543b55d4692Sfgsch {"into", 0, 0xce, X, 0, NoSuf, { 0, 0, 0} }, 544b55d4692Sfgsch {"iret", 0, 0xcf, X, 0, wlq_Suf|DefaultSize, { 0, 0, 0} }, 545b305b0f1Sespie /* i386sl, i486sl, later 486, and Pentium. */ 546b55d4692Sfgsch {"rsm", 0, 0x0faa, X, Cpu386, NoSuf, { 0, 0, 0} }, 5472159047fSniklas 548b55d4692Sfgsch {"bound", 2, 0x62, X, Cpu186, wlq_Suf|Modrm, { WordReg, WordMem, 0} }, 5492159047fSniklas 550b55d4692Sfgsch {"hlt", 0, 0xf4, X, 0, NoSuf, { 0, 0, 0} }, 551b305b0f1Sespie /* nop is actually 'xchgl %eax, %eax'. */ 552b55d4692Sfgsch {"nop", 0, 0x90, X, 0, NoSuf, { 0, 0, 0} }, 5532159047fSniklas 554b305b0f1Sespie /* Protection control. */ 555b55d4692Sfgsch {"arpl", 2, 0x63, X, Cpu286, w_Suf|Modrm|IgnoreSize,{ Reg16, Reg16|ShortMem, 0} }, 556b55d4692Sfgsch {"lar", 2, 0x0f02, X, Cpu286, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 557b55d4692Sfgsch {"lgdt", 1, 0x0f01, 2, Cpu286, wlq_Suf|Modrm, { WordMem, 0, 0} }, 558b55d4692Sfgsch {"lidt", 1, 0x0f01, 3, Cpu286, wlq_Suf|Modrm, { WordMem, 0, 0} }, 559b55d4692Sfgsch {"lldt", 1, 0x0f00, 2, Cpu286, w_Suf|Modrm|IgnoreSize,{ Reg16|ShortMem, 0, 0} }, 560b55d4692Sfgsch {"lmsw", 1, 0x0f01, 6, Cpu286, w_Suf|Modrm|IgnoreSize,{ Reg16|ShortMem, 0, 0} }, 561b55d4692Sfgsch {"lsl", 2, 0x0f03, X, Cpu286, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 562b55d4692Sfgsch {"ltr", 1, 0x0f00, 3, Cpu286, w_Suf|Modrm|IgnoreSize,{ Reg16|ShortMem, 0, 0} }, 5632159047fSniklas 564b55d4692Sfgsch {"sgdt", 1, 0x0f01, 0, Cpu286, wlq_Suf|Modrm, { WordMem, 0, 0} }, 565b55d4692Sfgsch {"sidt", 1, 0x0f01, 1, Cpu286, wlq_Suf|Modrm, { WordMem, 0, 0} }, 566c074d1c9Sdrahn {"sldt", 1, 0x0f00, 0, Cpu286, wlq_Suf|Modrm, { WordReg|InvMem, 0, 0} }, 567c074d1c9Sdrahn {"sldt", 1, 0x0f00, 0, Cpu286, w_Suf|Modrm|IgnoreSize,{ ShortMem, 0, 0} }, 568c074d1c9Sdrahn {"smsw", 1, 0x0f01, 4, Cpu286, wlq_Suf|Modrm, { WordReg|InvMem, 0, 0} }, 569c074d1c9Sdrahn {"smsw", 1, 0x0f01, 4, Cpu286, w_Suf|Modrm|IgnoreSize,{ ShortMem, 0, 0} }, 570c074d1c9Sdrahn {"str", 1, 0x0f00, 1, Cpu286, wlq_Suf|Modrm, { WordReg|InvMem, 0, 0} }, 571c074d1c9Sdrahn {"str", 1, 0x0f00, 1, Cpu286, w_Suf|Modrm|IgnoreSize,{ ShortMem, 0, 0} }, 5722159047fSniklas 573b55d4692Sfgsch {"verr", 1, 0x0f00, 4, Cpu286, w_Suf|Modrm|IgnoreSize,{ Reg16|ShortMem, 0, 0} }, 574b55d4692Sfgsch {"verw", 1, 0x0f00, 5, Cpu286, w_Suf|Modrm|IgnoreSize,{ Reg16|ShortMem, 0, 0} }, 5752159047fSniklas 576b305b0f1Sespie /* Floating point instructions. */ 5772159047fSniklas 5782159047fSniklas /* load */ 579b55d4692Sfgsch {"fld", 1, 0xd9c0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 580b55d4692Sfgsch {"fld", 1, 0xd9, 0, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 581b55d4692Sfgsch {"fld", 1, 0xd9c0, X, 0, l_FP|ShortForm|Ugh, { FloatReg, 0, 0} }, 582b305b0f1Sespie /* Intel Syntax */ 583b55d4692Sfgsch {"fld", 1, 0xdb, 5, 0, x_FP|Modrm, { LLongMem, 0, 0} }, 584b55d4692Sfgsch {"fild", 1, 0xdf, 0, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 585b305b0f1Sespie /* Intel Syntax */ 586b55d4692Sfgsch {"fildd", 1, 0xdf, 5, 0, FP|Modrm, { LLongMem, 0, 0} }, 587b55d4692Sfgsch {"fildq", 1, 0xdf, 5, 0, FP|Modrm, { LLongMem, 0, 0} }, 588b55d4692Sfgsch {"fildll", 1, 0xdf, 5, 0, FP|Modrm, { LLongMem, 0, 0} }, 589b55d4692Sfgsch {"fldt", 1, 0xdb, 5, 0, FP|Modrm, { LLongMem, 0, 0} }, 590b55d4692Sfgsch {"fbld", 1, 0xdf, 4, 0, FP|Modrm, { LLongMem, 0, 0} }, 5912159047fSniklas 5922159047fSniklas /* store (no pop) */ 593b55d4692Sfgsch {"fst", 1, 0xddd0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 594b55d4692Sfgsch {"fst", 1, 0xd9, 2, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 595b55d4692Sfgsch {"fst", 1, 0xddd0, X, 0, l_FP|ShortForm|Ugh, { FloatReg, 0, 0} }, 596b55d4692Sfgsch {"fist", 1, 0xdf, 2, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 5972159047fSniklas 5982159047fSniklas /* store (with pop) */ 599b55d4692Sfgsch {"fstp", 1, 0xddd8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 600b55d4692Sfgsch {"fstp", 1, 0xd9, 3, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 601b55d4692Sfgsch {"fstp", 1, 0xddd8, X, 0, l_FP|ShortForm|Ugh, { FloatReg, 0, 0} }, 602b305b0f1Sespie /* Intel Syntax */ 603b55d4692Sfgsch {"fstp", 1, 0xdb, 7, 0, x_FP|Modrm, { LLongMem, 0, 0} }, 604b55d4692Sfgsch {"fistp", 1, 0xdf, 3, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 605b305b0f1Sespie /* Intel Syntax */ 606b55d4692Sfgsch {"fistpd", 1, 0xdf, 7, 0, FP|Modrm, { LLongMem, 0, 0} }, 607b55d4692Sfgsch {"fistpq", 1, 0xdf, 7, 0, FP|Modrm, { LLongMem, 0, 0} }, 608b55d4692Sfgsch {"fistpll",1, 0xdf, 7, 0, FP|Modrm, { LLongMem, 0, 0} }, 609b55d4692Sfgsch {"fstpt", 1, 0xdb, 7, 0, FP|Modrm, { LLongMem, 0, 0} }, 610b55d4692Sfgsch {"fbstp", 1, 0xdf, 6, 0, FP|Modrm, { LLongMem, 0, 0} }, 6112159047fSniklas 6122159047fSniklas /* exchange %st<n> with %st0 */ 613b55d4692Sfgsch {"fxch", 1, 0xd9c8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 614b305b0f1Sespie /* alias for fxch %st(1) */ 615b55d4692Sfgsch {"fxch", 0, 0xd9c9, X, 0, FP, { 0, 0, 0} }, 6162159047fSniklas 6172159047fSniklas /* comparison (without pop) */ 618b55d4692Sfgsch {"fcom", 1, 0xd8d0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 619b305b0f1Sespie /* alias for fcom %st(1) */ 620b55d4692Sfgsch {"fcom", 0, 0xd8d1, X, 0, FP, { 0, 0, 0} }, 621b55d4692Sfgsch {"fcom", 1, 0xd8, 2, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 622b55d4692Sfgsch {"fcom", 1, 0xd8d0, X, 0, l_FP|ShortForm|Ugh, { FloatReg, 0, 0} }, 623b55d4692Sfgsch {"ficom", 1, 0xde, 2, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 6242159047fSniklas 6252159047fSniklas /* comparison (with pop) */ 626b55d4692Sfgsch {"fcomp", 1, 0xd8d8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 627b305b0f1Sespie /* alias for fcomp %st(1) */ 628b55d4692Sfgsch {"fcomp", 0, 0xd8d9, X, 0, FP, { 0, 0, 0} }, 629b55d4692Sfgsch {"fcomp", 1, 0xd8, 3, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 630b55d4692Sfgsch {"fcomp", 1, 0xd8d8, X, 0, l_FP|ShortForm|Ugh, { FloatReg, 0, 0} }, 631b55d4692Sfgsch {"ficomp", 1, 0xde, 3, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 632b55d4692Sfgsch {"fcompp", 0, 0xded9, X, 0, FP, { 0, 0, 0} }, 6332159047fSniklas 6342159047fSniklas /* unordered comparison (with pop) */ 635b55d4692Sfgsch {"fucom", 1, 0xdde0, X, Cpu286, FP|ShortForm, { FloatReg, 0, 0} }, 636b305b0f1Sespie /* alias for fucom %st(1) */ 637b55d4692Sfgsch {"fucom", 0, 0xdde1, X, Cpu286, FP, { 0, 0, 0} }, 638b55d4692Sfgsch {"fucomp", 1, 0xdde8, X, Cpu286, FP|ShortForm, { FloatReg, 0, 0} }, 639b305b0f1Sespie /* alias for fucomp %st(1) */ 640b55d4692Sfgsch {"fucomp", 0, 0xdde9, X, Cpu286, FP, { 0, 0, 0} }, 641b55d4692Sfgsch {"fucompp",0, 0xdae9, X, Cpu286, FP, { 0, 0, 0} }, 6422159047fSniklas 643b55d4692Sfgsch {"ftst", 0, 0xd9e4, X, 0, FP, { 0, 0, 0} }, 644b55d4692Sfgsch {"fxam", 0, 0xd9e5, X, 0, FP, { 0, 0, 0} }, 6452159047fSniklas 6462159047fSniklas /* load constants into %st0 */ 647b55d4692Sfgsch {"fld1", 0, 0xd9e8, X, 0, FP, { 0, 0, 0} }, 648b55d4692Sfgsch {"fldl2t", 0, 0xd9e9, X, 0, FP, { 0, 0, 0} }, 649b55d4692Sfgsch {"fldl2e", 0, 0xd9ea, X, 0, FP, { 0, 0, 0} }, 650b55d4692Sfgsch {"fldpi", 0, 0xd9eb, X, 0, FP, { 0, 0, 0} }, 651b55d4692Sfgsch {"fldlg2", 0, 0xd9ec, X, 0, FP, { 0, 0, 0} }, 652b55d4692Sfgsch {"fldln2", 0, 0xd9ed, X, 0, FP, { 0, 0, 0} }, 653b55d4692Sfgsch {"fldz", 0, 0xd9ee, X, 0, FP, { 0, 0, 0} }, 6542159047fSniklas 6552159047fSniklas /* arithmetic */ 6562159047fSniklas 6572159047fSniklas /* add */ 658b55d4692Sfgsch {"fadd", 2, 0xd8c0, X, 0, FP|ShortForm|FloatD, { FloatReg, FloatAcc, 0} }, 659b305b0f1Sespie /* alias for fadd %st(i), %st */ 660b55d4692Sfgsch {"fadd", 1, 0xd8c0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 661b305b0f1Sespie #if SYSV386_COMPAT 662b305b0f1Sespie /* alias for faddp */ 663b55d4692Sfgsch {"fadd", 0, 0xdec1, X, 0, FP|Ugh, { 0, 0, 0} }, 664b305b0f1Sespie #endif 665b55d4692Sfgsch {"fadd", 1, 0xd8, 0, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 666b55d4692Sfgsch {"fiadd", 1, 0xde, 0, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 6672159047fSniklas 668b55d4692Sfgsch {"faddp", 2, 0xdec0, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 669b55d4692Sfgsch {"faddp", 1, 0xdec0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 670b305b0f1Sespie /* alias for faddp %st, %st(1) */ 671b55d4692Sfgsch {"faddp", 0, 0xdec1, X, 0, FP, { 0, 0, 0} }, 672b55d4692Sfgsch {"faddp", 2, 0xdec0, X, 0, FP|ShortForm|Ugh, { FloatReg, FloatAcc, 0} }, 6732159047fSniklas 674b305b0f1Sespie /* subtract */ 675b55d4692Sfgsch {"fsub", 2, 0xd8e0, X, 0, FP|ShortForm|FloatDR, { FloatReg, FloatAcc, 0} }, 676b55d4692Sfgsch {"fsub", 1, 0xd8e0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 677b305b0f1Sespie #if SYSV386_COMPAT 678b305b0f1Sespie /* alias for fsubp */ 679b55d4692Sfgsch {"fsub", 0, 0xdee1, X, 0, FP|Ugh, { 0, 0, 0} }, 6802159047fSniklas #endif 681b55d4692Sfgsch {"fsub", 1, 0xd8, 4, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 682b55d4692Sfgsch {"fisub", 1, 0xde, 4, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 6832159047fSniklas 684b305b0f1Sespie #if SYSV386_COMPAT 685b55d4692Sfgsch {"fsubp", 2, 0xdee0, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 686b55d4692Sfgsch {"fsubp", 1, 0xdee0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 687b55d4692Sfgsch {"fsubp", 0, 0xdee1, X, 0, FP, { 0, 0, 0} }, 688b305b0f1Sespie #if OLDGCC_COMPAT 689b55d4692Sfgsch {"fsubp", 2, 0xdee0, X, 0, FP|ShortForm|Ugh, { FloatReg, FloatAcc, 0} }, 6902159047fSniklas #endif 6912159047fSniklas #else 692b55d4692Sfgsch {"fsubp", 2, 0xdee8, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 693b55d4692Sfgsch {"fsubp", 1, 0xdee8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 694b55d4692Sfgsch {"fsubp", 0, 0xdee9, X, 0, FP, { 0, 0, 0} }, 6952159047fSniklas #endif 6962159047fSniklas 697b305b0f1Sespie /* subtract reverse */ 698b55d4692Sfgsch {"fsubr", 2, 0xd8e8, X, 0, FP|ShortForm|FloatDR, { FloatReg, FloatAcc, 0} }, 699b55d4692Sfgsch {"fsubr", 1, 0xd8e8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 700b305b0f1Sespie #if SYSV386_COMPAT 701b305b0f1Sespie /* alias for fsubrp */ 702b55d4692Sfgsch {"fsubr", 0, 0xdee9, X, 0, FP|Ugh, { 0, 0, 0} }, 703b305b0f1Sespie #endif 704b55d4692Sfgsch {"fsubr", 1, 0xd8, 5, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 705b55d4692Sfgsch {"fisubr", 1, 0xde, 5, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 706b305b0f1Sespie 707b305b0f1Sespie #if SYSV386_COMPAT 708b55d4692Sfgsch {"fsubrp", 2, 0xdee8, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 709b55d4692Sfgsch {"fsubrp", 1, 0xdee8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 710b55d4692Sfgsch {"fsubrp", 0, 0xdee9, X, 0, FP, { 0, 0, 0} }, 711b305b0f1Sespie #if OLDGCC_COMPAT 712b55d4692Sfgsch {"fsubrp", 2, 0xdee8, X, 0, FP|ShortForm|Ugh, { FloatReg, FloatAcc, 0} }, 713b305b0f1Sespie #endif 7142159047fSniklas #else 715b55d4692Sfgsch {"fsubrp", 2, 0xdee0, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 716b55d4692Sfgsch {"fsubrp", 1, 0xdee0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 717b55d4692Sfgsch {"fsubrp", 0, 0xdee1, X, 0, FP, { 0, 0, 0} }, 7182159047fSniklas #endif 719b305b0f1Sespie 720b305b0f1Sespie /* multiply */ 721b55d4692Sfgsch {"fmul", 2, 0xd8c8, X, 0, FP|ShortForm|FloatD, { FloatReg, FloatAcc, 0} }, 722b55d4692Sfgsch {"fmul", 1, 0xd8c8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 723b305b0f1Sespie #if SYSV386_COMPAT 724b305b0f1Sespie /* alias for fmulp */ 725b55d4692Sfgsch {"fmul", 0, 0xdec9, X, 0, FP|Ugh, { 0, 0, 0} }, 726b305b0f1Sespie #endif 727b55d4692Sfgsch {"fmul", 1, 0xd8, 1, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 728b55d4692Sfgsch {"fimul", 1, 0xde, 1, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 729b305b0f1Sespie 730b55d4692Sfgsch {"fmulp", 2, 0xdec8, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 731b55d4692Sfgsch {"fmulp", 1, 0xdec8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 732b55d4692Sfgsch {"fmulp", 0, 0xdec9, X, 0, FP, { 0, 0, 0} }, 733b55d4692Sfgsch {"fmulp", 2, 0xdec8, X, 0, FP|ShortForm|Ugh, { FloatReg, FloatAcc, 0} }, 734b305b0f1Sespie 735b305b0f1Sespie /* divide */ 736b55d4692Sfgsch {"fdiv", 2, 0xd8f0, X, 0, FP|ShortForm|FloatDR, { FloatReg, FloatAcc, 0} }, 737b55d4692Sfgsch {"fdiv", 1, 0xd8f0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 738b305b0f1Sespie #if SYSV386_COMPAT 739b305b0f1Sespie /* alias for fdivp */ 740b55d4692Sfgsch {"fdiv", 0, 0xdef1, X, 0, FP|Ugh, { 0, 0, 0} }, 741b305b0f1Sespie #endif 742b55d4692Sfgsch {"fdiv", 1, 0xd8, 6, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 743b55d4692Sfgsch {"fidiv", 1, 0xde, 6, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 744b305b0f1Sespie 745b305b0f1Sespie #if SYSV386_COMPAT 746b55d4692Sfgsch {"fdivp", 2, 0xdef0, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 747b55d4692Sfgsch {"fdivp", 1, 0xdef0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 748b55d4692Sfgsch {"fdivp", 0, 0xdef1, X, 0, FP, { 0, 0, 0} }, 749b305b0f1Sespie #if OLDGCC_COMPAT 750b55d4692Sfgsch {"fdivp", 2, 0xdef0, X, 0, FP|ShortForm|Ugh, { FloatReg, FloatAcc, 0} }, 751b305b0f1Sespie #endif 7522159047fSniklas #else 753b55d4692Sfgsch {"fdivp", 2, 0xdef8, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 754b55d4692Sfgsch {"fdivp", 1, 0xdef8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 755b55d4692Sfgsch {"fdivp", 0, 0xdef9, X, 0, FP, { 0, 0, 0} }, 7562159047fSniklas #endif 7572159047fSniklas 758b305b0f1Sespie /* divide reverse */ 759b55d4692Sfgsch {"fdivr", 2, 0xd8f8, X, 0, FP|ShortForm|FloatDR, { FloatReg, FloatAcc, 0} }, 760b55d4692Sfgsch {"fdivr", 1, 0xd8f8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 761b305b0f1Sespie #if SYSV386_COMPAT 762b305b0f1Sespie /* alias for fdivrp */ 763b55d4692Sfgsch {"fdivr", 0, 0xdef9, X, 0, FP|Ugh, { 0, 0, 0} }, 764b305b0f1Sespie #endif 765b55d4692Sfgsch {"fdivr", 1, 0xd8, 7, 0, sl_FP|FloatMF|Modrm, { LongMem|LLongMem, 0, 0} }, 766b55d4692Sfgsch {"fidivr", 1, 0xde, 7, 0, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 7672159047fSniklas 768b305b0f1Sespie #if SYSV386_COMPAT 769b55d4692Sfgsch {"fdivrp", 2, 0xdef8, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 770b55d4692Sfgsch {"fdivrp", 1, 0xdef8, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 771b55d4692Sfgsch {"fdivrp", 0, 0xdef9, X, 0, FP, { 0, 0, 0} }, 772b305b0f1Sespie #if OLDGCC_COMPAT 773b55d4692Sfgsch {"fdivrp", 2, 0xdef8, X, 0, FP|ShortForm|Ugh, { FloatReg, FloatAcc, 0} }, 774b305b0f1Sespie #endif 775b305b0f1Sespie #else 776b55d4692Sfgsch {"fdivrp", 2, 0xdef0, X, 0, FP|ShortForm, { FloatAcc, FloatReg, 0} }, 777b55d4692Sfgsch {"fdivrp", 1, 0xdef0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 778b55d4692Sfgsch {"fdivrp", 0, 0xdef1, X, 0, FP, { 0, 0, 0} }, 779b305b0f1Sespie #endif 780b305b0f1Sespie 781b55d4692Sfgsch {"f2xm1", 0, 0xd9f0, X, 0, FP, { 0, 0, 0} }, 782b55d4692Sfgsch {"fyl2x", 0, 0xd9f1, X, 0, FP, { 0, 0, 0} }, 783b55d4692Sfgsch {"fptan", 0, 0xd9f2, X, 0, FP, { 0, 0, 0} }, 784b55d4692Sfgsch {"fpatan", 0, 0xd9f3, X, 0, FP, { 0, 0, 0} }, 785b55d4692Sfgsch {"fxtract",0, 0xd9f4, X, 0, FP, { 0, 0, 0} }, 786b55d4692Sfgsch {"fprem1", 0, 0xd9f5, X, Cpu286, FP, { 0, 0, 0} }, 787b55d4692Sfgsch {"fdecstp",0, 0xd9f6, X, 0, FP, { 0, 0, 0} }, 788b55d4692Sfgsch {"fincstp",0, 0xd9f7, X, 0, FP, { 0, 0, 0} }, 789b55d4692Sfgsch {"fprem", 0, 0xd9f8, X, 0, FP, { 0, 0, 0} }, 790b55d4692Sfgsch {"fyl2xp1",0, 0xd9f9, X, 0, FP, { 0, 0, 0} }, 791b55d4692Sfgsch {"fsqrt", 0, 0xd9fa, X, 0, FP, { 0, 0, 0} }, 792b55d4692Sfgsch {"fsincos",0, 0xd9fb, X, Cpu286, FP, { 0, 0, 0} }, 793b55d4692Sfgsch {"frndint",0, 0xd9fc, X, 0, FP, { 0, 0, 0} }, 794b55d4692Sfgsch {"fscale", 0, 0xd9fd, X, 0, FP, { 0, 0, 0} }, 795b55d4692Sfgsch {"fsin", 0, 0xd9fe, X, Cpu286, FP, { 0, 0, 0} }, 796b55d4692Sfgsch {"fcos", 0, 0xd9ff, X, Cpu286, FP, { 0, 0, 0} }, 797b55d4692Sfgsch {"fchs", 0, 0xd9e0, X, 0, FP, { 0, 0, 0} }, 798b55d4692Sfgsch {"fabs", 0, 0xd9e1, X, 0, FP, { 0, 0, 0} }, 7992159047fSniklas 8002159047fSniklas /* processor control */ 801b55d4692Sfgsch {"fninit", 0, 0xdbe3, X, 0, FP, { 0, 0, 0} }, 802b55d4692Sfgsch {"finit", 0, 0xdbe3, X, 0, FP|FWait, { 0, 0, 0} }, 803b55d4692Sfgsch {"fldcw", 1, 0xd9, 5, 0, FP|Modrm, { ShortMem, 0, 0} }, 804b55d4692Sfgsch {"fnstcw", 1, 0xd9, 7, 0, FP|Modrm, { ShortMem, 0, 0} }, 805b55d4692Sfgsch {"fstcw", 1, 0xd9, 7, 0, FP|FWait|Modrm, { ShortMem, 0, 0} }, 806b55d4692Sfgsch {"fnstsw", 1, 0xdfe0, X, 0, FP, { Acc, 0, 0} }, 807b55d4692Sfgsch {"fnstsw", 1, 0xdd, 7, 0, FP|Modrm, { ShortMem, 0, 0} }, 808b55d4692Sfgsch {"fnstsw", 0, 0xdfe0, X, 0, FP, { 0, 0, 0} }, 809b55d4692Sfgsch {"fstsw", 1, 0xdfe0, X, 0, FP|FWait, { Acc, 0, 0} }, 810b55d4692Sfgsch {"fstsw", 1, 0xdd, 7, 0, FP|FWait|Modrm, { ShortMem, 0, 0} }, 811b55d4692Sfgsch {"fstsw", 0, 0xdfe0, X, 0, FP|FWait, { 0, 0, 0} }, 812b55d4692Sfgsch {"fnclex", 0, 0xdbe2, X, 0, FP, { 0, 0, 0} }, 813b55d4692Sfgsch {"fclex", 0, 0xdbe2, X, 0, FP|FWait, { 0, 0, 0} }, 814b305b0f1Sespie /* Short forms of fldenv, fstenv use data size prefix. */ 815b55d4692Sfgsch {"fnstenv",1, 0xd9, 6, 0, sl_Suf|Modrm, { LLongMem, 0, 0} }, 816b55d4692Sfgsch {"fstenv", 1, 0xd9, 6, 0, sl_Suf|FWait|Modrm, { LLongMem, 0, 0} }, 817b55d4692Sfgsch {"fldenv", 1, 0xd9, 4, 0, sl_Suf|Modrm, { LLongMem, 0, 0} }, 818b55d4692Sfgsch {"fnsave", 1, 0xdd, 6, 0, sl_Suf|Modrm, { LLongMem, 0, 0} }, 819b55d4692Sfgsch {"fsave", 1, 0xdd, 6, 0, sl_Suf|FWait|Modrm, { LLongMem, 0, 0} }, 820b55d4692Sfgsch {"frstor", 1, 0xdd, 4, 0, sl_Suf|Modrm, { LLongMem, 0, 0} }, 8212159047fSniklas 822b55d4692Sfgsch {"ffree", 1, 0xddc0, X, 0, FP|ShortForm, { FloatReg, 0, 0} }, 8230c6d0228Sniklas /* P6:free st(i), pop st */ 824b55d4692Sfgsch {"ffreep", 1, 0xdfc0, X, Cpu686, FP|ShortForm, { FloatReg, 0, 0} }, 825b55d4692Sfgsch {"fnop", 0, 0xd9d0, X, 0, FP, { 0, 0, 0} }, 826b305b0f1Sespie #define FWAIT_OPCODE 0x9b 827b55d4692Sfgsch {"fwait", 0, 0x9b, X, 0, FP, { 0, 0, 0} }, 8282159047fSniklas 829b305b0f1Sespie /* Opcode prefixes; we allow them as separate insns too. */ 8302159047fSniklas 831b305b0f1Sespie #define ADDR_PREFIX_OPCODE 0x67 832b55d4692Sfgsch {"addr16", 0, 0x67, X, Cpu386, NoSuf|IsPrefix|Size16|IgnoreSize, { 0, 0, 0} }, 833b55d4692Sfgsch {"addr32", 0, 0x67, X, Cpu386, NoSuf|IsPrefix|Size32|IgnoreSize, { 0, 0, 0} }, 834b55d4692Sfgsch {"aword", 0, 0x67, X, Cpu386, NoSuf|IsPrefix|Size16|IgnoreSize, { 0, 0, 0} }, 835b55d4692Sfgsch {"adword", 0, 0x67, X, Cpu386, NoSuf|IsPrefix|Size32|IgnoreSize, { 0, 0, 0} }, 836b305b0f1Sespie #define DATA_PREFIX_OPCODE 0x66 837b55d4692Sfgsch {"data16", 0, 0x66, X, Cpu386, NoSuf|IsPrefix|Size16|IgnoreSize, { 0, 0, 0} }, 838b55d4692Sfgsch {"data32", 0, 0x66, X, Cpu386, NoSuf|IsPrefix|Size32|IgnoreSize, { 0, 0, 0} }, 839b55d4692Sfgsch {"word", 0, 0x66, X, Cpu386, NoSuf|IsPrefix|Size16|IgnoreSize, { 0, 0, 0} }, 840b55d4692Sfgsch {"dword", 0, 0x66, X, Cpu386, NoSuf|IsPrefix|Size32|IgnoreSize, { 0, 0, 0} }, 841b305b0f1Sespie #define LOCK_PREFIX_OPCODE 0xf0 842b55d4692Sfgsch {"lock", 0, 0xf0, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 843b55d4692Sfgsch {"wait", 0, 0x9b, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 844b305b0f1Sespie #define CS_PREFIX_OPCODE 0x2e 845b55d4692Sfgsch {"cs", 0, 0x2e, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 846b305b0f1Sespie #define DS_PREFIX_OPCODE 0x3e 847b55d4692Sfgsch {"ds", 0, 0x3e, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 848b305b0f1Sespie #define ES_PREFIX_OPCODE 0x26 849b55d4692Sfgsch {"es", 0, 0x26, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 850b305b0f1Sespie #define FS_PREFIX_OPCODE 0x64 851b55d4692Sfgsch {"fs", 0, 0x64, X, Cpu386, NoSuf|IsPrefix, { 0, 0, 0} }, 852b305b0f1Sespie #define GS_PREFIX_OPCODE 0x65 853b55d4692Sfgsch {"gs", 0, 0x65, X, Cpu386, NoSuf|IsPrefix, { 0, 0, 0} }, 854b305b0f1Sespie #define SS_PREFIX_OPCODE 0x36 855b55d4692Sfgsch {"ss", 0, 0x36, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 856b305b0f1Sespie #define REPNE_PREFIX_OPCODE 0xf2 857b305b0f1Sespie #define REPE_PREFIX_OPCODE 0xf3 858b55d4692Sfgsch {"rep", 0, 0xf3, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 859b55d4692Sfgsch {"repe", 0, 0xf3, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 860b55d4692Sfgsch {"repz", 0, 0xf3, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 861b55d4692Sfgsch {"repne", 0, 0xf2, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 862b55d4692Sfgsch {"repnz", 0, 0xf2, X, 0, NoSuf|IsPrefix, { 0, 0, 0} }, 863b55d4692Sfgsch {"rex", 0, 0x40, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 864b55d4692Sfgsch {"rexz", 0, 0x41, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 865b55d4692Sfgsch {"rexy", 0, 0x42, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 866b55d4692Sfgsch {"rexyz", 0, 0x43, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 867b55d4692Sfgsch {"rexx", 0, 0x44, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 868b55d4692Sfgsch {"rexxz", 0, 0x45, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 869b55d4692Sfgsch {"rexxy", 0, 0x46, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 870b55d4692Sfgsch {"rexxyz", 0, 0x47, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 871b55d4692Sfgsch {"rex64", 0, 0x48, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 872b55d4692Sfgsch {"rex64z", 0, 0x49, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 873b55d4692Sfgsch {"rex64y", 0, 0x4a, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 874b55d4692Sfgsch {"rex64yz",0, 0x4b, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 875b55d4692Sfgsch {"rex64x", 0, 0x4c, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 876b55d4692Sfgsch {"rex64xz",0, 0x4d, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 877b55d4692Sfgsch {"rex64xy",0, 0x4e, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 878b55d4692Sfgsch {"rex64xyz",0, 0x4f, X, Cpu64, NoSuf|IsPrefix, { 0, 0, 0} }, 8792159047fSniklas 880b305b0f1Sespie /* 486 extensions. */ 8812159047fSniklas 882b55d4692Sfgsch {"bswap", 1, 0x0fc8, X, Cpu486, lq_Suf|ShortForm, { Reg32|Reg64, 0, 0 } }, 883b55d4692Sfgsch {"xadd", 2, 0x0fc0, X, Cpu486, bwlq_Suf|W|Modrm, { Reg, Reg|AnyMem, 0 } }, 884b55d4692Sfgsch {"cmpxchg", 2, 0x0fb0, X, Cpu486, bwlq_Suf|W|Modrm, { Reg, Reg|AnyMem, 0 } }, 885b55d4692Sfgsch {"invd", 0, 0x0f08, X, Cpu486, NoSuf, { 0, 0, 0} }, 886b55d4692Sfgsch {"wbinvd", 0, 0x0f09, X, Cpu486, NoSuf, { 0, 0, 0} }, 887b55d4692Sfgsch {"invlpg", 1, 0x0f01, 7, Cpu486, NoSuf|Modrm, { AnyMem, 0, 0} }, 8882159047fSniklas 889b305b0f1Sespie /* 586 and late 486 extensions. */ 890b55d4692Sfgsch {"cpuid", 0, 0x0fa2, X, Cpu486, NoSuf, { 0, 0, 0} }, 8912159047fSniklas 892b305b0f1Sespie /* Pentium extensions. */ 893b55d4692Sfgsch {"wrmsr", 0, 0x0f30, X, Cpu586, NoSuf, { 0, 0, 0} }, 894b55d4692Sfgsch {"rdtsc", 0, 0x0f31, X, Cpu586, NoSuf, { 0, 0, 0} }, 895b55d4692Sfgsch {"rdmsr", 0, 0x0f32, X, Cpu586, NoSuf, { 0, 0, 0} }, 896b55d4692Sfgsch {"cmpxchg8b",1,0x0fc7, 1, Cpu586, NoSuf|Modrm, { LLongMem, 0, 0} }, 897c88b1d6cSniklas 898b305b0f1Sespie /* Pentium II/Pentium Pro extensions. */ 899007c2a45Smiod {"sysenter",0, 0x0f34, X, Cpu686, NoSuf, { 0, 0, 0} }, 900007c2a45Smiod {"sysexit", 0, 0x0f35, X, Cpu686, NoSuf, { 0, 0, 0} }, 901b55d4692Sfgsch {"fxsave", 1, 0x0fae, 0, Cpu686, FP|Modrm, { LLongMem, 0, 0} }, 902b55d4692Sfgsch {"fxrstor", 1, 0x0fae, 1, Cpu686, FP|Modrm, { LLongMem, 0, 0} }, 903b55d4692Sfgsch {"rdpmc", 0, 0x0f33, X, Cpu686, NoSuf, { 0, 0, 0} }, 904b305b0f1Sespie /* official undefined instr. */ 905b55d4692Sfgsch {"ud2", 0, 0x0f0b, X, Cpu686, NoSuf, { 0, 0, 0} }, 906b305b0f1Sespie /* alias for ud2 */ 907b55d4692Sfgsch {"ud2a", 0, 0x0f0b, X, Cpu686, NoSuf, { 0, 0, 0} }, 908b305b0f1Sespie /* 2nd. official undefined instr. */ 909b55d4692Sfgsch {"ud2b", 0, 0x0fb9, X, Cpu686, NoSuf, { 0, 0, 0} }, 910c88b1d6cSniklas 91103da0ce4Sderaadt /* VIA C3 extensions */ 91203da0ce4Sderaadt {"xstore-rng",0, 0x0fa7, 0xc0, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 91303da0ce4Sderaadt {"xcrypt-ecb",0, 0x0fa7, 0xc8, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 91403da0ce4Sderaadt {"xcrypt-cbc",0, 0x0fa7, 0xd0, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 9157e5efb86Shshoexer {"xcrypt-ctr",0, 0x0fa7, 0xd8, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 91603da0ce4Sderaadt {"xcrypt-cfb",0, 0x0fa7, 0xe0, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 91703da0ce4Sderaadt {"xcrypt-ofb",0, 0x0fa7, 0xe8, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 91803da0ce4Sderaadt 9197e5efb86Shshoexer {"montmul",0, 0x0fa6, 0xc0, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 9207e5efb86Shshoexer {"xsha1",0, 0x0fa6, 0xc8, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 9217e5efb86Shshoexer {"xsha256",0, 0x0fa6, 0xd0, Cpu686, ImmExt|NoSuf|IsString, { 0, 0, 0} }, 9227e5efb86Shshoexer 9237e5efb86Shshoexer 924b55d4692Sfgsch {"cmovo", 2, 0x0f40, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 925b55d4692Sfgsch {"cmovno", 2, 0x0f41, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 926b55d4692Sfgsch {"cmovb", 2, 0x0f42, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 927b55d4692Sfgsch {"cmovc", 2, 0x0f42, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 928b55d4692Sfgsch {"cmovnae", 2, 0x0f42, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 929b55d4692Sfgsch {"cmovae", 2, 0x0f43, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 930b55d4692Sfgsch {"cmovnc", 2, 0x0f43, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 931b55d4692Sfgsch {"cmovnb", 2, 0x0f43, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 932b55d4692Sfgsch {"cmove", 2, 0x0f44, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 933b55d4692Sfgsch {"cmovz", 2, 0x0f44, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 934b55d4692Sfgsch {"cmovne", 2, 0x0f45, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 935b55d4692Sfgsch {"cmovnz", 2, 0x0f45, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 936b55d4692Sfgsch {"cmovbe", 2, 0x0f46, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 937b55d4692Sfgsch {"cmovna", 2, 0x0f46, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 938b55d4692Sfgsch {"cmova", 2, 0x0f47, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 939b55d4692Sfgsch {"cmovnbe", 2, 0x0f47, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 940b55d4692Sfgsch {"cmovs", 2, 0x0f48, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 941b55d4692Sfgsch {"cmovns", 2, 0x0f49, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 942b55d4692Sfgsch {"cmovp", 2, 0x0f4a, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 943b55d4692Sfgsch {"cmovnp", 2, 0x0f4b, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 944b55d4692Sfgsch {"cmovl", 2, 0x0f4c, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 945b55d4692Sfgsch {"cmovnge", 2, 0x0f4c, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 946b55d4692Sfgsch {"cmovge", 2, 0x0f4d, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 947b55d4692Sfgsch {"cmovnl", 2, 0x0f4d, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 948b55d4692Sfgsch {"cmovle", 2, 0x0f4e, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 949b55d4692Sfgsch {"cmovng", 2, 0x0f4e, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 950b55d4692Sfgsch {"cmovg", 2, 0x0f4f, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 951b55d4692Sfgsch {"cmovnle", 2, 0x0f4f, X, Cpu686, wlq_Suf|Modrm, { WordReg|WordMem, WordReg, 0} }, 952c88b1d6cSniklas 953b55d4692Sfgsch {"fcmovb", 2, 0xdac0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 954b55d4692Sfgsch {"fcmovnae",2, 0xdac0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 955b55d4692Sfgsch {"fcmove", 2, 0xdac8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 956b55d4692Sfgsch {"fcmovbe", 2, 0xdad0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 957b55d4692Sfgsch {"fcmovna", 2, 0xdad0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 958b55d4692Sfgsch {"fcmovu", 2, 0xdad8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 959b55d4692Sfgsch {"fcmovae", 2, 0xdbc0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 960b55d4692Sfgsch {"fcmovnb", 2, 0xdbc0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 961b55d4692Sfgsch {"fcmovne", 2, 0xdbc8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 962b55d4692Sfgsch {"fcmova", 2, 0xdbd0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 963b55d4692Sfgsch {"fcmovnbe",2, 0xdbd0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 964b55d4692Sfgsch {"fcmovnu", 2, 0xdbd8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 965c88b1d6cSniklas 966b55d4692Sfgsch {"fcomi", 2, 0xdbf0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 967b55d4692Sfgsch {"fcomi", 0, 0xdbf1, X, Cpu686, FP|ShortForm, { 0, 0, 0} }, 968b55d4692Sfgsch {"fcomi", 1, 0xdbf0, X, Cpu686, FP|ShortForm, { FloatReg, 0, 0} }, 969b55d4692Sfgsch {"fucomi", 2, 0xdbe8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 970b55d4692Sfgsch {"fucomi", 0, 0xdbe9, X, Cpu686, FP|ShortForm, { 0, 0, 0} }, 971b55d4692Sfgsch {"fucomi", 1, 0xdbe8, X, Cpu686, FP|ShortForm, { FloatReg, 0, 0} }, 972b55d4692Sfgsch {"fcomip", 2, 0xdff0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 973b55d4692Sfgsch {"fcompi", 2, 0xdff0, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 974b55d4692Sfgsch {"fcompi", 0, 0xdff1, X, Cpu686, FP|ShortForm, { 0, 0, 0} }, 975b55d4692Sfgsch {"fcompi", 1, 0xdff0, X, Cpu686, FP|ShortForm, { FloatReg, 0, 0} }, 976b55d4692Sfgsch {"fucomip", 2, 0xdfe8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 977dab0f388Smiod {"fucomip", 0, 0xdfe9, X, Cpu686, FP|ShortForm, { 0, 0, 0} }, 978dab0f388Smiod {"fucomip", 1, 0xdfe8, X, Cpu686, FP|ShortForm, { FloatReg, 0, 0} }, 979b55d4692Sfgsch {"fucompi", 2, 0xdfe8, X, Cpu686, FP|ShortForm, { FloatReg, FloatAcc, 0} }, 980b55d4692Sfgsch {"fucompi", 0, 0xdfe9, X, Cpu686, FP|ShortForm, { 0, 0, 0} }, 981b55d4692Sfgsch {"fucompi", 1, 0xdfe8, X, Cpu686, FP|ShortForm, { FloatReg, 0, 0} }, 982b305b0f1Sespie 983b55d4692Sfgsch /* Pentium4 extensions. */ 984b305b0f1Sespie 985b55d4692Sfgsch {"movnti", 2, 0x0fc3, X, CpuP4, FP|Modrm, { WordReg, WordMem, 0 } }, 986b55d4692Sfgsch {"clflush", 1, 0x0fae, 7, CpuP4, FP|Modrm, { ByteMem, 0, 0 } }, 987b55d4692Sfgsch {"lfence", 0, 0x0fae, 0xe8, CpuP4, FP|ImmExt, { 0, 0, 0 } }, 988b55d4692Sfgsch {"mfence", 0, 0x0fae, 0xf0, CpuP4, FP|ImmExt, { 0, 0, 0 } }, 989b55d4692Sfgsch {"pause", 0, 0xf390, X, CpuP4, FP, { 0, 0, 0 } }, 990b305b0f1Sespie 991b55d4692Sfgsch /* MMX/SSE2 instructions. */ 992b55d4692Sfgsch 993b55d4692Sfgsch {"emms", 0, 0x0f77, X, CpuMMX, FP, { 0, 0, 0 } }, 994847c9f5dSkettenis /* These really shouldn't allow for Reg64 (movq is the right mnemonic for 995847c9f5dSkettenis copying between Reg64/Mem64 and RegXMM/RegMMX, as is mandated by Intel's 996847c9f5dSkettenis spec). AMD's spec, having been in existence for much longer, failed to 997847c9f5dSkettenis recognize that and specified movd for 32- and 64-bit operations. */ 998847c9f5dSkettenis {"movd", 2, 0x0f6e, X, CpuMMX, FP|Modrm, { Reg32|Reg64|LongMem, RegMMX, 0 } }, 999847c9f5dSkettenis {"movd", 2, 0x0f7e, X, CpuMMX, FP|Modrm, { RegMMX, Reg32|Reg64|LongMem, 0 } }, 1000847c9f5dSkettenis {"movd", 2, 0x660f6e,X,CpuSSE2,FP|Modrm, { Reg32|Reg64|LLongMem, RegXMM, 0 } }, 1001847c9f5dSkettenis {"movd", 2, 0x660f7e,X,CpuSSE2,FP|Modrm, { RegXMM, Reg32|Reg64|LLongMem, 0 } }, 1002c074d1c9Sdrahn /* In the 64bit mode the short form mov immediate is redefined to have 1003c074d1c9Sdrahn 64bit displacement value. */ 1004847c9f5dSkettenis {"movq", 2, 0x0f6f, X, CpuMMX, FP|Modrm|NoRex64, { RegMMX|LongMem, RegMMX, 0 } }, 1005847c9f5dSkettenis {"movq", 2, 0x0f7f, X, CpuMMX, FP|Modrm|NoRex64, { RegMMX, RegMMX|LongMem, 0 } }, 1006847c9f5dSkettenis {"movq", 2, 0xf30f7e,X,CpuSSE2,FP|Modrm|NoRex64, { RegXMM|LLongMem, RegXMM, 0 } }, 1007847c9f5dSkettenis {"movq", 2, 0x660fd6,X,CpuSSE2,FP|Modrm|NoRex64, { RegXMM, RegXMM|LLongMem, 0 } }, 1008847c9f5dSkettenis {"movq", 2, 0x0f6e, X, Cpu64, FP|Modrm, { Reg64|LLongMem, RegMMX, 0 } }, 1009847c9f5dSkettenis {"movq", 2, 0x0f7e, X, Cpu64, FP|Modrm, { RegMMX, Reg64|LLongMem, 0 } }, 1010847c9f5dSkettenis {"movq", 2, 0x660f6e,X,Cpu64, FP|Modrm, { Reg64|LLongMem, RegXMM, 0 } }, 1011847c9f5dSkettenis {"movq", 2, 0x660f7e,X,Cpu64, FP|Modrm, { RegXMM, Reg64|LLongMem, 0 } }, 1012b55d4692Sfgsch {"movq", 2, 0x88, X, Cpu64, NoSuf|D|W|Modrm|Size64,{ Reg64, Reg64|AnyMem, 0 } }, 1013b55d4692Sfgsch {"movq", 2, 0xc6, 0, Cpu64, NoSuf|W|Modrm|Size64, { Imm32S, Reg64|WordMem, 0 } }, 1014b55d4692Sfgsch {"movq", 2, 0xb0, X, Cpu64, NoSuf|W|ShortForm|Size64,{ Imm64, Reg64, 0 } }, 1015b55d4692Sfgsch /* Move to/from control debug registers. In the 16 or 32bit modes they are 32bit. In the 64bit 1016b55d4692Sfgsch mode they are 64bit.*/ 1017b55d4692Sfgsch {"movq", 2, 0x0f20, X, Cpu64, NoSuf|D|Modrm|IgnoreSize|NoRex64|Size64,{ Control, Reg64|InvMem, 0} }, 1018b55d4692Sfgsch {"movq", 2, 0x0f21, X, Cpu64, NoSuf|D|Modrm|IgnoreSize|NoRex64|Size64,{ Debug, Reg64|InvMem, 0} }, 1019b55d4692Sfgsch {"packssdw", 2, 0x0f6b, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1020b55d4692Sfgsch {"packssdw", 2, 0x660f6b,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1021b55d4692Sfgsch {"packsswb", 2, 0x0f63, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1022b55d4692Sfgsch {"packsswb", 2, 0x660f63,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1023b55d4692Sfgsch {"packuswb", 2, 0x0f67, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1024b55d4692Sfgsch {"packuswb", 2, 0x660f67,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1025b55d4692Sfgsch {"paddb", 2, 0x0ffc, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1026b55d4692Sfgsch {"paddb", 2, 0x660ffc,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1027b55d4692Sfgsch {"paddw", 2, 0x0ffd, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1028b55d4692Sfgsch {"paddw", 2, 0x660ffd,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1029b55d4692Sfgsch {"paddd", 2, 0x0ffe, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1030b55d4692Sfgsch {"paddd", 2, 0x660ffe,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1031b55d4692Sfgsch {"paddq", 2, 0x0fd4, X, CpuMMX, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1032b55d4692Sfgsch {"paddq", 2, 0x660fd4,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1033b55d4692Sfgsch {"paddsb", 2, 0x0fec, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1034b55d4692Sfgsch {"paddsb", 2, 0x660fec,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1035b55d4692Sfgsch {"paddsw", 2, 0x0fed, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1036b55d4692Sfgsch {"paddsw", 2, 0x660fed,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1037b55d4692Sfgsch {"paddusb", 2, 0x0fdc, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1038b55d4692Sfgsch {"paddusb", 2, 0x660fdc,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1039b55d4692Sfgsch {"paddusw", 2, 0x0fdd, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1040b55d4692Sfgsch {"paddusw", 2, 0x660fdd,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1041b55d4692Sfgsch {"pand", 2, 0x0fdb, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1042b55d4692Sfgsch {"pand", 2, 0x660fdb,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1043b55d4692Sfgsch {"pandn", 2, 0x0fdf, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1044b55d4692Sfgsch {"pandn", 2, 0x660fdf,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1045b55d4692Sfgsch {"pcmpeqb", 2, 0x0f74, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1046b55d4692Sfgsch {"pcmpeqb", 2, 0x660f74,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1047b55d4692Sfgsch {"pcmpeqw", 2, 0x0f75, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1048b55d4692Sfgsch {"pcmpeqw", 2, 0x660f75,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1049b55d4692Sfgsch {"pcmpeqd", 2, 0x0f76, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1050b55d4692Sfgsch {"pcmpeqd", 2, 0x660f76,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1051b55d4692Sfgsch {"pcmpgtb", 2, 0x0f64, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1052b55d4692Sfgsch {"pcmpgtb", 2, 0x660f64,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1053b55d4692Sfgsch {"pcmpgtw", 2, 0x0f65, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1054b55d4692Sfgsch {"pcmpgtw", 2, 0x660f65,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1055b55d4692Sfgsch {"pcmpgtd", 2, 0x0f66, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1056b55d4692Sfgsch {"pcmpgtd", 2, 0x660f66,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1057b55d4692Sfgsch {"pmaddwd", 2, 0x0ff5, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1058b55d4692Sfgsch {"pmaddwd", 2, 0x660ff5,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1059b55d4692Sfgsch {"pmulhw", 2, 0x0fe5, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1060b55d4692Sfgsch {"pmulhw", 2, 0x660fe5,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1061b55d4692Sfgsch {"pmullw", 2, 0x0fd5, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1062b55d4692Sfgsch {"pmullw", 2, 0x660fd5,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1063b55d4692Sfgsch {"por", 2, 0x0feb, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1064b55d4692Sfgsch {"por", 2, 0x660feb,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1065b55d4692Sfgsch {"psllw", 2, 0x0ff1, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1066b55d4692Sfgsch {"psllw", 2, 0x660ff1,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1067b55d4692Sfgsch {"psllw", 2, 0x0f71, 6, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1068b55d4692Sfgsch {"psllw", 2, 0x660f71,6,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1069b55d4692Sfgsch {"pslld", 2, 0x0ff2, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1070b55d4692Sfgsch {"pslld", 2, 0x660ff2,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1071b55d4692Sfgsch {"pslld", 2, 0x0f72, 6, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1072b55d4692Sfgsch {"pslld", 2, 0x660f72,6,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1073b55d4692Sfgsch {"psllq", 2, 0x0ff3, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1074b55d4692Sfgsch {"psllq", 2, 0x660ff3,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1075b55d4692Sfgsch {"psllq", 2, 0x0f73, 6, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1076b55d4692Sfgsch {"psllq", 2, 0x660f73,6,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1077b55d4692Sfgsch {"psraw", 2, 0x0fe1, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1078b55d4692Sfgsch {"psraw", 2, 0x660fe1,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1079b55d4692Sfgsch {"psraw", 2, 0x0f71, 4, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1080b55d4692Sfgsch {"psraw", 2, 0x660f71,4,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1081b55d4692Sfgsch {"psrad", 2, 0x0fe2, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1082b55d4692Sfgsch {"psrad", 2, 0x660fe2,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1083b55d4692Sfgsch {"psrad", 2, 0x0f72, 4, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1084b55d4692Sfgsch {"psrad", 2, 0x660f72,4,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1085b55d4692Sfgsch {"psrlw", 2, 0x0fd1, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1086b55d4692Sfgsch {"psrlw", 2, 0x660fd1,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1087b55d4692Sfgsch {"psrlw", 2, 0x0f71, 2, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1088b55d4692Sfgsch {"psrlw", 2, 0x660f71,2,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1089b55d4692Sfgsch {"psrld", 2, 0x0fd2, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1090b55d4692Sfgsch {"psrld", 2, 0x660fd2,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1091b55d4692Sfgsch {"psrld", 2, 0x0f72, 2, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1092b55d4692Sfgsch {"psrld", 2, 0x660f72,2,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1093b55d4692Sfgsch {"psrlq", 2, 0x0fd3, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1094b55d4692Sfgsch {"psrlq", 2, 0x660fd3,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1095b55d4692Sfgsch {"psrlq", 2, 0x0f73, 2, CpuMMX, FP|Modrm, { Imm8, RegMMX, 0 } }, 1096b55d4692Sfgsch {"psrlq", 2, 0x660f73,2,CpuSSE2,FP|Modrm, { Imm8, RegXMM, 0 } }, 1097b55d4692Sfgsch {"psubb", 2, 0x0ff8, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1098b55d4692Sfgsch {"psubb", 2, 0x660ff8,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1099b55d4692Sfgsch {"psubw", 2, 0x0ff9, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1100b55d4692Sfgsch {"psubw", 2, 0x660ff9,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1101b55d4692Sfgsch {"psubd", 2, 0x0ffa, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1102b55d4692Sfgsch {"psubd", 2, 0x660ffa,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1103b55d4692Sfgsch {"psubq", 2, 0x0ffb, X, CpuMMX, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1104b55d4692Sfgsch {"psubq", 2, 0x660ffb,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1105b55d4692Sfgsch {"psubsb", 2, 0x0fe8, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1106b55d4692Sfgsch {"psubsb", 2, 0x660fe8,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1107b55d4692Sfgsch {"psubsw", 2, 0x0fe9, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1108b55d4692Sfgsch {"psubsw", 2, 0x660fe9,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1109b55d4692Sfgsch {"psubusb", 2, 0x0fd8, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1110b55d4692Sfgsch {"psubusb", 2, 0x660fd8,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1111b55d4692Sfgsch {"psubusw", 2, 0x0fd9, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1112b55d4692Sfgsch {"psubusw", 2, 0x660fd9,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1113b55d4692Sfgsch {"punpckhbw",2, 0x0f68, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1114b55d4692Sfgsch {"punpckhbw",2, 0x660f68,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1115b55d4692Sfgsch {"punpckhwd",2, 0x0f69, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1116b55d4692Sfgsch {"punpckhwd",2, 0x660f69,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1117b55d4692Sfgsch {"punpckhdq",2, 0x0f6a, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1118b55d4692Sfgsch {"punpckhdq",2, 0x660f6a,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1119b55d4692Sfgsch {"punpcklbw",2, 0x0f60, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1120b55d4692Sfgsch {"punpcklbw",2, 0x660f60,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1121b55d4692Sfgsch {"punpcklwd",2, 0x0f61, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1122b55d4692Sfgsch {"punpcklwd",2, 0x660f61,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1123b55d4692Sfgsch {"punpckldq",2, 0x0f62, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1124b55d4692Sfgsch {"punpckldq",2, 0x660f62,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1125b55d4692Sfgsch {"pxor", 2, 0x0fef, X, CpuMMX, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1126b55d4692Sfgsch {"pxor", 2, 0x660fef,X,CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1127b305b0f1Sespie 1128b305b0f1Sespie /* PIII Katmai New Instructions / SIMD instructions. */ 1129b305b0f1Sespie 1130b55d4692Sfgsch {"addps", 2, 0x0f58, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1131b55d4692Sfgsch {"addss", 2, 0xf30f58, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1132b55d4692Sfgsch {"andnps", 2, 0x0f55, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1133b55d4692Sfgsch {"andps", 2, 0x0f54, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1134b55d4692Sfgsch {"cmpeqps", 2, 0x0fc2, 0, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1135b55d4692Sfgsch {"cmpeqss", 2, 0xf30fc2, 0, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1136b55d4692Sfgsch {"cmpleps", 2, 0x0fc2, 2, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1137b55d4692Sfgsch {"cmpless", 2, 0xf30fc2, 2, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1138b55d4692Sfgsch {"cmpltps", 2, 0x0fc2, 1, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1139b55d4692Sfgsch {"cmpltss", 2, 0xf30fc2, 1, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1140b55d4692Sfgsch {"cmpneqps", 2, 0x0fc2, 4, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1141b55d4692Sfgsch {"cmpneqss", 2, 0xf30fc2, 4, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1142b55d4692Sfgsch {"cmpnleps", 2, 0x0fc2, 6, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1143b55d4692Sfgsch {"cmpnless", 2, 0xf30fc2, 6, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1144b55d4692Sfgsch {"cmpnltps", 2, 0x0fc2, 5, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1145b55d4692Sfgsch {"cmpnltss", 2, 0xf30fc2, 5, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1146b55d4692Sfgsch {"cmpordps", 2, 0x0fc2, 7, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1147b55d4692Sfgsch {"cmpordss", 2, 0xf30fc2, 7, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1148b55d4692Sfgsch {"cmpunordps",2, 0x0fc2, 3, CpuSSE, FP|Modrm|ImmExt, { RegXMM|LLongMem, RegXMM, 0 } }, 1149b55d4692Sfgsch {"cmpunordss",2, 0xf30fc2, 3, CpuSSE, FP|Modrm|ImmExt, { RegXMM|WordMem, RegXMM, 0 } }, 1150b55d4692Sfgsch {"cmpps", 3, 0x0fc2, X, CpuSSE, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1151b55d4692Sfgsch {"cmpss", 3, 0xf30fc2, X, CpuSSE, FP|Modrm, { Imm8, RegXMM|WordMem, RegXMM } }, 1152b55d4692Sfgsch {"comiss", 2, 0x0f2f, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1153b55d4692Sfgsch {"cvtpi2ps", 2, 0x0f2a, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegXMM, 0 } }, 1154b55d4692Sfgsch {"cvtps2pi", 2, 0x0f2d, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegMMX, 0 } }, 1155b55d4692Sfgsch {"cvtsi2ss", 2, 0xf30f2a, X, CpuSSE, lq_Suf|IgnoreSize|Modrm,{ Reg32|Reg64|WordMem|LLongMem, RegXMM, 0 } }, 1156b55d4692Sfgsch {"cvtss2si", 2, 0xf30f2d, X, CpuSSE, lq_Suf|IgnoreSize|Modrm,{ RegXMM|WordMem, Reg32|Reg64, 0 } }, 1157b55d4692Sfgsch {"cvttps2pi", 2, 0x0f2c, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegMMX, 0 } }, 1158b55d4692Sfgsch {"cvttss2si", 2, 0xf30f2c, X, CpuSSE, lq_Suf|IgnoreSize|Modrm, { RegXMM|WordMem, Reg32|Reg64, 0 } }, 1159b55d4692Sfgsch {"divps", 2, 0x0f5e, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1160b55d4692Sfgsch {"divss", 2, 0xf30f5e, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1161b55d4692Sfgsch {"ldmxcsr", 1, 0x0fae, 2, CpuSSE, FP|Modrm, { WordMem, 0, 0 } }, 1162b55d4692Sfgsch {"maskmovq", 2, 0x0ff7, X, CpuSSE, FP|Modrm, { RegMMX|InvMem, RegMMX, 0 } }, 1163b55d4692Sfgsch {"maxps", 2, 0x0f5f, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1164b55d4692Sfgsch {"maxss", 2, 0xf30f5f, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1165b55d4692Sfgsch {"minps", 2, 0x0f5d, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1166b55d4692Sfgsch {"minss", 2, 0xf30f5d, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1167b55d4692Sfgsch {"movaps", 2, 0x0f28, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1168b55d4692Sfgsch {"movaps", 2, 0x0f29, X, CpuSSE, FP|Modrm, { RegXMM, RegXMM|LLongMem, 0 } }, 1169b55d4692Sfgsch {"movhlps", 2, 0x0f12, X, CpuSSE, FP|Modrm, { RegXMM|InvMem, RegXMM, 0 } }, 1170b55d4692Sfgsch {"movhps", 2, 0x0f16, X, CpuSSE, FP|Modrm, { LLongMem, RegXMM, 0 } }, 1171b55d4692Sfgsch {"movhps", 2, 0x0f17, X, CpuSSE, FP|Modrm, { RegXMM, LLongMem, 0 } }, 1172b55d4692Sfgsch {"movlhps", 2, 0x0f16, X, CpuSSE, FP|Modrm, { RegXMM|InvMem, RegXMM, 0 } }, 1173b55d4692Sfgsch {"movlps", 2, 0x0f12, X, CpuSSE, FP|Modrm, { LLongMem, RegXMM, 0 } }, 1174b55d4692Sfgsch {"movlps", 2, 0x0f13, X, CpuSSE, FP|Modrm, { RegXMM, LLongMem, 0 } }, 1175c074d1c9Sdrahn {"movmskps", 2, 0x0f50, X, CpuSSE, lq_Suf|IgnoreSize|Modrm, { RegXMM|InvMem, Reg32|Reg64, 0 } }, 1176b55d4692Sfgsch {"movntps", 2, 0x0f2b, X, CpuSSE, FP|Modrm, { RegXMM, LLongMem, 0 } }, 1177b55d4692Sfgsch {"movntq", 2, 0x0fe7, X, CpuSSE, FP|Modrm, { RegMMX, LLongMem, 0 } }, 1178b55d4692Sfgsch {"movntdq", 2, 0x660fe7, X, CpuSSE2,FP|Modrm, { RegXMM, LLongMem, 0 } }, 1179b55d4692Sfgsch {"movss", 2, 0xf30f10, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1180b55d4692Sfgsch {"movss", 2, 0xf30f11, X, CpuSSE, FP|Modrm, { RegXMM, RegXMM|WordMem, 0 } }, 1181b55d4692Sfgsch {"movups", 2, 0x0f10, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1182b55d4692Sfgsch {"movups", 2, 0x0f11, X, CpuSSE, FP|Modrm, { RegXMM, RegXMM|LLongMem, 0 } }, 1183b55d4692Sfgsch {"mulps", 2, 0x0f59, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1184b55d4692Sfgsch {"mulss", 2, 0xf30f59, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1185b55d4692Sfgsch {"orps", 2, 0x0f56, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1186b55d4692Sfgsch {"pavgb", 2, 0x0fe0, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1187b55d4692Sfgsch {"pavgb", 2, 0x660fe0, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1188b55d4692Sfgsch {"pavgw", 2, 0x0fe3, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1189b55d4692Sfgsch {"pavgw", 2, 0x660fe3, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1190c074d1c9Sdrahn {"pextrw", 3, 0x0fc5, X, CpuSSE, lq_Suf|IgnoreSize|Modrm, { Imm8, RegMMX|InvMem, Reg32|Reg64 } }, 1191c074d1c9Sdrahn {"pextrw", 3, 0x660fc5, X, CpuSSE2,lq_Suf|IgnoreSize|Modrm, { Imm8, RegXMM|InvMem, Reg32|Reg64 } }, 1192c074d1c9Sdrahn {"pinsrw", 3, 0x0fc4, X, CpuSSE, lq_Suf|IgnoreSize|Modrm, { Imm8, Reg32|Reg64|ShortMem, RegMMX } }, 1193c074d1c9Sdrahn {"pinsrw", 3, 0x660fc4, X, CpuSSE2, lq_Suf|IgnoreSize|Modrm, { Imm8, Reg32|Reg64|ShortMem, RegXMM } }, 1194b55d4692Sfgsch {"pmaxsw", 2, 0x0fee, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1195b55d4692Sfgsch {"pmaxsw", 2, 0x660fee, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1196b55d4692Sfgsch {"pmaxub", 2, 0x0fde, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1197b55d4692Sfgsch {"pmaxub", 2, 0x660fde, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1198b55d4692Sfgsch {"pminsw", 2, 0x0fea, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1199b55d4692Sfgsch {"pminsw", 2, 0x660fea, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1200b55d4692Sfgsch {"pminub", 2, 0x0fda, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1201b55d4692Sfgsch {"pminub", 2, 0x660fda, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1202c074d1c9Sdrahn {"pmovmskb", 2, 0x0fd7, X, CpuSSE, lq_Suf|IgnoreSize|Modrm, { RegMMX|InvMem, Reg32|Reg64, 0 } }, 1203c074d1c9Sdrahn {"pmovmskb", 2, 0x660fd7, X, CpuSSE2,lq_Suf|IgnoreSize|Modrm, { RegXMM|InvMem, Reg32|Reg64, 0 } }, 1204b55d4692Sfgsch {"pmulhuw", 2, 0x0fe4, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1205b55d4692Sfgsch {"pmulhuw", 2, 0x660fe4, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1206b55d4692Sfgsch {"prefetchnta", 1, 0x0f18, 0, CpuSSE, FP|Modrm, { LLongMem, 0, 0 } }, 1207b55d4692Sfgsch {"prefetcht0", 1, 0x0f18, 1, CpuSSE, FP|Modrm, { LLongMem, 0, 0 } }, 1208b55d4692Sfgsch {"prefetcht1", 1, 0x0f18, 2, CpuSSE, FP|Modrm, { LLongMem, 0, 0 } }, 1209b55d4692Sfgsch {"prefetcht2", 1, 0x0f18, 3, CpuSSE, FP|Modrm, { LLongMem, 0, 0 } }, 1210b55d4692Sfgsch {"psadbw", 2, 0x0ff6, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } }, 1211b55d4692Sfgsch {"psadbw", 2, 0x660ff6, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1212b55d4692Sfgsch {"pshufw", 3, 0x0f70, X, CpuSSE, FP|Modrm, { Imm8, RegMMX|LLongMem, RegMMX } }, 1213b55d4692Sfgsch {"rcpps", 2, 0x0f53, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1214b55d4692Sfgsch {"rcpss", 2, 0xf30f53, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1215b55d4692Sfgsch {"rsqrtps", 2, 0x0f52, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1216b55d4692Sfgsch {"rsqrtss", 2, 0xf30f52, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1217b55d4692Sfgsch {"sfence", 0, 0x0fae, 0xf8, CpuSSE, FP|ImmExt, { 0, 0, 0 } }, 1218b55d4692Sfgsch {"shufps", 3, 0x0fc6, X, CpuSSE, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1219b55d4692Sfgsch {"sqrtps", 2, 0x0f51, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1220b55d4692Sfgsch {"sqrtss", 2, 0xf30f51, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1221b55d4692Sfgsch {"stmxcsr", 1, 0x0fae, 3, CpuSSE, FP|Modrm, { WordMem, 0, 0 } }, 1222b55d4692Sfgsch {"subps", 2, 0x0f5c, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1223b55d4692Sfgsch {"subss", 2, 0xf30f5c, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1224b55d4692Sfgsch {"ucomiss", 2, 0x0f2e, X, CpuSSE, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1225b55d4692Sfgsch {"unpckhps", 2, 0x0f15, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1226b55d4692Sfgsch {"unpcklps", 2, 0x0f14, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1227b55d4692Sfgsch {"xorps", 2, 0x0f57, X, CpuSSE, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1228b55d4692Sfgsch 1229b55d4692Sfgsch /* SSE-2 instructions. */ 1230b55d4692Sfgsch 1231b55d4692Sfgsch {"addpd", 2, 0x660f58, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1232b55d4692Sfgsch {"addsd", 2, 0xf20f58, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1233b55d4692Sfgsch {"andnpd", 2, 0x660f55, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1234b55d4692Sfgsch {"andpd", 2, 0x660f54, X, CpuSSE2, FP|Modrm, { RegXMM|WordMem, RegXMM, 0 } }, 1235b55d4692Sfgsch {"cmpeqpd", 2, 0x660fc2, 0, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1236b55d4692Sfgsch {"cmpeqsd", 2, 0xf20fc2, 0, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1237b55d4692Sfgsch {"cmplepd", 2, 0x660fc2, 2, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1238b55d4692Sfgsch {"cmplesd", 2, 0xf20fc2, 2, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1239b55d4692Sfgsch {"cmpltpd", 2, 0x660fc2, 1, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1240b55d4692Sfgsch {"cmpltsd", 2, 0xf20fc2, 1, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1241b55d4692Sfgsch {"cmpneqpd", 2, 0x660fc2, 4, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1242b55d4692Sfgsch {"cmpneqsd", 2, 0xf20fc2, 4, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1243b55d4692Sfgsch {"cmpnlepd", 2, 0x660fc2, 6, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1244b55d4692Sfgsch {"cmpnlesd", 2, 0xf20fc2, 6, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1245b55d4692Sfgsch {"cmpnltpd", 2, 0x660fc2, 5, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1246b55d4692Sfgsch {"cmpnltsd", 2, 0xf20fc2, 5, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1247b55d4692Sfgsch {"cmpordpd", 2, 0x660fc2, 7, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1248b55d4692Sfgsch {"cmpordsd", 2, 0xf20fc2, 7, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1249b55d4692Sfgsch {"cmpunordpd",2, 0x660fc2, 3, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LLongMem, RegXMM, 0 } }, 1250b55d4692Sfgsch {"cmpunordsd",2, 0xf20fc2, 3, CpuSSE2, FP|Modrm|ImmExt,{ RegXMM|LongMem, RegXMM, 0 } }, 1251b55d4692Sfgsch {"cmppd", 3, 0x660fc2, X, CpuSSE2, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1252c074d1c9Sdrahn /* Intel mode string compare. */ 1253c074d1c9Sdrahn {"cmpsd", 0, 0xa7, X, 0, NoSuf|Size32|IsString, { 0, 0, 0} }, 1254c074d1c9Sdrahn {"cmpsd", 2, 0xa7, X, 0, NoSuf|Size32|IsString, { AnyMem, AnyMem|EsSeg, 0} }, 1255b55d4692Sfgsch {"cmpsd", 3, 0xf20fc2, X, CpuSSE2, FP|Modrm, { Imm8, RegXMM|LongMem, RegXMM } }, 1256b55d4692Sfgsch {"comisd", 2, 0x660f2f, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1257b55d4692Sfgsch {"cvtpi2pd", 2, 0x660f2a, X, CpuSSE2, FP|Modrm, { RegMMX|LLongMem, RegXMM, 0 } }, 1258b55d4692Sfgsch {"cvtsi2sd", 2, 0xf20f2a, X, CpuSSE2, lq_Suf|IgnoreSize|Modrm,{ Reg32|Reg64|WordMem|LLongMem, RegXMM, 0 } }, 1259b55d4692Sfgsch {"divpd", 2, 0x660f5e, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1260b55d4692Sfgsch {"divsd", 2, 0xf20f5e, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1261b55d4692Sfgsch {"maxpd", 2, 0x660f5f, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1262b55d4692Sfgsch {"maxsd", 2, 0xf20f5f, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1263b55d4692Sfgsch {"minpd", 2, 0x660f5d, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1264b55d4692Sfgsch {"minsd", 2, 0xf20f5d, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1265b55d4692Sfgsch {"movapd", 2, 0x660f28, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1266b55d4692Sfgsch {"movapd", 2, 0x660f29, X, CpuSSE2, FP|Modrm, { RegXMM, RegXMM|LLongMem, 0 } }, 1267b55d4692Sfgsch {"movhpd", 2, 0x660f16, X, CpuSSE2, FP|Modrm, { LLongMem, RegXMM, 0 } }, 1268b55d4692Sfgsch {"movhpd", 2, 0x660f17, X, CpuSSE2, FP|Modrm, { RegXMM, LLongMem, 0 } }, 1269b55d4692Sfgsch {"movlpd", 2, 0x660f12, X, CpuSSE2, FP|Modrm, { LLongMem, RegXMM, 0 } }, 1270b55d4692Sfgsch {"movlpd", 2, 0x660f13, X, CpuSSE2, FP|Modrm, { RegXMM, LLongMem, 0 } }, 1271c074d1c9Sdrahn {"movmskpd", 2, 0x660f50, X, CpuSSE2, lq_Suf|IgnoreSize|Modrm, { RegXMM|InvMem, Reg32|Reg64, 0 } }, 1272b55d4692Sfgsch {"movntpd", 2, 0x660f2b, X, CpuSSE2, FP|Modrm, { RegXMM, LLongMem, 0 } }, 1273c074d1c9Sdrahn /* Intel mode string move. */ 1274c074d1c9Sdrahn {"movsd", 0, 0xa5, X, 0, NoSuf|Size32|IsString, { 0, 0, 0} }, 1275c074d1c9Sdrahn {"movsd", 2, 0xa5, X, 0, NoSuf|Size32|IsString, { AnyMem, AnyMem|EsSeg, 0} }, 1276b55d4692Sfgsch {"movsd", 2, 0xf20f10, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1277b55d4692Sfgsch {"movsd", 2, 0xf20f11, X, CpuSSE2, FP|Modrm, { RegXMM, RegXMM|LongMem, 0 } }, 1278b55d4692Sfgsch {"movupd", 2, 0x660f10, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1279b55d4692Sfgsch {"movupd", 2, 0x660f11, X, CpuSSE2, FP|Modrm, { RegXMM, RegXMM|LLongMem, 0 } }, 1280b55d4692Sfgsch {"mulpd", 2, 0x660f59, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1281b55d4692Sfgsch {"mulsd", 2, 0xf20f59, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1282b55d4692Sfgsch {"orpd", 2, 0x660f56, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1283b55d4692Sfgsch {"shufpd", 3, 0x660fc6, X, CpuSSE2, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1284b55d4692Sfgsch {"sqrtpd", 2, 0x660f51, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1285b55d4692Sfgsch {"sqrtsd", 2, 0xf20f51, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1286b55d4692Sfgsch {"subpd", 2, 0x660f5c, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1287b55d4692Sfgsch {"subsd", 2, 0xf20f5c, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1288b55d4692Sfgsch {"ucomisd", 2, 0x660f2e, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1289b55d4692Sfgsch {"unpckhpd", 2, 0x660f15, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1290b55d4692Sfgsch {"unpcklpd", 2, 0x660f14, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1291b55d4692Sfgsch {"xorpd", 2, 0x660f57, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1292b55d4692Sfgsch {"cvtdq2pd", 2, 0xf30fe6, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1293b55d4692Sfgsch {"cvtpd2dq", 2, 0xf20fe6, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1294b55d4692Sfgsch {"cvtdq2ps", 2, 0x0f5b, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1295b55d4692Sfgsch {"cvtpd2pi", 2, 0x660f2d, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegMMX, 0 } }, 1296b55d4692Sfgsch {"cvtpd2ps", 2, 0x660f5a, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1297b55d4692Sfgsch {"cvtps2pd", 2, 0x0f5a, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1298b55d4692Sfgsch {"cvtps2dq", 2, 0x660f5b, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1299b55d4692Sfgsch {"cvtsd2si", 2, 0xf20f2d, X, CpuSSE2, lq_Suf|IgnoreSize|Modrm,{ RegXMM|LLongMem, Reg32|Reg64, 0 } }, 1300b55d4692Sfgsch {"cvtsd2ss", 2, 0xf20f5a, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1301b55d4692Sfgsch {"cvtss2sd", 2, 0xf30f5a, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1302b55d4692Sfgsch {"cvttpd2pi", 2, 0x660f2c, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegMMX, 0 } }, 1303b55d4692Sfgsch {"cvttsd2si", 2, 0xf20f2c, X, CpuSSE2, lq_Suf|IgnoreSize|Modrm,{ RegXMM|WordMem, Reg32|Reg64, 0 } }, 1304b55d4692Sfgsch {"cvttpd2dq", 2, 0x660fe6, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1305b55d4692Sfgsch {"cvttps2dq", 2, 0xf30f5b, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1306b55d4692Sfgsch {"maskmovdqu",2, 0x660ff7, X, CpuSSE2, FP|Modrm, { RegXMM|InvMem, RegXMM, 0 } }, 1307b55d4692Sfgsch {"movdqa", 2, 0x660f6f, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1308b55d4692Sfgsch {"movdqa", 2, 0x660f7f, X, CpuSSE2, FP|Modrm, { RegXMM, RegXMM|LLongMem, 0 } }, 1309b55d4692Sfgsch {"movdqu", 2, 0xf30f6f, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1310b55d4692Sfgsch {"movdqu", 2, 0xf30f7f, X, CpuSSE2, FP|Modrm, { RegXMM, RegXMM|LLongMem, 0 } }, 1311b55d4692Sfgsch {"movdq2q", 2, 0xf20fd6, X, CpuSSE2, FP|Modrm, { RegXMM|InvMem, RegMMX, 0 } }, 1312b55d4692Sfgsch {"movq2dq", 2, 0xf30fd6, X, CpuSSE2, FP|Modrm, { RegMMX|InvMem, RegXMM, 0 } }, 1313b55d4692Sfgsch {"pmuludq", 2, 0x0ff4, X, CpuSSE2, FP|Modrm, { RegMMX|LongMem, RegMMX, 0 } }, 1314b55d4692Sfgsch {"pmuludq", 2, 0x660ff4, X, CpuSSE2, FP|Modrm, { RegXMM|LongMem, RegXMM, 0 } }, 1315b55d4692Sfgsch {"pshufd", 3, 0x660f70, X, CpuSSE2, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1316b55d4692Sfgsch {"pshufhw", 3, 0xf30f70, X, CpuSSE2, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1317b55d4692Sfgsch {"pshuflw", 3, 0xf20f70, X, CpuSSE2, FP|Modrm, { Imm8, RegXMM|LLongMem, RegXMM } }, 1318b55d4692Sfgsch {"pslldq", 2, 0x660f73, 7, CpuSSE2, FP|Modrm, { Imm8, RegXMM, 0 } }, 1319b55d4692Sfgsch {"psrldq", 2, 0x660f73, 3, CpuSSE2, FP|Modrm, { Imm8, RegXMM, 0 } }, 1320b55d4692Sfgsch {"punpckhqdq",2, 0x660f6d, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1321b55d4692Sfgsch {"punpcklqdq",2, 0x660f6c, X, CpuSSE2, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1322b305b0f1Sespie 1323007c2a45Smiod /* Prescott New Instructions. */ 1324007c2a45Smiod 1325007c2a45Smiod {"addsubpd", 2, 0x660fd0, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1326007c2a45Smiod {"addsubps", 2, 0xf20fd0, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1327d670d631Skettenis {"cmpxchg16b",1, 0x0fc7, 1, CpuPNI|Cpu64, NoSuf|Modrm|Rex64, { LLongMem, 0, 0} }, 1328007c2a45Smiod {"fisttp", 1, 0xdf, 1, CpuPNI, sl_FP|FloatMF|Modrm, { ShortMem|LongMem, 0, 0} }, 1329007c2a45Smiod /* Intel Syntax */ 1330007c2a45Smiod {"fisttpd", 1, 0xdd, 1, CpuPNI, FP|Modrm, { LLongMem, 0, 0} }, 1331007c2a45Smiod {"fisttpq", 1, 0xdd, 1, CpuPNI, FP|Modrm, { LLongMem, 0, 0} }, 1332007c2a45Smiod {"fisttpll", 1, 0xdd, 1, CpuPNI, FP|Modrm, { LLongMem, 0, 0} }, 1333007c2a45Smiod {"haddpd", 2, 0x660f7c, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1334007c2a45Smiod {"haddps", 2, 0xf20f7c, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1335007c2a45Smiod {"hsubpd", 2, 0x660f7d, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1336007c2a45Smiod {"hsubps", 2, 0xf20f7d, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1337007c2a45Smiod {"lddqu", 2, 0xf20ff0, X, CpuPNI, FP|Modrm, { LLongMem, RegXMM, 0 } }, 1338007c2a45Smiod {"monitor", 0, 0x0f01, 0xc8, CpuPNI, FP|ImmExt, { 0, 0, 0} }, 1339007c2a45Smiod /* Need to ensure only "monitor %eax,%ecx,%edx" is accepted. */ 1340007c2a45Smiod {"monitor", 3, 0x0f01, 0xc8, CpuPNI, FP|ImmExt, { Reg32, Reg32, Reg32} }, 1341007c2a45Smiod {"movddup", 2, 0xf20f12, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1342007c2a45Smiod {"movshdup", 2, 0xf30f16, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1343007c2a45Smiod {"movsldup", 2, 0xf30f12, X, CpuPNI, FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } }, 1344007c2a45Smiod {"mwait", 0, 0x0f01, 0xc9, CpuPNI, FP|ImmExt, { 0, 0, 0} }, 1345007c2a45Smiod /* Need to ensure only "mwait %eax,%ecx" is accepted. */ 1346007c2a45Smiod {"mwait", 2, 0x0f01, 0xc9, CpuPNI, FP|ImmExt, { Reg32, Reg32, 0} }, 1347007c2a45Smiod 1348b305b0f1Sespie /* AMD 3DNow! instructions. */ 1349b305b0f1Sespie 1350b55d4692Sfgsch {"prefetch", 1, 0x0f0d, 0, Cpu3dnow, FP|Modrm, { ByteMem, 0, 0 } }, 1351b55d4692Sfgsch {"prefetchw",1, 0x0f0d, 1, Cpu3dnow, FP|Modrm, { ByteMem, 0, 0 } }, 1352b55d4692Sfgsch {"femms", 0, 0x0f0e, X, Cpu3dnow, FP, { 0, 0, 0 } }, 1353b55d4692Sfgsch {"pavgusb", 2, 0x0f0f, 0xbf, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1354b55d4692Sfgsch {"pf2id", 2, 0x0f0f, 0x1d, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1355b55d4692Sfgsch {"pf2iw", 2, 0x0f0f, 0x1c, Cpu3dnow|Cpu686, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1356b55d4692Sfgsch {"pfacc", 2, 0x0f0f, 0xae, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1357b55d4692Sfgsch {"pfadd", 2, 0x0f0f, 0x9e, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1358b55d4692Sfgsch {"pfcmpeq", 2, 0x0f0f, 0xb0, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1359b55d4692Sfgsch {"pfcmpge", 2, 0x0f0f, 0x90, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1360b55d4692Sfgsch {"pfcmpgt", 2, 0x0f0f, 0xa0, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1361b55d4692Sfgsch {"pfmax", 2, 0x0f0f, 0xa4, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1362b55d4692Sfgsch {"pfmin", 2, 0x0f0f, 0x94, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1363b55d4692Sfgsch {"pfmul", 2, 0x0f0f, 0xb4, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1364b55d4692Sfgsch {"pfnacc", 2, 0x0f0f, 0x8a, Cpu3dnow|Cpu686, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1365b55d4692Sfgsch {"pfpnacc", 2, 0x0f0f, 0x8e, Cpu3dnow|Cpu686, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1366b55d4692Sfgsch {"pfrcp", 2, 0x0f0f, 0x96, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1367b55d4692Sfgsch {"pfrcpit1", 2, 0x0f0f, 0xa6, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1368b55d4692Sfgsch {"pfrcpit2", 2, 0x0f0f, 0xb6, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1369b55d4692Sfgsch {"pfrsqit1", 2, 0x0f0f, 0xa7, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1370b55d4692Sfgsch {"pfrsqrt", 2, 0x0f0f, 0x97, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1371b55d4692Sfgsch {"pfsub", 2, 0x0f0f, 0x9a, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1372b55d4692Sfgsch {"pfsubr", 2, 0x0f0f, 0xaa, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1373b55d4692Sfgsch {"pi2fd", 2, 0x0f0f, 0x0d, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1374b55d4692Sfgsch {"pi2fw", 2, 0x0f0f, 0x0c, Cpu3dnow|Cpu686, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1375b55d4692Sfgsch {"pmulhrw", 2, 0x0f0f, 0xb7, Cpu3dnow, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1376b55d4692Sfgsch {"pswapd", 2, 0x0f0f, 0xbb, Cpu3dnow|Cpu686, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, 1377b55d4692Sfgsch 1378b55d4692Sfgsch /* AMD extensions. */ 1379b55d4692Sfgsch {"syscall", 0, 0x0f05, X, CpuK6, NoSuf, { 0, 0, 0} }, 1380b55d4692Sfgsch {"sysret", 0, 0x0f07, X, CpuK6, lq_Suf|DefaultSize, { 0, 0, 0} }, 1381b55d4692Sfgsch {"swapgs", 0, 0x0f01, 0xf8, Cpu64, NoSuf|ImmExt, { 0, 0, 0} }, 1382edc69924Sguenther {"rdtscp", 0, 0x0f01, 0xf9, CpuSledgehammer,NoSuf|ImmExt, { 0, 0, 0} }, 1383b305b0f1Sespie 1384007c2a45Smiod /* VIA PadLock extensions. */ 1385007c2a45Smiod {"xstorerng", 0, 0x0fa7c0, X, Cpu686|CpuPadLock, NoSuf|IsString, { 0, 0, 0} }, 1386007c2a45Smiod {"xcryptecb", 0, 0xf30fa7c8, X, Cpu686|CpuPadLock, NoSuf|IsString, { 0, 0, 0} }, 1387007c2a45Smiod {"xcryptcbc", 0, 0xf30fa7d0, X, Cpu686|CpuPadLock, NoSuf|IsString, { 0, 0, 0} }, 1388007c2a45Smiod {"xcryptcfb", 0, 0xf30fa7e0, X, Cpu686|CpuPadLock, NoSuf|IsString, { 0, 0, 0} }, 1389007c2a45Smiod {"xcryptofb", 0, 0xf30fa7e8, X, Cpu686|CpuPadLock, NoSuf|IsString, { 0, 0, 0} }, 1390007c2a45Smiod /* alias for xstorerng */ 1391007c2a45Smiod {"xstore", 0, 0x0fa7c0, X, Cpu686|CpuPadLock, NoSuf|IsString, { 0, 0, 0} }, 1392007c2a45Smiod 139347d15e0bSthib /* Supplemental Streaming SIMD Extensions 3 extensions. */ 139447d15e0bSthib {"pshufb", 2, 0x660f3800, X, CpuSSSE3, FP|Modrm|IgnoreSize|NoSuf, { RegXMM|LLongMem, RegXMM } }, 139547d15e0bSthib 139647d15e0bSthib /* Intel AES extensions */ 139747d15e0bSthib {"aesdec", 2, 0x660f38de, X, CpuAES, FP|Modrm|IgnoreSize|NoSuf, { RegXMM|LLongMem, RegXMM } }, 139847d15e0bSthib {"aesdeclast", 2, 0x660f38df, X, CpuAES, FP|Modrm|IgnoreSize|NoSuf, { RegXMM|LLongMem, RegXMM } }, 139947d15e0bSthib {"aesenc", 2, 0x660f38dc, X, CpuAES, FP|Modrm|IgnoreSize|NoSuf, { RegXMM|LLongMem, RegXMM } }, 140047d15e0bSthib {"aesenclast", 2, 0x660f38dd, X, CpuAES, FP|Modrm|IgnoreSize|NoSuf, { RegXMM|LLongMem, RegXMM } }, 140147d15e0bSthib {"aesimc", 2, 0x660f38db, X, CpuAES, FP|Modrm|IgnoreSize|NoSuf, { RegXMM|LLongMem, RegXMM } }, 140247d15e0bSthib {"aeskeygenassist", 3, 0x660f3adf, X, CpuAES, FP|Modrm|IgnoreSize|NoSuf, { Imm8, RegXMM|LLongMem, RegXMM } }, 140347d15e0bSthib 140447d15e0bSthib /* Intel Carry-less Multiplication extensions */ 140547d15e0bSthib {"pclmulqdq", 3, 0x660f3a44, X, CpuPCLMUL, FP|Modrm|IgnoreSize|NoSuf, { Imm8, RegXMM|LLongMem, RegXMM } }, 140647d15e0bSthib {"pclmullqlqdq", 2, 0x660f3a44, 0x0, CpuPCLMUL, FP|Modrm|IgnoreSize|NoSuf|ImmExt, { RegXMM|LLongMem, RegXMM } }, 140747d15e0bSthib {"pclmulhqlqdq", 2, 0x660f3a44, 0x1, CpuPCLMUL, FP|Modrm|IgnoreSize|NoSuf|ImmExt, { RegXMM|LLongMem, RegXMM } }, 140847d15e0bSthib {"pclmullqhqdq", 2, 0x660f3a44, 0x10, CpuPCLMUL, FP|Modrm|IgnoreSize|NoSuf|ImmExt, { RegXMM|LLongMem, RegXMM } }, 140947d15e0bSthib {"pclmulhqhqdq", 2, 0x660f3a44, 0x11, CpuPCLMUL, FP|Modrm|IgnoreSize|NoSuf|ImmExt, { RegXMM|LLongMem, RegXMM } }, 141047d15e0bSthib 14117e0148a2Skettenis /* Intel Random Number Generator extensions */ 14127e0148a2Skettenis {"rdrand", 1, 0x0fc7, 0x6, CpuRdRnd, Modrm|NoSuf, { Reg16|Reg32|Reg64 } }, 14137e0148a2Skettenis 14145ef8804eSjsg /* Intel Supervisor Mode Access Prevention extensions */ 14155ef8804eSjsg {"clac", 0, 0x0f01, 0xca, CpuSMAP, NoSuf|ImmExt, { 0, 0, 0 } }, 14165ef8804eSjsg {"stac", 0, 0x0f01, 0xcb, CpuSMAP, NoSuf|ImmExt, { 0, 0, 0 } }, 14175ef8804eSjsg 14183d8cda5cSguenther /* Intel XSAVE extensions */ 14193d8cda5cSguenther {"xgetbv", 0, 0x0f01, 0xd0, CpuXSAVE, NoSuf|ImmExt, { 0, 0, 0 } }, 14203d8cda5cSguenther {"xsetbv", 0, 0x0f01, 0xd1, CpuXSAVE, NoSuf|ImmExt, { 0, 0, 0 } }, 14213d8cda5cSguenther {"xsave", 1, 0x0fae, 4, CpuXSAVE, NoSuf|Modrm, { LLongMem, 0, 0 } }, 14223d8cda5cSguenther {"xrstor", 1, 0x0fae, 5, CpuXSAVE, NoSuf|Modrm, { LLongMem, 0, 0 } }, 14233d8cda5cSguenther {"xsaveopt", 1, 0x0fae, 6, CpuXSAVE, NoSuf|Modrm, { LLongMem, 0, 0 } }, 14243d8cda5cSguenther 1425*c035e489Smlarkin /* Intel VMX extensions */ 1426*c035e489Smlarkin {"invept", 2, 0x660f3880, X, CpuVMX|CpuNo64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } }, 1427*c035e489Smlarkin {"invept", 2, 0x660f3880, X, CpuVMX|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 } }, 1428*c035e489Smlarkin {"invvpid", 2, 0x660f3881, X, CpuVMX|CpuNo64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } }, 1429*c035e489Smlarkin {"invvpid", 2, 0x660f3881, X, CpuVMX|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 } }, 1430*c035e489Smlarkin {"vmcall", 0, 0xf01, 0xc1, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1431*c035e489Smlarkin {"vmclear", 1, 0x660fc7, 0x6, CpuVMX, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1432*c035e489Smlarkin {"vmlaunch", 0, 0xf01, 0xc2, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1433*c035e489Smlarkin {"vmresume", 0, 0xf01, 0xc3, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1434*c035e489Smlarkin {"vmptrld", 1, 0xfc7, 0x6, CpuVMX, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1435*c035e489Smlarkin {"vmptrst", 1, 0xfc7, 0x7, CpuVMX, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1436*c035e489Smlarkin {"vmread", 2, 0xf78, None, CpuVMX|CpuNo64, Modrm|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf, { Reg32, Reg32|BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1437*c035e489Smlarkin {"vmread", 2, 0xf78, None, CpuVMX|Cpu64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf|NoRex64, { Reg64, Reg64|BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1438*c035e489Smlarkin {"vmwrite", 2, 0xf79, None, CpuVMX|CpuNo64, Modrm|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf, { Reg32|BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } }, 1439*c035e489Smlarkin {"vmwrite", 2, 0xf79, None, CpuVMX|Cpu64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf|NoRex64, { Reg64|BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 } }, 1440*c035e489Smlarkin {"vmxoff", 0, 0xf01, 0xc4, CpuVMX, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1441*c035e489Smlarkin {"vmxon", 1, 0xf30fc7, 0x6, CpuVMX, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1442*c035e489Smlarkin 1443*c035e489Smlarkin /* AMD SVM extensions */ 1444*c035e489Smlarkin {"clgi", 0, 0xf01, 0xdd, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1445*c035e489Smlarkin {"invlpga", 0, 0xf01, 0xdf, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1446*c035e489Smlarkin {"invlpga", 2, 0xf01, 0xdf, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 } }, 1447*c035e489Smlarkin {"stgi", 0, 0xf01, 0xdc, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1448*c035e489Smlarkin {"vmload", 0, 0xf01, 0xda, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1449*c035e489Smlarkin {"vmload", 1, 0xf01, 0xda, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1450*c035e489Smlarkin {"vmmcall", 0, 0xf01, 0xd9, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1451*c035e489Smlarkin {"vmrun", 0, 0xf01, 0xd8, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1452*c035e489Smlarkin {"vmrun", 1, 0xf01, 0xd8, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1453*c035e489Smlarkin {"vmsave", 0, 0xf01, 0xdb, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { 0, 0, 0 } }, 1454*c035e489Smlarkin {"vmsave", 1, 0xf01, 0xdb, CpuSVME, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { BaseIndex|Disp8|Disp16|Disp32|Disp32S } }, 1455*c035e489Smlarkin 1456b305b0f1Sespie /* sentinel */ 1457b55d4692Sfgsch {NULL, 0, 0, 0, 0, 0, { 0, 0, 0} } 14582159047fSniklas }; 1459b305b0f1Sespie #undef X 1460b305b0f1Sespie #undef NoSuf 1461b305b0f1Sespie #undef b_Suf 1462b305b0f1Sespie #undef w_Suf 1463b305b0f1Sespie #undef l_Suf 1464b55d4692Sfgsch #undef q_Suf 1465b305b0f1Sespie #undef x_Suf 1466b305b0f1Sespie #undef bw_Suf 1467b305b0f1Sespie #undef bl_Suf 1468b305b0f1Sespie #undef wl_Suf 1469b55d4692Sfgsch #undef wlq_Suf 1470b305b0f1Sespie #undef sl_Suf 1471b305b0f1Sespie #undef bwl_Suf 1472b55d4692Sfgsch #undef bwlq_Suf 1473b305b0f1Sespie #undef FP 1474b305b0f1Sespie #undef l_FP 1475b305b0f1Sespie #undef x_FP 1476b305b0f1Sespie #undef sl_FP 14772159047fSniklas 1478b305b0f1Sespie #define MAX_MNEM_SIZE 16 /* for parsing insn mnemonics from input */ 14792159047fSniklas 1480b305b0f1Sespie 1481b305b0f1Sespie /* 386 register table. */ 14822159047fSniklas 14832159047fSniklas static const reg_entry i386_regtab[] = { 1484b305b0f1Sespie /* make %st first as we test for it */ 1485b55d4692Sfgsch {"st", FloatReg|FloatAcc, 0, 0}, 1486b305b0f1Sespie /* 8 bit regs */ 1487b55d4692Sfgsch #define REGNAM_AL 1 /* Entry in i386_regtab. */ 1488b55d4692Sfgsch {"al", Reg8|Acc, 0, 0}, 1489b55d4692Sfgsch {"cl", Reg8|ShiftCount, 0, 1}, 1490b55d4692Sfgsch {"dl", Reg8, 0, 2}, 1491b55d4692Sfgsch {"bl", Reg8, 0, 3}, 1492b55d4692Sfgsch {"ah", Reg8, 0, 4}, 1493b55d4692Sfgsch {"ch", Reg8, 0, 5}, 1494b55d4692Sfgsch {"dh", Reg8, 0, 6}, 1495b55d4692Sfgsch {"bh", Reg8, 0, 7}, 1496b55d4692Sfgsch {"axl", Reg8|Acc, RegRex64, 0}, /* Must be in the "al + 8" slot. */ 1497b55d4692Sfgsch {"cxl", Reg8, RegRex64, 1}, 1498b55d4692Sfgsch {"dxl", Reg8, RegRex64, 2}, 1499b55d4692Sfgsch {"bxl", Reg8, RegRex64, 3}, 1500b55d4692Sfgsch {"spl", Reg8, RegRex64, 4}, 1501b55d4692Sfgsch {"bpl", Reg8, RegRex64, 5}, 1502b55d4692Sfgsch {"sil", Reg8, RegRex64, 6}, 1503b55d4692Sfgsch {"dil", Reg8, RegRex64, 7}, 1504b55d4692Sfgsch {"r8b", Reg8, RegRex64|RegRex, 0}, 1505b55d4692Sfgsch {"r9b", Reg8, RegRex64|RegRex, 1}, 1506b55d4692Sfgsch {"r10b", Reg8, RegRex64|RegRex, 2}, 1507b55d4692Sfgsch {"r11b", Reg8, RegRex64|RegRex, 3}, 1508b55d4692Sfgsch {"r12b", Reg8, RegRex64|RegRex, 4}, 1509b55d4692Sfgsch {"r13b", Reg8, RegRex64|RegRex, 5}, 1510b55d4692Sfgsch {"r14b", Reg8, RegRex64|RegRex, 6}, 1511b55d4692Sfgsch {"r15b", Reg8, RegRex64|RegRex, 7}, 1512b305b0f1Sespie /* 16 bit regs */ 1513b55d4692Sfgsch #define REGNAM_AX 25 1514b55d4692Sfgsch {"ax", Reg16|Acc, 0, 0}, 1515b55d4692Sfgsch {"cx", Reg16, 0, 1}, 1516b55d4692Sfgsch {"dx", Reg16|InOutPortReg, 0, 2}, 1517b55d4692Sfgsch {"bx", Reg16|BaseIndex, 0, 3}, 1518b55d4692Sfgsch {"sp", Reg16, 0, 4}, 1519b55d4692Sfgsch {"bp", Reg16|BaseIndex, 0, 5}, 1520b55d4692Sfgsch {"si", Reg16|BaseIndex, 0, 6}, 1521b55d4692Sfgsch {"di", Reg16|BaseIndex, 0, 7}, 1522b55d4692Sfgsch {"r8w", Reg16, RegRex, 0}, 1523b55d4692Sfgsch {"r9w", Reg16, RegRex, 1}, 1524b55d4692Sfgsch {"r10w", Reg16, RegRex, 2}, 1525b55d4692Sfgsch {"r11w", Reg16, RegRex, 3}, 1526b55d4692Sfgsch {"r12w", Reg16, RegRex, 4}, 1527b55d4692Sfgsch {"r13w", Reg16, RegRex, 5}, 1528b55d4692Sfgsch {"r14w", Reg16, RegRex, 6}, 1529b55d4692Sfgsch {"r15w", Reg16, RegRex, 7}, 1530b305b0f1Sespie /* 32 bit regs */ 1531b55d4692Sfgsch #define REGNAM_EAX 41 1532b55d4692Sfgsch {"eax", Reg32|BaseIndex|Acc, 0, 0}, /* Must be in ax + 16 slot */ 1533b55d4692Sfgsch {"ecx", Reg32|BaseIndex, 0, 1}, 1534b55d4692Sfgsch {"edx", Reg32|BaseIndex, 0, 2}, 1535b55d4692Sfgsch {"ebx", Reg32|BaseIndex, 0, 3}, 1536b55d4692Sfgsch {"esp", Reg32, 0, 4}, 1537b55d4692Sfgsch {"ebp", Reg32|BaseIndex, 0, 5}, 1538b55d4692Sfgsch {"esi", Reg32|BaseIndex, 0, 6}, 1539b55d4692Sfgsch {"edi", Reg32|BaseIndex, 0, 7}, 1540b55d4692Sfgsch {"r8d", Reg32|BaseIndex, RegRex, 0}, 1541b55d4692Sfgsch {"r9d", Reg32|BaseIndex, RegRex, 1}, 1542b55d4692Sfgsch {"r10d", Reg32|BaseIndex, RegRex, 2}, 1543b55d4692Sfgsch {"r11d", Reg32|BaseIndex, RegRex, 3}, 1544b55d4692Sfgsch {"r12d", Reg32|BaseIndex, RegRex, 4}, 1545b55d4692Sfgsch {"r13d", Reg32|BaseIndex, RegRex, 5}, 1546b55d4692Sfgsch {"r14d", Reg32|BaseIndex, RegRex, 6}, 1547b55d4692Sfgsch {"r15d", Reg32|BaseIndex, RegRex, 7}, 1548b55d4692Sfgsch {"rax", Reg64|BaseIndex|Acc, 0, 0}, 1549b55d4692Sfgsch {"rcx", Reg64|BaseIndex, 0, 1}, 1550b55d4692Sfgsch {"rdx", Reg64|BaseIndex, 0, 2}, 1551b55d4692Sfgsch {"rbx", Reg64|BaseIndex, 0, 3}, 1552b55d4692Sfgsch {"rsp", Reg64, 0, 4}, 1553b55d4692Sfgsch {"rbp", Reg64|BaseIndex, 0, 5}, 1554b55d4692Sfgsch {"rsi", Reg64|BaseIndex, 0, 6}, 1555b55d4692Sfgsch {"rdi", Reg64|BaseIndex, 0, 7}, 1556b55d4692Sfgsch {"r8", Reg64|BaseIndex, RegRex, 0}, 1557b55d4692Sfgsch {"r9", Reg64|BaseIndex, RegRex, 1}, 1558b55d4692Sfgsch {"r10", Reg64|BaseIndex, RegRex, 2}, 1559b55d4692Sfgsch {"r11", Reg64|BaseIndex, RegRex, 3}, 1560b55d4692Sfgsch {"r12", Reg64|BaseIndex, RegRex, 4}, 1561b55d4692Sfgsch {"r13", Reg64|BaseIndex, RegRex, 5}, 1562b55d4692Sfgsch {"r14", Reg64|BaseIndex, RegRex, 6}, 1563b55d4692Sfgsch {"r15", Reg64|BaseIndex, RegRex, 7}, 1564b305b0f1Sespie /* segment registers */ 1565b55d4692Sfgsch {"es", SReg2, 0, 0}, 1566b55d4692Sfgsch {"cs", SReg2, 0, 1}, 1567b55d4692Sfgsch {"ss", SReg2, 0, 2}, 1568b55d4692Sfgsch {"ds", SReg2, 0, 3}, 1569b55d4692Sfgsch {"fs", SReg3, 0, 4}, 1570b55d4692Sfgsch {"gs", SReg3, 0, 5}, 1571b305b0f1Sespie /* control registers */ 1572b55d4692Sfgsch {"cr0", Control, 0, 0}, 1573b55d4692Sfgsch {"cr1", Control, 0, 1}, 1574b55d4692Sfgsch {"cr2", Control, 0, 2}, 1575b55d4692Sfgsch {"cr3", Control, 0, 3}, 1576b55d4692Sfgsch {"cr4", Control, 0, 4}, 1577b55d4692Sfgsch {"cr5", Control, 0, 5}, 1578b55d4692Sfgsch {"cr6", Control, 0, 6}, 1579b55d4692Sfgsch {"cr7", Control, 0, 7}, 1580b55d4692Sfgsch {"cr8", Control, RegRex, 0}, 1581b55d4692Sfgsch {"cr9", Control, RegRex, 1}, 1582b55d4692Sfgsch {"cr10", Control, RegRex, 2}, 1583b55d4692Sfgsch {"cr11", Control, RegRex, 3}, 1584b55d4692Sfgsch {"cr12", Control, RegRex, 4}, 1585b55d4692Sfgsch {"cr13", Control, RegRex, 5}, 1586b55d4692Sfgsch {"cr14", Control, RegRex, 6}, 1587b55d4692Sfgsch {"cr15", Control, RegRex, 7}, 1588b305b0f1Sespie /* debug registers */ 1589b55d4692Sfgsch {"db0", Debug, 0, 0}, 1590b55d4692Sfgsch {"db1", Debug, 0, 1}, 1591b55d4692Sfgsch {"db2", Debug, 0, 2}, 1592b55d4692Sfgsch {"db3", Debug, 0, 3}, 1593b55d4692Sfgsch {"db4", Debug, 0, 4}, 1594b55d4692Sfgsch {"db5", Debug, 0, 5}, 1595b55d4692Sfgsch {"db6", Debug, 0, 6}, 1596b55d4692Sfgsch {"db7", Debug, 0, 7}, 1597b55d4692Sfgsch {"db8", Debug, RegRex, 0}, 1598b55d4692Sfgsch {"db9", Debug, RegRex, 1}, 1599b55d4692Sfgsch {"db10", Debug, RegRex, 2}, 1600b55d4692Sfgsch {"db11", Debug, RegRex, 3}, 1601b55d4692Sfgsch {"db12", Debug, RegRex, 4}, 1602b55d4692Sfgsch {"db13", Debug, RegRex, 5}, 1603b55d4692Sfgsch {"db14", Debug, RegRex, 6}, 1604b55d4692Sfgsch {"db15", Debug, RegRex, 7}, 1605b55d4692Sfgsch {"dr0", Debug, 0, 0}, 1606b55d4692Sfgsch {"dr1", Debug, 0, 1}, 1607b55d4692Sfgsch {"dr2", Debug, 0, 2}, 1608b55d4692Sfgsch {"dr3", Debug, 0, 3}, 1609b55d4692Sfgsch {"dr4", Debug, 0, 4}, 1610b55d4692Sfgsch {"dr5", Debug, 0, 5}, 1611b55d4692Sfgsch {"dr6", Debug, 0, 6}, 1612b55d4692Sfgsch {"dr7", Debug, 0, 7}, 1613b55d4692Sfgsch {"dr8", Debug, RegRex, 0}, 1614b55d4692Sfgsch {"dr9", Debug, RegRex, 1}, 1615b55d4692Sfgsch {"dr10", Debug, RegRex, 2}, 1616b55d4692Sfgsch {"dr11", Debug, RegRex, 3}, 1617b55d4692Sfgsch {"dr12", Debug, RegRex, 4}, 1618b55d4692Sfgsch {"dr13", Debug, RegRex, 5}, 1619b55d4692Sfgsch {"dr14", Debug, RegRex, 6}, 1620b55d4692Sfgsch {"dr15", Debug, RegRex, 7}, 1621b305b0f1Sespie /* test registers */ 1622b55d4692Sfgsch {"tr0", Test, 0, 0}, 1623b55d4692Sfgsch {"tr1", Test, 0, 1}, 1624b55d4692Sfgsch {"tr2", Test, 0, 2}, 1625b55d4692Sfgsch {"tr3", Test, 0, 3}, 1626b55d4692Sfgsch {"tr4", Test, 0, 4}, 1627b55d4692Sfgsch {"tr5", Test, 0, 5}, 1628b55d4692Sfgsch {"tr6", Test, 0, 6}, 1629b55d4692Sfgsch {"tr7", Test, 0, 7}, 1630b305b0f1Sespie /* mmx and simd registers */ 1631b55d4692Sfgsch {"mm0", RegMMX, 0, 0}, 1632b55d4692Sfgsch {"mm1", RegMMX, 0, 1}, 1633b55d4692Sfgsch {"mm2", RegMMX, 0, 2}, 1634b55d4692Sfgsch {"mm3", RegMMX, 0, 3}, 1635b55d4692Sfgsch {"mm4", RegMMX, 0, 4}, 1636b55d4692Sfgsch {"mm5", RegMMX, 0, 5}, 1637b55d4692Sfgsch {"mm6", RegMMX, 0, 6}, 1638b55d4692Sfgsch {"mm7", RegMMX, 0, 7}, 1639b55d4692Sfgsch {"xmm0", RegXMM, 0, 0}, 1640b55d4692Sfgsch {"xmm1", RegXMM, 0, 1}, 1641b55d4692Sfgsch {"xmm2", RegXMM, 0, 2}, 1642b55d4692Sfgsch {"xmm3", RegXMM, 0, 3}, 1643b55d4692Sfgsch {"xmm4", RegXMM, 0, 4}, 1644b55d4692Sfgsch {"xmm5", RegXMM, 0, 5}, 1645b55d4692Sfgsch {"xmm6", RegXMM, 0, 6}, 1646b55d4692Sfgsch {"xmm7", RegXMM, 0, 7}, 1647b55d4692Sfgsch {"xmm8", RegXMM, RegRex, 0}, 1648b55d4692Sfgsch {"xmm9", RegXMM, RegRex, 1}, 1649b55d4692Sfgsch {"xmm10", RegXMM, RegRex, 2}, 1650b55d4692Sfgsch {"xmm11", RegXMM, RegRex, 3}, 1651b55d4692Sfgsch {"xmm12", RegXMM, RegRex, 4}, 1652b55d4692Sfgsch {"xmm13", RegXMM, RegRex, 5}, 1653b55d4692Sfgsch {"xmm14", RegXMM, RegRex, 6}, 1654b55d4692Sfgsch {"xmm15", RegXMM, RegRex, 7}, 1655b55d4692Sfgsch /* no type will make this register rejected for all purposes except 1656b55d4692Sfgsch for addressing. This saves creating one extra type for RIP. */ 1657b55d4692Sfgsch {"rip", BaseIndex, 0, 0} 1658b305b0f1Sespie }; 1659b305b0f1Sespie 1660b305b0f1Sespie static const reg_entry i386_float_regtab[] = { 1661b55d4692Sfgsch {"st(0)", FloatReg|FloatAcc, 0, 0}, 1662b55d4692Sfgsch {"st(1)", FloatReg, 0, 1}, 1663b55d4692Sfgsch {"st(2)", FloatReg, 0, 2}, 1664b55d4692Sfgsch {"st(3)", FloatReg, 0, 3}, 1665b55d4692Sfgsch {"st(4)", FloatReg, 0, 4}, 1666b55d4692Sfgsch {"st(5)", FloatReg, 0, 5}, 1667b55d4692Sfgsch {"st(6)", FloatReg, 0, 6}, 1668b55d4692Sfgsch {"st(7)", FloatReg, 0, 7} 16692159047fSniklas }; 16702159047fSniklas 16712159047fSniklas #define MAX_REG_NAME_SIZE 8 /* for parsing register names from input */ 16722159047fSniklas 16732159047fSniklas /* segment stuff */ 16742159047fSniklas static const seg_entry cs = { "cs", 0x2e }; 16752159047fSniklas static const seg_entry ds = { "ds", 0x3e }; 16762159047fSniklas static const seg_entry ss = { "ss", 0x36 }; 16772159047fSniklas static const seg_entry es = { "es", 0x26 }; 16782159047fSniklas static const seg_entry fs = { "fs", 0x64 }; 16792159047fSniklas static const seg_entry gs = { "gs", 0x65 }; 16802159047fSniklas 1681b305b0f1Sespie /* end of opcode/i386.h */ 1682