www.pudn.com > ASM86_64.rar > opcode.c
#include "opcode.h"
i_set_t i_transfer[] = {
{ "jmp", JMP },
{ "call", CALL },
{ "jo", JO },
{ "jno", JNO },
{ "jb", JB },
{ "jc", JB },
{ "jnae", JB },
{ "jnb", JNB },
{ "jnc", JNB },
{ "jae", JNB },
{ "jz", JZ },
{ "je", JZ },
{ "jnz", JNZ },
{ "jne", JNZ },
{ "jbe", JBE },
{ "jna", JBE },
{ "jnbe", JNBE },
{ "ja", JNBE },
{ "js", JS },
{ "jns", JNS },
{ "jp", JP },
{ "jpe", JP },
{ "jnp", JNP },
{ "jpo", JNP },
{ "jl", JL },
{ "jnge", JL },
{ "jnl", JNL },
{ "jge", JNL },
{ "jle", JLE },
{ "jng", JLE },
{ "jnle", JNLE },
{ "jg", JNLE },
{ "jcxz", JCXZ },
{ "jecxz", JECXZ },
{ "jrcxz", JRCXZ },
{ "loopnz", LOOPNZ },
{ "loopne", LOOPNZ },
{ "loopz", LOOPZ },
{ "loope", LOOPZ },
{ "loop", LOOP },
{ 0, 0 }
};
/***** x86-64 instruction set ********/
i_key_t ADD[] = {
{ 0, MEM|MOFFSET|GPR|ALL_REGS|SIZE8,
GPR|ALL_REGS|SIZE8, I_GPI|FS_8, 0x00 }, /* ADD Eb, Gb */
{ 0, MEM|MOFFSET|GPR|ALL_REGS|SIZE_V,
GPR|ALL_REGS|SIZE_V, I_GPI, 0x01 }, /* ADD Ev, Gv */
/* ADD Gb, Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x02 },
/* ADD Gv, Ev */
{ 0, GPR|ALL_REGS|SIZE_V, MEM|MOFFSET|SIZE_V, I_GPI, 0x03},
/* ADD AL, Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x04 },
/* ADD rAX, Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x05 },
/******* group ********/
/* ADD Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(0)|FS_8, 0x80 },
/* ADD Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(0), 0x81 },
/* ADD Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(0)|FS_8, 0x82 },
/* ADD Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(0), 0x83 },
{ 0, 0, 0, 0, 0}
};
i_key_t PUSH[] = {
/* push es */
{ 0, 0, SREG|rAX|SIZE16,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE|NO_CAST, 0x06 },
/* PUSH CS */
{ 0, 0, SREG|rCX|SIZE16,
I_GPI|NO_CAST|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x0e },
/* PUSH SS */
{ 0, 0, SREG|rDX|SIZE16,
I_GPI|NO_CAST|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x16 },
/* PUSH DS */
{ 0, 0, SREG|rBX|SIZE16,
I_GPI|NO_CAST|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x1e },
/* PUSH rAX/r8 */
{ 0, 0, GPR|rAX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x50 },
/* PUSH rCX/r9 */
{ 0, 0, GPR|rCX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x51 },
/* PUSH rDX/r10 */
{ 0, 0, GPR|rDX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x52 },
/* PUSH rBX/r11 */
{ 0, 0, GPR|rBX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x53 },
/* PUSH rSP/r12 */
{ 0, 0, GPR|rSP|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x54 },
/* PUSH rBP/r13 */
{ 0, 0, GPR|rBP|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x55 },
/* PUSH rSI/r14 */
{ 0, 0, GPR|rSI|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x56 },
/* PUSH rDI/r15 */
{ 0, 0, GPR|rDI|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x57 },
/* PUSH Iz */
{ 0, 0, IMME|0x06, I_GPI|NO_NEED_MODRM, 0x68 },
/* PUSH Ib */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM, 0x6a },
/**************** GROUP ****************/
/* PUSH Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(6), 0xff },
/***************** two byte opcode ****************/
/* PUSH FS */
{ 0, 0, SREG|rSP|SIZE16,
I_GPI|NO_CAST|NO_NEED_MODRM|ONLY_OPCODE, 0x0fa0 },
/* PUSH GS */
{ 0, 0, SREG|rBP|SIZE16,
I_GPI|NO_CAST|NO_NEED_MODRM|ONLY_OPCODE, 0x0fa8 },
{ 0, 0, 0, 0, 0 }
};
i_key_t POP[] = {
/* POP ES */
{ 0, 0, SREG|rAX|SIZE16,
I_GPI|NO_CAST|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x07 },
/* POP SS */
{ 0, 0, SREG|rDX|SIZE16,
I_GPI|NO_CAST|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x17 },
/* POP DS */
{ 0, 0, SREG|rBX|SIZE16,
I_GPI|NO_CAST|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x1f },
/* POP rAX/r8 */
{ 0, 0, GPR|rAX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x58 },
/* POP rCX/r9 */
{ 0, 0, GPR|rCX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x59 },
/* POP rDX/r10 */
{ 0, 0, GPR|rDX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x5a },
/* POP rBX/r11 */
{ 0, 0, GPR|rBX|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x5b },
/* POP rSP/r12 */
{ 0, 0, GPR|rSP|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x5c },
/* POP rBP/r13 */
{ 0, 0, GPR|rBP|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x5d },
/* POP rSI/r14 */
{ 0, 0, GPR|rSI|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x5e },
/* POP rDI/r15 */
{ 0, 0, GPR|rDI|0x0e, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x5f },
/****************** GROUP ***************/
/* POP Ev */
{ 0, 0, MEM|MOFFSET|0x0e, I_GPI|GROUP|GROUPID(0), 0x8f },
/************* two byte opcode ***************/
/* POP FS */
{ 0, 0, SREG|rSP|SIZE16,
I_GPI|NO_NEED_MODRM|NO_CAST|ONLY_OPCODE, 0x0fa1 },
/* POP GS */
{ 0, 0, SREG|rBP|SIZE16,
I_GPI|NO_NEED_MODRM|NO_CAST|ONLY_OPCODE, 0x0fa9 },
{ 0, 0, 0, 0, 0 }
};
i_key_t OR[] = {
{ 0, MEM|MOFFSET|GPR|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x08 }, /* OR Eb, Gb */
/* OR Ev, Gv */
{ 0, MEM|MOFFSET|GPR|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x09 },
/* OR Gb, Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x0a },
/* OR Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x0b },
/* OR AL, Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x0c },
/* OR rAX, Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x0d },
/**************** GROUP *****************/
/* OR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(1)|FS_8, 0x80 },
/* OR Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(1)|FS_IN_BITS, 0x81 },
/* OR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(1)|FS_8, 0x82 },
/* OR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(1), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t ADC[] = {
/* ADC Eb, Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x10 },
/* ADC Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x11 },
/* ADC Gb, Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x12 },
/* ADC Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x13 },
/* ADC AL, Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x14 },
/* ADC rAX, Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x15 },
/***************** GROUP ************************/
/* ADC Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(2)|FS_8, 0x80 },
/* ADC Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(2), 0x81 },
/* ADC Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(2)|FS_8, 0x82 },
/* ADC Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(2), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SBB[] = {
/* SBB Eb,Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x18 },
/* SBB Ev,Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x19 },
/* SBB Gb,Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x1a },
/* SBB Gv,Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x1b },
/* SBB AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x1c },
/* SBB rAX,Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x1d },
/*********************** GROUP *********************/
/* SBB Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(3)|FS_8, 0x80 },
/* SBB Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(3), 0x81 },
/* SBB Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(3)|FS_8, 0x82 },
/* SBB Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(3), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t AND[] ={
/* AND Eb,Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x20 },
/* AND Ev,Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x21 },
/* AND Gb,Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x22 },
/* AND Gv,Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x23 },
/* AND AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x24 },
/* AND rAX,Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x25 },
/********************* GROUP ****************************/
/* AND Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(4)|FS_8, 0x80 },
/* AND Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(4), 0x81 },
/* AND Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(4)|FS_8, 0x82 },
/* AND Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(4), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t DAA[] = {
/* DAA */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x27 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SUB[] = {
/* SUB Eb,Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x28 },
/* SUB Ev,Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x29 },
/* SUB Gb,Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x2a },
/* SUB Gv,Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x2b },
/* SUB AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x2c },
/* SUB rAX,Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x2d },
/******************** GROUP ************************/
/* SUB Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(5)|FS_8, 0x80 },
/* SUB Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(5), 0x81 },
/* SUB Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(5)|FS_8, 0x82 },
/* SUB Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(5), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t DAS[] = {
/* DAS */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x2f },
{ 0, 0, 0, 0, 0 }
};
i_key_t XOR[] = {
/* XOR Eb,Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x30 },
/* XOR Ev,Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x31 },
/* XOR Gb,Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x32 },
/* XOR Gv,Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x33 },
/* X0R AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x34 },
/* XOR rAX,Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI|NO_NEED_MODRM, 0x35 },
/************************* GROUP ******************************/
/* XOR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(6)|FS_8, 0x80 },
/* XOR Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(6), 0x81 },
/* XOR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(6)|FS_8, 0x82 },
/* XOR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(6), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t AAA[] = {
/* AAA */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x37 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMP[] = {
/* CMP Eb,Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x38 },
/* CMP Ev,Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x39 },
/* CMP Gb,Eb */
{ 0, GPR|ALL_REGS|SIZE8, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x3a },
/* CMP Gv,Ev */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x3b },
/* CMP AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|FS_8, 0x3c },
/* CMP rAX,Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0e, I_GPI, 0x3d },
/************************* GROUP ******************************/
/* CMP Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(7)|FS_8, 0x80 },
/* CMP Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0e,
I_GPI|GROUP|GROUPID(7), 0x81 },
/* CMP Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|INVLD_IN_64|GROUP|GROUPID(7)|FS_8, 0x82 },
/* CMP Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(7), 0x83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t AAS[] = {
/* AAS */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x3f },
{ 0, 0, 0, 0, 0 }
};
i_key_t INC[] = {
/* INC eAX */
{ 0, 0, GPR|rAX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x40 },
/* INC eCX */
{ 0, 0, GPR|rCX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x41 },
/* INC eDX */
{ 0, 0, GPR|rDX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x42 },
/* INC eBX */
{ 0, 0, GPR|rBX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x43 },
/* INC eSP */
{ 0, 0, GPR|rSP|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x44 },
/* INC eBP */
{ 0, 0, GPR|rBP|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x45 },
/* INC eSI */
{ 0, 0, GPR|rSI|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE|FS_32, 0x46 },
/* INC eDI */
{ 0, 0, GPR|rDI|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE|FS_32, 0x47 },
/******************* GROUP ************************/
/* INC Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(0)|FS_8, 0xfe },
/* INC Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(0), 0xff },
{ 0, 0, 0, 0, 0 }
};
i_key_t DEC[] = {
/* DEC eAX */
{ 0, 0, GPR|rAX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x48 },
/* DEC eCX */
{ 0, 0, GPR|rCX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x49 },
/* DEC eDX */
{ 0, 0, GPR|rDX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x4a },
/* DEC eBX */
{ 0, 0, GPR|rBX|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x4b },
/* DEC eSP */
{ 0, 0, GPR|rSP|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x4c },
/* DEC eBP */
{ 0, 0, GPR|rBP|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x4d },
/* DEC eSI */
{ 0, 0, GPR|rSI|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x4e },
/* DEC eDI */
{ 0, 0, GPR|rDI|0x06,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x4f },
/******************* GROUP *******************/
/* DEC Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(1)|FS_8, 0xfe },
/* DEC Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(1), 0xff },
{ 0, 0, 0, 0, 0 }
};
i_key_t PUSHA[] = {
/* PUSHA */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x60 },
{ 0, 0, 0, 0, 0 }
};
i_key_t PUSHD[] = {
/* PUSHD */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x60 },
/* PUSHD Fv */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9c },
{ 0, 0, 0, 0, 0 }
};
i_key_t POPA[] = {
/* POPA */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x61 },
{ 0, 0, 0, 0, 0 }
};
i_key_t POPD[] = {
/* POPD */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x61 },
/* POPD Fv */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9d },
{ 0, 0, 0, 0, 0 }
};
i_key_t BOUND[] = { /***** keep it to reserved ******/
/* BOUND Gv,Ma */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI|INVLD_IN_64, 0x62 },
{ 0, 0, 0, 0, 0 }
};
i_key_t ARPL[] = {
/* ARPL Ew,Gw */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE16, GPR|ALL_REGS|SIZE16,
I_GPI|INVLD_IN_64|FS_16, 0x63 },
};
i_key_t MOVSXD[] = {
/* valid only in 64-bit mode */
/* MOVSXD Gv,Ed */
{ 0, GPR|ALL_REGS|0x18, GPR|MEM|MOFFSET|ALL_REGS|SIZE32,
I_GPI|ONLY_IN_64, 0x63 },
{ 0, 0, 0, 0, 0 }
};
i_key_t IMUL[] = {
/* IMUL Gv,Ev,Iz */
{ GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
IMME|0x0e, I_GPI, 0x69 },
/* IMUL Gv,Ev,Ib */
{ GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
IMME|SIZE8, I_GPI, 0x6b },
/******** GROUP **************/
/* IMUL Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(5)|FS_8, 0xf6 },
/* IMUL Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(5), 0xf7 },
/**************** two byte opcode ***************/
/* IMUL Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0faf },
{ 0, 0, 0, 0, 0 }
};
i_key_t INSB[] = {
/* INSB Yb,DX */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0x6c },
{ 0, 0, 0, 0, 0 }
};
i_key_t INSW[] = {
/* INSW Yz,DX */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0x6d },
{ 0, 0, 0, 0, 0 }
};
i_key_t INSD[] = {
/* INSD Yz,DX */
{ 0, 0, 0, I_GPI|FS_32|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x6d },
{ 0, 0, 0, 0, 0 }
};
i_key_t OUTSB[] = {
/* OUTSB DX,Xb */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0x6e },
{ 0, 0, 0, 0, 0 }
};
i_key_t OUTSW[] = {
/* OUTSW DX,Xz */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0x6f },
{ 0, 0, 0, 0, 0 }
};
i_key_t OUTSD[] = {
/* OUTSD DX,Xz */
{ 0, 0, 0, I_GPI|FS_32|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x6f },
{ 0, 0, 0, 0, 0 }
};
i_key_t JO[] = {
/* JO Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x70 },
/***************** two byte opcode ****************/
/* JO Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f80 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNO[] = {
/* JNO Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x71 },
/***************** two byte opcode ****************/
/* JNO Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f81 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JB[] = {
/* JB Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x72 },
/***************** two byte opcode ****************/
/* JB Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f82 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNB[] = {
/* JNB Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x73 },
/***************** two byte opcode ****************/
/* JNB Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f83 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JZ[] = {
/* JZ Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x74 },
/***************** two byte opcode ****************/
/* JZ Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f84 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNZ[] = {
/* JNZ Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x75 },
/***************** two byte opcode ****************/
/* JNZ Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f85 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JBE[] = {
/* JBE Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x76 },
/***************** two byte opcode ****************/
/* JBE Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f86 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNBE[] = {
/* JNBE Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x77 },
/***************** two byte opcode ****************/
/* JNBE Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f87 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JS[] = {
/* JS Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x78 },
/************ two byte opcode **************/
/* JS Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f88 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNS[] = {
/* JNS Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x79 },
/************ two byte opcode **************/
/* JNS Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f89 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JP[] = {
/* JP Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x7a },
/************ two byte opcode **************/
/* JP Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f8a },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNP[] = {
/* JNP Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x7b },
/************ two byte opcode **************/
/* JNP Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f8b },
{ 0, 0, 0, 0, 0 }
};
i_key_t JL[] = {
/* JL Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x7c },
/************ two byte opcode **************/
/* JL Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f8c },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNL[] = {
/* JNL Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x7d },
/************ two byte opcode **************/
/* JNL Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f8d },
{ 0, 0, 0, 0, 0 }
};
i_key_t JLE[] = {
/* JLE Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x7e },
/************ two byte opcode **************/
/* JLE Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f8e },
{ 0, 0, 0, 0, 0 }
};
i_key_t JNLE[] = {
/* JNLE Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0x7f },
/************ two byte opcode **************/
/* JNLE Jz */
{ 0, 0, IMME|0x0e, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0x0f8f },
{ 0, 0, 0, 0, 0 }
};
i_key_t TEST[] = {
/* TEST Eb, Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x84 },
/* TEST Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x85 },
/* TEST AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xa8 },
/* TEST rAx,Iz */
{ 0, GPR|rAX|0x0e, IMME|0x0f, I_GPI|NO_NEED_MODRM, 0xa9 },
/*************** GROUP ******************/
/* TEST Eb, Ib */
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(0)|FS_8, 0xf6 },
{ 0, GPR|MEM|MOFFSET|0x7f000000|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(1)|FS_8, 0xf6 },
/* TEST Ev, Iz */
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0f,
I_GPI|GROUP|GROUPID(0), 0xf7 },
{ 0, GPR|MEM|MOFFSET|0x7f000000|0x0e, IMME|0x0f,
I_GPI|GROUP|GROUPID(1), 0xf7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t XCHG[] = {
/* XCHG Eb,Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x86 },
/* XCHG Ev,Gv */
/* but not include "XCHG rAX, GPRs" and "XCHG GPRs, rAX" */
{ 0, GPR|0x70000000|MEM|MOFFSET|0x0e,
GPR|0x70000000|0x0e, I_GPI, 0x87 },
/**********************************************************
* TODO: reserved for "xchg rax, GPRs" and "xchg GPRs, rax"
***********************************************************/
/* r8,rAX */
{ 0, GPR|rAX|0x0e, GPR|rAX|0x0e, I_GPI|NO_NEED_MODRM, 0x90 },
/* rCX/r9,rAX */
{ 0, GPR|rAX|rCX|0x0e, GPR|rAX|rCX|0x0e, I_GPI|NO_NEED_MODRM, 0x91 },
/* rDX/r10,rAX */
{ 0, GPR|rAX|rDX|0x0e, GPR|rAX|rDX|0x0e, I_GPI|NO_NEED_MODRM, 0x92 },
/* rBX/r11,rAX */
{ 0, GPR|rAX|rBX|0x0e, GPR|rAX|rBX|0x0e, I_GPI|NO_NEED_MODRM, 0x93 },
/* rSP/r12,rAX */
{ 0, GPR|rAX|rSP|0x0e, GPR|rAX|rSP|0x0e, I_GPI|NO_NEED_MODRM, 0x94 },
/* rBP/r13,rAX */
{ 0, GPR|rAX|rBP|0x0e, GPR|rAX|rBP|0x0e, I_GPI|NO_NEED_MODRM, 0x95 },
/* rSI/r14,rAX */
{ 0, GPR|rAX|rSI|0x0e, GPR|rAX|rSI|0x0e, I_GPI|NO_NEED_MODRM, 0x96 },
/* rDI/r15,rAX */
{ 0, GPR|rAX|rDI|0x0e, GPR|rAX|rDI|0x0e, I_GPI|NO_NEED_MODRM, 0x97 },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOV[] = {
/* MOV Eb,Gb */
/* but it's not MOV ob, AL */
{ 0, GPR|MEM|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x88 },
{ 0, MOFFSET|SIZE8, GPR|0x7f000000|SIZE8, I_GPI|FS_8, 0x88 },
/* MOV Ev,Gv */
/* but it's not MOV Ov, rAX */
{ 0, GPR|MEM|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, I_GPI, 0x89 },
{ 0, MOFFSET|0x0e, GPR|0x7f000000|0x0e, I_GPI, 0x89 },
/* MOV Gb,Eb */
/* but it's not MOV al, ob */
{ 0, GPR|ALL_REGS|SIZE8, MEM|SIZE8, I_GPI|FS_8, 0x8a },
{ 0, GPR|0x7f000000|SIZE8, MOFFSET|SIZE8, I_GPI|FS_8, 0x8a },
/* MOV Gv,Ev */
/* but it's no MOV rAx, Ov */
{ 0, GPR|ALL_REGS|0x0e, MEM|0x0e, I_GPI, 0x8b },
{ 0, GPR|0x7f000000|0x0e, MOFFSET|0x0e, I_GPI, 0x8b },
/* MOV Mw/Rv,Sw */
{ 0, MEM|MOFFSET|SIZE16, SREG|0xfc000000|SIZE16,
I_GPI|FS_16|NO_CAST_SIZE, 0x8c },
{ 0, GPR|ALL_REGS|0x0e, SREG|0xfc000000|SIZE16,
I_GPI|DEST_EXTEND, 0x8c },
/* MOV Sw,Ew */
{ 0, SREG|0xfc000000|SIZE16, GPR|MEM|MOFFSET|ALL_REGS|SIZE16,
I_GPI|FS_16|NO_CAST, 0x8e },
/* MOV AL,Ob */
{ 0, GPR|rAX|SIZE8, MOFFSET|SIZE8,
I_GPI|NO_NEED_MODRM|FS_8, 0xa0},
/* MOV rAX,Ov */
{ 0, GPR|rAX|0x0e, MOFFSET|0x0e,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xa1 },
/* MOV Ob,AL */
{ 0, MOFFSET|SIZE8, GPR|rAX|SIZE8,
I_GPI|NO_NEED_MODRM|FS_8, 0xa2 },
/* MOV Ov,rAX */
{ 0, MOFFSET|0x0e, GPR|rAX|0x0e,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xa3 },
/* MOV AL/r8b,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8,
I_GPI|NO_NEED_MODRM|FS_8, 0xb0 },
/* MOV CL/r9b,Ib */
{ 0, GPR|rCX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb1 },
/* MOV DL/r10b,Ib */
{ 0, GPR|rDX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb2 },
/* MOV BL/r11b,Ib */
{ 0, GPR|rBX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb3 },
/* MOV AH/r12b/spl,Ib */
{ 0, GPR|rSP|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb4 },
/* MOV CH/r13b/bpl,Ib */
{ 0, GPR|rBP|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb5 },
/* MOV DH/r14b/sil,Ib */
{ 0, GPR|rSI|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb6 },
/* MOV BH/r15b/dil,Ib */
{ 0, GPR|rDI|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xb7 },
/* MOV rAX/r8,Iv */
{ 0, GPR|rAX|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xb8 },
/* MOV rCX/r9,Iv */
{ 0, GPR|rCX|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xb9 },
/* MOV rDX/r10,Iv */
{ 0, GPR|rDX|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64,0xba },
/* MOV rBX/r11,Iv */
{ 0, GPR|rBX|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xbb },
/* MOV rSP/r12,Iv */
{ 0, GPR|rSP|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xbc },
/* MOV rBP/r13,Iv */
{ 0, GPR|rBP|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xbd },
/* MOV rSI/r14,Iv */
{ 0, GPR|rSI|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xbe },
/* MOV rDI/r15,Iv */
{ 0, GPR|rDI|0x0e, IMME|0x0f,
I_GPI|NO_NEED_MODRM|SUPPORT_VALUE64, 0xbf },
/***************** GROUP *******************/
/* MOV Eb, Ib */
{ 0, MEM|MOFFSET|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(0)|FS_8, 0xc6 },
/* MOV Ev, Iz */
{ 0, MEM|MOFFSET|0x0e, IMME|0x0f,
I_GPI|GROUP|GROUPID(0), 0xc7 },
/**************** two byte opcode **************/
/* MOV Rd, Cd */
{ 0, GPR|ALL_REGS|SIZE32, CREG|ALL_REGS|SIZE32, I_GPI|FS_32, 0x0f20 },
/* MOV Rq, Cq */
{ 0, GPR|ALL_REGS|SIZE64, CREG|ALL_REGS|SIZE64, I_GPI|FS_64, 0x0f20 },
/* MOV Rd, Dd */
{ 0, GPR|ALL_REGS|SIZE32, DREG|ALL_REGS|SIZE32, I_GPI|FS_32, 0x0f21 },
/* MOV Rq, Dq */
{ 0, GPR|ALL_REGS|SIZE64, DREG|ALL_REGS|SIZE64, I_GPI|FS_64, 0x0f21 },
/* MOV Cd, Rd */
{ 0, CREG|ALL_REGS|SIZE32, GPR|ALL_REGS|SIZE32, I_GPI|FS_32, 0x0f22 },
/* MOV Cq, Rq */
{ 0, CREG|ALL_REGS|SIZE64, GPR|ALL_REGS|SIZE64, I_GPI|FS_64, 0x0f22 },
/* MOV Dd, Rd */
{ 0, DREG|ALL_REGS|SIZE32, GPR|ALL_REGS|SIZE32, I_GPI|FS_32, 0x0f23 },
/* MOV Dq, Rq */
{ 0, DREG|ALL_REGS|SIZE64, GPR|ALL_REGS|SIZE64, I_GPI|FS_64, 0x0f23 },
/********** end flag *************/
{ 0, 0, 0, 0, 0 }
};
i_key_t LEA[] = {
/* LEA Gv,M */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e, I_GPI, 0x8d },
{ 0, 0, 0, 0, 0 }
};
i_key_t NOP[] = {
/* NOP */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x90 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CBW[] = {
/* CBW */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0x98 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CWDE[] = {
/* CWDE */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0x98 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CDQE[] = {
/* CDQE */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x98 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CWD[] = {
/* CWD */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0x99 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CDQ[] = {
/* CDQ */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0x99 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CQO[] = {
/* CQO */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x99 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CALL[] = {
/* CALL Ap */
{ 0, 0, MOFFSET|FAR_POINTER|SIZE32,
I_GPI|INVLD_IN_64|NO_NEED_MODRM|FS_32, 0x9a },
/* CALL Jz */
{ 0, 0, IMME|0x0f, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0xe8 },
/******************* GROUP *********************/
/* CALL Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(2), 0xff },
/* CALL Ep */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE32|FAR_POINTER,
I_GPI|GROUP|GROUPID(3)|FS_32, 0xff },
{ 0, 0, 0, 0, 0 }
};
i_key_t WAIT[] = {
/* WAIT */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9b },
{ 0, 0, 0, 0, 0 }
};
i_key_t FWAIT[] = {
/* FWAIT */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9b },
{ 0, 0, 0, 0, 0 }
};
i_key_t PUSHF[] = {
/* PUSHF Fv */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9c },
{ 0, 0, 0, 0, 0 }
};
i_key_t PUSHQ[] = {
/* PUSHQ Fv */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9c },
{ 0, 0, 0, 0, 0 }
};
i_key_t POPF[] = {
/* POPF Fv */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9d },
{ 0, 0, 0, 0, 0 }
};
i_key_t POPQ[] = {
/* POPQ Fv */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x9d },
{ 0, 0, 0, 0, 0 }
};
i_key_t SAHF[] = {
/* SAHF */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x9e },
{ 0, 0, 0, 0, 0 }
};
i_key_t LAHF[] = {
/* LAHF */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0x9f },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOVSB[] = {
/* MOVSB Yb,Xb */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0xa4 },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOVSW[] = {
/* MOVSW Yv,Xv */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0xa5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOVSD[] = {
/* MOVSD Yv,Xv */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0xa5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOVSQ[] = {
/* MOVSQ Yv,Xv */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xa5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMPSB[] = {
/* CMPSB Xb,Yb */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0xa6 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMPSW[] = {
/* CMPSW Xv,Yv */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0xa7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMPSD[] = {
/* CMPSD Xv,Yv */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0xa7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMPSQ[] = {
/* CMPSQ Xv,Yv */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xa7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t STOSB[] = {
/* STOSB Yb,AL */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0xaa },
{ 0, 0, 0, 0, 0 }
};
i_key_t STOSW[] = {
/* STOSW Yv,rAX */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0xab },
{ 0, 0, 0, 0, 0 }
};
i_key_t STOSD[] = {
/* STOSD Yv,rAX */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0xab },
{ 0, 0, 0, 0, 0 }
};
i_key_t STOSQ[] = {
/* STOSQ Yv,rAX */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xab },
{ 0, 0, 0, 0, 0 }
};
i_key_t LODSB[] = {
/* LODSB AL,Xb */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0xac },
{ 0, 0, 0, 0, 0 }
};
i_key_t LODSW[] = {
/* LODSW rAX,Xv */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0xad },
{ 0, 0, 0, 0, 0 }
};
i_key_t LODSD[] = {
/* LODSD rAX,Xv */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0xad },
{ 0, 0, 0, 0, 0 }
};
i_key_t LODSQ[] = {
/* LODSQ rAX,Xv */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xad },
{ 0, 0, 0, 0, 0 }
};
i_key_t SCASB[] = {
/* SCASB AL,Yb */
{ 0, 0, 0, I_GPI|FS_8|NO_NEED_MODRM|ONLY_OPCODE, 0xae },
{ 0, 0, 0, 0, 0 }
};
i_key_t SCASW[] = {
/* SCASW rAX,Yv */
{ 0, 0, 0, I_GPI|FS_16|NO_NEED_MODRM|ONLY_OPCODE, 0xaf },
{ 0, 0, 0, 0, 0 }
};
i_key_t SCASD[] = {
/* SCASD rAX,Yv */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0xaf },
{ 0, 0, 0, 0, 0 }
};
i_key_t SCASQ[] = {
/* SCASQ rAX,Yv */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xaf },
{ 0, 0, 0, 0, 0 }
};
i_key_t RET[] = {
/* ret near */
/* RET Iw */
{ 0, 0, IMME|SIZE8|SIZE16, I_GPI|NO_NEED_MODRM|FS_16|NO_CAST, 0xc2 },
/* RET */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xc3 },
/* ret far */
/* RET Iw */
{ 0, 0, IMME|SIZE16, I_GPI|NO_NEED_MODRM|FAR_POINTER|FS_16, 0xca },
/* RET */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE|FAR_POINTER, 0xcb },
{ 0, 0, 0, 0, 0 }
};
i_key_t LES[] = {
/* LES Gz,Mp */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e,
I_GPI|INVLD_IN_64|FS_IN_BITS|FAR_POINTER, 0xc4 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LDS[] = {
/* LDS Gz,Mp */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|0x0e,
I_GPI|INVLD_IN_64|FS_IN_BITS|FAR_POINTER, 0xc5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t ENTER[] = {
/* ENTER Iw,Ib */
{ 0, IMME|SIZE8|SIZE16, IMME|SIZE8, I_GPI|NO_NEED_MODRM, 0xc8 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LEAVE[] = {
/* LEAVE */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xc9 },
{ 0, 0, 0, 0, 0 }
};
i_key_t INT3[] = {
/* INT3 */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xcc },
{ 0, 0, 0, 0, 0 }
};
i_key_t INTN[] = {
/* INT Ib*/
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xcd },
{ 0, 0, 0, 0, 0 }
};
i_key_t INTO[] = {
/* INTO */
{ 0, 0, 0, I_GPI|INVLD_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xce },
{ 0, 0, 0, 0, 0 }
};
i_key_t IRET[] = {
/* IRET */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xcf },
{ 0, 0, 0, 0, 0 }
};
i_key_t IRETD[] = {
/* IRETD */
{ 0, 0, 0, I_GPI|FS_32|NO_NEED_MODRM|ONLY_OPCODE, 0xcf },
{ 0, 0, 0, 0, 0 }
};
i_key_t IRETQ[] = {
/* IRETQ */
{ 0, 0, 0, I_GPI|FS_64|ONLY_IN_64|NO_NEED_MODRM|ONLY_OPCODE, 0xcf },
{ 0, 0, 0, 0, 0 }
};
i_key_t LOOPNZ[] = {
/* LOOPNZ Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xe0 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LOOPE[] = {
/* LOOPE Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xe1 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LOOP[] = {
/* LOOP Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xe2 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JCXZ[] = {
/* JCXZ Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_16, 0xe3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JECXZ[] = {
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_32, 0xe3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t JRCXZ[] = {
/* JrCXZ Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|ONLY_IN_64|FS_64, 0xe3 },
{ 0, 0, 0, 0, 0 }
};
/* TODO: ****************/
i_key_t IN[] = {
/* IN AL,Ib */
{ 0, GPR|rAX|SIZE8, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xe4 },
/* IN eAX,Ib */
{ 0, GPR|rAX|0x06, IMME|SIZE8, I_GPI|NO_NEED_MODRM, 0xe5 },
/* IN AL,DX */
{ 0, GPR|rAX|SIZE8, GPR|rDX|SIZE16, I_GPI|NO_NEED_MODRM|NO_CAST, 0xec },
/* IN eAX,DX */
{ 0, GPR|rAX|0x06, GPR|rDX|SIZE16, I_GPI|NO_NEED_MODRM, 0xed },
{ 0, 0, 0, 0, 0 }
};
i_key_t OUT[] = {
/* OUT Ib,AL */
{ 0, IMME|SIZE8, GPR|rAX|SIZE8, I_GPI|NO_NEED_MODRM, 0xe6 },
/* OUT Ib,eAX */
{ 0, IMME|SIZE8, GPR|rAX|0x06, I_GPI|NO_NEED_MODRM, 0xe7 },
/* OUT DX,AL */
{ 0, GPR|rDX|SIZE16, GPR|rAX|SIZE8, I_GPI|NO_NEED_MODRM|NO_CAST, 0xee },
/* OUT DX,eAX */
{ 0, GPR|rDX|SIZE16, GPR|rAX|0x06, I_GPI|NO_NEED_MODRM, 0xef },
{ 0, 0, 0, 0, 0 }
};
i_key_t JMP[] = {
/* JMP Ap */
{ 0, 0, MOFFSET|FAR_POINTER|SIZE32,
INVLD_IN_64|I_GPI|NO_NEED_MODRM|FS_32, 0xea },
/* JMP Jb */
{ 0, 0, IMME|SIZE8, I_GPI|NO_NEED_MODRM|FS_8, 0xeb },
/* JMP Jz */
{ 0, 0, IMME|0x0f, I_GPI|NO_NEED_MODRM|FS_IN_BITS, 0xe9 },
/*********************** GROUP ***************************/
/* JMP Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(4), 0xff },
/* JMP Ep */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE32|FAR_POINTER,
I_GPI|GROUP|GROUPID(5)|FS_32, 0xff },
{ 0, 0, 0, 0, 0 }
};
i_key_t INT1[] = {
/* INT1 ICE Bkpt */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xf1 },
{ 0, 0, 0, 0, 0 }
};
i_key_t HLT[] = {
/* HLT */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xf4 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMC[] = {
/* CMC */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xf5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CLC[] = {
/* CLC */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xf8 },
{ 0, 0, 0, 0, 0 }
};
i_key_t STC[] = {
/* STC */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xf9 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CLI[] = {
/* CLI */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xfa },
{ 0, 0, 0, 0, 0 }
};
i_key_t STI[] ={
/* STI */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xfb },
{ 0, 0, 0, 0, 0 }
};
i_key_t CLD[] = {
/* CLD */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xfc },
{ 0, 0, 0, 0, 0 }
};
i_key_t STD[] = {
/* STD */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0xfd },
{ 0, 0, 0, 0, 0 }
};
/************** Group instruction ***********/
i_key_t ROL[] = {
/* ROL Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(0)|FS_8, 0xc0 },
/* ROL Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(0), 0xc1 },
/* ROL Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(0), 0xd0 },
/* ROL Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(0), 0xd1 },
/* ROL Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(0)|FS_8, 0xd2 },
/* ROL Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(0), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t ROR[] = {
/* ROR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME|SIZE8,
I_GPI|GROUP|GROUPID(1)|FS_8, 0xc0 },
/* ROR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(1), 0xc1 },
/* ROR Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(1), 0xd0 },
/* ROR Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(1), 0xd1 },
/* ROR Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(1)|FS_8, 0xd2 },
/* ROR Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(1), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t RCL[] = {
/* RCL Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(2)|FS_8, 0xc0 },
/* RCL Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(2), 0xc1 },
/* RCL Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(2), 0xd0 },
/* RCL Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(2), 0xd1 },
/* RCL Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(2)|FS_8, 0xd2 },
/* RCL Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(2), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t RCR[] = {
/* RCR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(3)|FS_8, 0xc0 },
/* RCR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(3), 0xc1 },
/* RCR Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(3), 0xd0 },
/* RCR Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(3), 0xd1 },
/* RCR Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(3)|FS_8, 0xd2 },
/* RCR Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(3), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SHL[] = {
/* SHL Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(4)|FS_8, 0xc0 },
/* SHL Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(4), 0xc1 },
/* SHL Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(4), 0xd0 },
/* SHL Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(4), 0xd1 },
/* SHL Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(4)|FS_8, 0xd2 },
/* SHL Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(4), 0xd3 },
/*********** other ***************/
/* SHL Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(6)|FS_8, 0xc0 },
/* SHL Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(6), 0xc1 },
/* SHL Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(6), 0xd0 },
/* SHL Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(6), 0xd1 },
/* SHL Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(6)|FS_8, 0xd2 },
/* SHL Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(6), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
/* SAL = SHL */
i_key_t *SAL = SHL;
i_key_t SHR[] = {
/* SHR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(5)|FS_8, 0xc0 },
/* SHR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(5), 0xc1 },
/* SHR Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(5), 0xd0 },
/* SHR Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(5), 0xd1 },
/* SHR Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(5)|FS_8, 0xd2 },
/* SHR Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(5), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SAR[] = {
/* SAR Eb, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(7)|FS_8, 0xc0 },
/* SAR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, 0x800|SIZE8,
I_GPI|GROUP|GROUPID(7), 0xc1 },
/* SAR Eb, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(7), 0xd0 },
/* SAR Ev, 1 */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME_1|SIZE8,
I_GPI|GROUP|GROUPID(7), 0xd1 },
/* SAR Eb, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|rCX|SIZE8,
I_GPI|GROUP|GROUPID(7)|FS_8, 0xd2 },
/* SAR Ev, CL */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(7), 0xd3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t NOT[] = {
/* NOT Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(2)|FS_8, 0xf6 },
/* NOT Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(2), 0xf7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t NEG[] = {
/* NEG Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(3)|FS_8, 0xf6 },
/* NEG Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(3), 0xf7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t MUL[] = {
/* MUL Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(4)|FS_8, 0xf6 },
/* MUL Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(4), 0xf7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t DIV[] = {
/* DIV Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(6)|FS_8, 0xf6 },
/* DIV Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(6)|FS_8, 0xf7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t IDIV[] = {
/* IDIV Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI|GROUP|GROUPID(7)|FS_8, 0xf6 },
/* IDIV Ev */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI|GROUP|GROUPID(7)|FS_8, 0xf7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SLDT[] = {
/* SLDT Mw/Rv */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(0), 0x0f00 },
{ 0, 0, 0, 0, 0 }
};
i_key_t STR[] = {
/* STR Mw/Rv */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(1), 0x0f00 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LLDT[] = {
/* LLDT Ew */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(2), 0x0f00 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LTR[] = {
/* LTR Ew */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(3), 0x0f00 },
{ 0, 0, 0, 0, 0 }
};
i_key_t VERR[] = {
/* VERR Ew */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(4), 0x0f00 },
{ 0, 0, 0, 0, 0 }
};
i_key_t VERW[] = {
/* VERW Ew */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(5), 0x0f00 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SGDT[] = {
/* SGDT Ms */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(0), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SIDT[] = {
/* SIDT Ms */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(1), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LGDT[] = {
/* LGDT Ms */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(2), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LIDT[] = {
/* LIDT Ms */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(3), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SMSW[] = {
/* SMSW Mw/Rv */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(4), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LMSW[] = {
/* LMSW Mw/Rv */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(6), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t INVLPG[] = {
/* INVLPG Mb */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(7), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SWAPGS[] = {
/* SWAPGS */
/* mod = 11 of modrm's byte */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(7), 0x0f01 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LFENCE[] = {
/* LFENCE */
/* mod = 11 of modrm's byte */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(5), 0x0fae },
{ 0, 0, 0, 0, 0 }
};
i_key_t MFENCE[] = {
/* MFENCE */
/* mod = 11 of modrm's byte */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(6), 0x0fae },
{ 0, 0, 0, 0, 0 }
};
i_key_t SFENCE[] = {
/* SFENCE */
/* mod = 11 of modrm's byte */
{ 0, 0, 0, I_GPI|GROUP|GROUPID(7), 0x0fae },
{ 0, 0, 0, 0, 0 }
};
i_key_t BT[] = {
/* BT Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(4), 0x0fba },
/****************** two byte opcode *******************/
/* BT Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e,
I_GPI, 0x0fa3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SHLD[] = {
/* SHLD Ev, Gv, Ib */
{ GPR|ALL_REGS|MEM|MOFFSET|0x0e, GPR|ALL_REGS|0x0e,
IMME|SIZE8, I_GPI, 0x0fa4 },
{ GPR|ALL_REGS|MEM|MOFFSET|0x0e, GPR|ALL_REGS|0x0e,
GPR|rCX|SIZE8, I_GPI, 0x0fa5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t BTS[] = {
/* BTS Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(5), 0x0fba },
/* BTS Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e,
I_GPI, 0x0fab },
{ 0, 0, 0, 0, 0 }
};
i_key_t BTR[] = {
/* BTR Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(6), 0x0fba },
/* BTR Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e,
I_GPI, 0x0fb3 },
{ 0, 0, 0, 0, 0 }
};
i_key_t BTC[] = {
/* BTC Ev, Ib */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI|GROUP|GROUPID(7), 0x0fba },
/* BTC Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e,
I_GPI, 0x0fbb },
{ 0, 0, 0, 0, 0 }
};
i_key_t CPUID[] = {
/* CPUID */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fa2 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETO[] = {
/* SETO Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f90 },
/* { 0, 0, MEM|MOFFSET|SIZE8, I_GPI|FS_8, 0x0f90 }, */
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNO[] = {
/* SETNO Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f91 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETB[] = {
/* SETB Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f92 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNB[] = {
/* SETNB Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f93 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETZ[] = {
/* SETZ Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f94 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNZ[] = {
/* SETNZ Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f95 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETBE[] = {
/* SETBE Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f96 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNBE[] = {
/* SETNBE Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0f97 },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOVZX[] = {
/* MOVZX Gv, Eb */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI, 0x0fb6 },
/* MOVZX Gv, Ew */
{ 0, GPR|ALL_REGS|0x0e,
GPR|MEM|MOFFSET|ALL_REGS|SIZE16, I_GPI, 0x0fb7 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETS[] = {
/* SETS Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f98 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNS[] = {
/* SETNS Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f99 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETP[] = {
/* SETP Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f9a },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNP[] = {
/* SETNP Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f9b },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETL[] = {
/* SETL Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f9c },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNL[] = {
/* SETNL Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f9d },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETLE[] = {
/* SETLE Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f9e },
{ 0, 0, 0, 0, 0 }
};
i_key_t SETNLE[] = {
/* SETNLE Eb */
{ 0, 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, I_GPI|FS_8, 0x0f9f },
{ 0, 0, 0, 0, 0 }
};
i_key_t RSM[] = {
/* RSM */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0faa },
{ 0, 0, 0, 0, 0 }
};
i_key_t SHRD[] = {
/* SHRD Ev, Gv, Ib */
{ GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, IMME|SIZE8,
I_GPI, 0x0fac },
/* SHRD Ev, Gv, CL */
{ GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e, GPR|rCX|SIZE8,
I_GPI, 0x0fad },
{ 0, 0, 0, 0, 0 }
};
i_key_t BSF[] = {
/* BSF Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0fbc },
{ 0, 0, 0, 0, 0 }
};
i_key_t BSR[] = {
/* BSR Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0fbd },
{ 0, 0, 0, 0, 0 }
};
i_key_t MOVSX[] = {
/* MOVSX Gv, Eb */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|SIZE8,
I_GPI, 0x0fbe },
/* MOVSX Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0fbf },
{ 0, 0, 0, 0, 0 }
};
i_key_t LAR[] = {
/* LAR Gv, Ew */
{ 0, GPR|ALL_REGS|0x0e, GPR|ALL_REGS|MEM|MOFFSET|SIZE16,
I_GPI, 0x0f02 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LAL[] = {
/* LAL Gv, Ew */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|SIZE16, I_GPI, 0x0f03 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SYSCALL[] = {
/* SYSCALL */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f05 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CLTS[] = {
/* CLTS */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f06 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SYSRET[] = {
/* SYSRET */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f07 },
{ 0, 0, 0, 0, 0 }
};
i_key_t WRMSR[] = {
/* WRMSR */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f30 },
{ 0, 0, 0, 0, 0 }
};
i_key_t RDTSC[] = {
/* RDTSC */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f31 },
{ 0, 0, 0, 0, 0 }
};
i_key_t RDMSR[] = {
/* RDMSR */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f32 },
{ 0, 0, 0, 0, 0 }
};
i_key_t RDPMC[] = {
/* RDPMC */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0f33 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SYSENTER[] = {
/* SYSENTER */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE|ONLY_IN_64, 0x0f34 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SYSEXIT[] = {
/* SYSEXIT */
{ 0, 0, 0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE|ONLY_IN_64, 0x0f35 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVO[] = {
/* CMOVO Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f40 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNO[] = {
/* CMOVNO Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f41 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVB[] = {
/* CMOVB Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f42 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNB[] = {
/* CMOVNB Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f43 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVZ[] = {
/* CMOVZ Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f44 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNZ[] = {
/* CMOVNZ Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f45 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVBE[] = {
/* CMOVBE Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f46 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNBE[] = {
/* CMOVNBE Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f47 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVS[] = {
/* CMOVS Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f48 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNS[] = {
/* CMOVNS Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f49 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVP[] = {
/* CMOVP Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f4a },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNP[] = {
/* CMOVNP Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f4b },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVL[] = {
/* CMOVL Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f4c },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVLE[] = {
/* CMOVLE Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f4e },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMOVNLE[] = {
/* CMOVNLE Gv, Ev */
{ 0, GPR|ALL_REGS|0x0e, GPR|MEM|MOFFSET|ALL_REGS|0x0e,
I_GPI, 0x0f4f },
{ 0, 0, 0, 0, 0 }
};
i_key_t LSS[] = {
/* LSS Gz, Mp */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|SIZE32,
I_GPI|FAR_POINTER, 0x0fb2 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LFS[] = {
/* LFS Gz, Mp */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|SIZE32,
I_GPI|FAR_POINTER, 0x0fb4 },
{ 0, 0, 0, 0, 0 }
};
i_key_t LGS[] = {
/* LGS Gz, Mp */
{ 0, GPR|ALL_REGS|0x0e, MEM|MOFFSET|SIZE32,
I_GPI|FAR_POINTER, 0x0fb5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t CMPXCHG[] = {
/* CMPXCHG Eb, Gb */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI|FS_8, 0x0fb0 },
/* CMPXCHG Ev, Gv */
{ 0, GPR|MEM|MOFFSET|ALL_REGS|0x0e, GPR|ALL_REGS|0x0e,
I_GPI, 0x0fb1 },
{ 0, 0, 0, 0, 0 }
};
i_key_t XADD[] = {
/* XADD Eb, Gb */
{ 0, GPR|ALL_REGS|MEM|MOFFSET|SIZE8, GPR|ALL_REGS|SIZE8,
I_GPI, 0x0fc0 },
/* XADD Ev, Gv */
{ 0, GPR|ALL_REGS|MEM|MOFFSET|0x0e, GPR|ALL_REGS|0x0e,
I_GPI, 0x0fc1 },
{ 0, 0, 0, 0, 0 }
};
i_key_t BSWAP[] = {
/* BSWAP rAx/r8 */
{ 0, 0, GPR|rAX|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fc8 },
/* BSWAP rCX/r9 */
{ 0, 0, GPR|rCX|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fc9 },
/* BSWAP rDX/r10 */
{ 0, 0, GPR|rDX|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fca },
/* BSWAP rBX/r11 */
{ 0, 0, GPR|rBX|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fcb },
/* BSWAP rSP/r12 */
{ 0, 0, GPR|rSP|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fcc },
/* BSWAP rBP/r13 */
{ 0, 0, GPR|rBP|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fcd },
/* BSWAP rSI/r14 */
{ 0, 0, GPR|rSI|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fce },
/* BSWAP rDI/r15 */
{ 0, 0, GPR|rDI|0xc0, I_GPI|NO_NEED_MODRM|ONLY_OPCODE, 0x0fcf },
{ 0, 0, 0, 0, 0 }
};
i_key_t AAM[] = {
/* AAM */
{ 0, 0, 0, I_GPI|INVLD_IN_64|ONLY_OPCODE|NO_NEED_MODRM, 0xd4 },
{ 0, 0, 0, 0, 0 }
};
i_key_t AAD[] = {
/* AAD */
{ 0, 0, 0, I_GPI|INVLD_IN_64|ONLY_OPCODE|NO_NEED_MODRM, 0xd5 },
{ 0, 0, 0, 0, 0 }
};
i_key_t SALC[] = {
{ 0, 0, 0, I_GPI|INVLD_IN_64|ONLY_OPCODE|NO_NEED_MODRM, 0xd6 },
{ 0, 0, 0, 0, }
};
i_key_t XLAT[] = {
{ 0, 0, 0, I_GPI|ONLY_OPCODE|NO_NEED_MODRM, 0xd7 },
{ 0, 0, 0, 0, 0 }
};
/************************************************************************/
i_set_t i_set[] = {
{ "mov", MOV },
{ "push", PUSH },
{ "add", ADD },
{ "pop", POP },
{ "or", OR },
{ "adc", ADC },
{ "sbb", SBB },
{ "and", AND },
{ "daa", DAA },
{ "sub", SUB },
{ "das", DAS },
{ "xor", XOR },
{ "aaa", AAA },
{ "cmp", CMP },
{ "aas", AAS },
{ "inc", INC },
{ "dec", DEC },
{ "pusha", PUSHA },
{ "pushd", PUSHD },
{ "popa", POPA },
{ "popd", POPD },
{ "bound", BOUND },
{ "arpl", ARPL },
{ "movsxd", MOVSXD },
{ "imul", IMUL },
{ "insb", INSB },
{ "insw", INSW },
{ "insd", INSD },
{ "outsb", OUTSB },
{ "outsw", OUTSW },
{ "outsd", OUTSD },
{ "jo", JO },
{ "jno", JNO },
{ "jb", JB },
{ "jc", JB },
{ "jnae", JB },
{ "jnb", JNB },
{ "jnc", JNB },
{ "jae", JNB },
{ "jz", JZ },
{ "je", JZ },
{ "jnz", JNZ },
{ "jne", JNZ },
{ "jbe", JBE },
{ "jna", JBE },
{ "jnbe", JNBE },
{ "ja", JNBE },
{ "js", JS },
{ "jns", JNS },
{ "jp", JP },
{ "jpe", JP },
{ "jnp", JNP },
{ "jpo", JNP },
{ "jl", JL },
{ "jnge", JL },
{ "jnl", JNL },
{ "jge", JNL },
{ "jle", JLE },
{ "jng", JLE },
{ "jnle", JNLE },
{ "jg", JNLE },
{ "test", TEST },
{ "xchg", XCHG },
{ "lea", LEA },
{ "nop", NOP },
{ "cbw", CBW },
{ "cwde", CWDE },
{ "cdqe", CDQE },
{ "cwd", CWD },
{ "cdq", CDQ },
{ "cqo", CQO },
{ "call", CALL },
{ "wait", WAIT },
{ "fwait", FWAIT },
{ "pushf", PUSHF },
{ "pushd", PUSHD },
{ "pushq", PUSHQ },
{ "popf", POPF },
{ "popd", POPD },
{ "popq", POPQ },
{ "sahf", SAHF },
{ "lahf", LAHF },
{ "movsb", MOVSB },
{ "movsw", MOVSW },
{ "movsd", MOVSD },
{ "movsq", MOVSQ },
{ "cmpsb", CMPSB },
{ "cmpsw", CMPSW },
{ "cmpsd", CMPSD },
{ "cmpsq", CMPSQ },
{ "stosb", STOSB },
{ "stosw", STOSW },
{ "stosd", STOSD },
{ "stosq", STOSQ },
{ "lodsb", LODSB },
{ "lodsw", LODSW },
{ "lodsd", LODSD },
{ "lodsq", LODSQ },
{ "scasb", SCASB },
{ "scasw", SCASW },
{ "scasd", SCASD },
{ "scasq", SCASQ },
{ "ret", RET },
{ "les", LES },
{ "lds", LDS },
{ "enter", ENTER },
{ "leave", LEAVE },
{ "int3", INT3 },
{ "int", INTN },
{ "into", INTO },
{ "iret", IRET },
{ "iretd", IRETD },
{ "iretq", IRETQ },
/*
{ "loopnz", LOOPNZ },
{ "loopz", LOOPZ },
{ "loop", LOOP },
{ "jrcxz", JRCXZ },
*/
{ "in", IN },
{ "out", OUT },
{ "jmp", JMP },
{ "int1", INT1 },
{ "hlt", HLT },
{ "cmc", CMC },
{ "clc", CLC },
{ "stc", STD },
{ "cli", CLI },
{ "sti", STI },
{ "cld", CLD },
{ "std", STD },
{ "rol", ROL },
{ "ror", ROR },
{ "rcl", RCL },
{ "rcr", RCR },
{ "shl", SHL },
{ "sal", SHL },
{ "shr", SHR },
{ "sar", SAR },
{ "not", NOT },
{ "neg", NEG },
{ "mul", MUL },
{ "div", DIV },
{ "idiv", IDIV },
{ "sldt", SLDT },
{ "str", STR },
{ "lldt", LLDT },
{ "ltr", LTR },
{ "verr", VERR },
{ "verw", VERW },
{ "sgdt", SGDT },
{ "sidt", SIDT },
{ "lgdt", LGDT },
{ "lidt", LIDT },
{ "smsw", SMSW },
{ "lmsw", LMSW },
{ "invlpg", INVLPG },
{ "swapgs", SWAPGS },
{ "lfence", LFENCE },
{ "mfence", MFENCE },
{ "sfence", SFENCE },
{ "bt", BT },
{ "shld", SHLD },
{ "bts", BTS },
{ "btr", BTR },
{ "btc", BTC },
{ "cpuid", CPUID },
{ "seto", SETO },
{ "setno", SETNO },
{ "setb", SETB },
{ "setnb", SETNB },
{ "setz", SETZ },
{ "setnz", SETNZ },
{ "setbe", SETBE },
{ "setnbe", SETNBE },
{ "movzx", MOVZX },
{ "sets", SETS },
{ "setns", SETNS },
{ "setp", SETP },
{ "setnp", SETNP },
{ "setl", SETL },
{ "setnl", SETNL },
{ "setle", SETLE },
{ "setnle", SETNLE },
{ "rsm", RSM },
{ "shrd", SHRD },
{ "bsf", BSF },
{ "bsr", BSR },
{ "movsx", MOVSX },
{ "lar", LAR },
{ "lal", LAL },
{ "syscall", SYSCALL },
{ "clts", CLTS },
{ "sysret", SYSRET },
{ "wrmsr", WRMSR },
{ "rdtsc", RDTSC },
{ "rdmsr", RDMSR },
{ "rdpmc", RDPMC },
{ "sysenter", SYSENTER },
{ "sysexit", SYSEXIT },
{ "cmovo", CMOVO },
{ "cmovno", CMOVNO },
{ "cmovb", CMOVB },
{ "cmovnb", CMOVNB },
{ "cmovz", CMOVZ },
{ "cmovnz", CMOVNZ },
{ "cmovbe", CMOVB },
{ "cmovnbe", CMOVBE },
{ "cmovs", CMOVS },
{ "cmovns", CMOVNS },
{ "cmovp", CMOVP },
{ "cmovnp", CMOVNP },
{ "cmovl", CMOVL },
{ "cmovnl", CMOVNL },
{ "cmovle", CMOVLE },
{ "cmovnle", CMOVNLE },
{ "lss", LSS },
{ "lfs", LFS },
{ "lgs", LGS },
{ "cmpxchg", CMPXCHG },
{ "xadd", XADD },
{ "bswap", BSWAP },
{ "aam", AAM },
{ "aad", AAD },
{ "salc", SALC },
{ "xlat", XLAT },
/*-------------- X87 instruction ----------------*/
#if 0
{ "fadd", fadd },
{ "fmul", fmul },
{ "fcom", fcom },
{ "fcomp", fcomp },
{ "fsub", fsub },
{ "fsubr", fsubr },
{ "fdiv", fdiv },
{ "fdivr", fdivr },
{ "fld", fld },
{ "fxch", fxch },
{ "fst", fst },
{ "fstp", fstp },
{ "fldenv", fldenv },
{ "fldcw", fldcw },
{ "fstenv", fstenv },
{ "fstcw", fstcw },
{ "fnop", fnop },
{ "fchs", fchs },
{ "fld1", fld1 },
{ "f2xm1", f2xm1 },
{ "fprem", fprem },
{ "fabs", fabs },
{ "ftst", ftst },
{ "fxam", fxam },
{ "fldl2t", fldl2t },
{ "fldl2e", fldl2e },
{ "fldpi", fldpi },
{ "fldlg2", fldlg2 },
{ "fldln2", fldln2 },
{ "fldz", fldz },
{ "fyl2x", fy12x },
{ "fptan", fptan },
{ "fpatan", fpatan },
{ "fxtract", fxtract },
{ "fprem1", fprem1 },
{ "fdecstp", fecstp },
{ "fincstp", fincstp },
{ "fyl2xp1", fyl2xp1 },
{ "fsqrt", fsqrt },
{ "fsincos", fsincos },
{ "frndint", frndint },
{ "fscale", fscale },
{ "fsin", fsin },
{ "fcos", fcos },
{ "fiadd", fiadd },
{ "fcmovb", fcmovb },
{ "fcmove", fcmove },
{ "fcmovbe", fcmovbe },
{ "fcmovu", fcmovu },
{ "fimul", fimul },
{ "ficom", ficom },
{ "ficomp", ficomp },
{ "fisub", fisub },
{ "fisubr", fisubr },
{ "fidiv", fidiv },
{ "fidivr", fidivr },
{ "fucompp", fucompp },
{ "fild", fild },
#endif
{ 0, 0 }
};