// GASM Source Code, Gareth Owen, gaz@athene.co.uk, http://gasm.cjb.net
// YOU MUST READ LICENSE.TXT BEFORE USE OF THE SOURCE CODE IS PERMITTED, 
// IF YOU DO NOT HAVE LICENSE.TXT THEN EITHER GET A COPY OF 
// DELETE THIS SOURCE CODE

/*
GASM Assembler
Copyright (C) 1999  Gareth Owen <gaz@athene.co.uk>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#ifndef 	GASM_INCLUDE
#define		GASM_INCLUDE


// These are used by Evaluator() and by the dynamic instruction lookup table
#define EVALUATE_ERROR		0
#define EVALUATE_NONE		0
#define EVALUATE_REG8		1
#define EVALUATE_REG16		2
#define EVALUATE_REG32		3
#define EVALUATE_REGM8		4
#define EVALUATE_REGM16		5
#define EVALUATE_REGM32		6
#define EVALUATE_IMM8		7
#define EVALUATE_IMM16		8
#define EVALUATE_IMM32		9
#define EVALUATE_PTR16_PTR16    10
#define EVALUATE_PTR16_PTR32	11
#define EVALUATE_AL		12
#define EVALUATE_AX		13
#define EVALUATE_EAX		14
#define EVALUATE_DX		15
#define EVALUATE_SREG		16	// Segment register
#define EVALUATE_CREG		17	// Control register
#define EVALUATE_DREG		18	// Debug register
#define EVALUATE_CL		19

#define PREFIX_CS               1
#define PREFIX_SS		2
#define PREFIX_DS		4
#define PREFIX_ES		8
#define PREFIX_FS		16
#define PREFIX_GS		32
#define PREFIX_REPNZ	64
#define PREFIX_REPZ	128
#define PREFIX_REP	256
#define PREFIX_LOCK	512

#define FALSE			0
#define TRUE			1

#define MODRM_OPCODE_0		0
#define MODRM_OPCODE_1          0x08
#define MODRM_OPCODE_2          0x10
#define MODRM_OPCODE_3          0x18
#define MODRM_OPCODE_4          0x20
#define MODRM_OPCODE_5          0x28
#define MODRM_OPCODE_6          0x30
#define MODRM_OPCODE_7          0x38

#define FORMAT_NONE		0		// Must be static, so this should be here :-)
#define FORMAT_MODRM		1	// Is there a MOD-RM byte?
#define FORMAT_REL8		2
#define FORMAT_REL16		4
#define FORMAT_REL32		8
#define FORMAT_REGPLUSOP	16

#define MODRM_FORMAT_AX		1L	// AX, EAX, AL, MM0
#define MODRM_FORMAT_BX		2L	// BX, EBX, BL, MM3
#define MODRM_FORMAT_CX		4L	// ECX, CX, CL, MM1
#define MODRM_FORMAT_DX		8L	// EDX, DX, DL, MM2
#define MODRM_FORMAT_SI		16L	// ESI, SI, DH, MM6
#define MODRM_FORMAT_DI		32L	// EDI, DI, BH, MM7
#define MODRM_FORMAT_BP		64L	// EBP, BP, CH, MM5
#define MODRM_FORMAT_SP		128L	// ESP, SP, AH, MM4
#define MODRM_FORMAT_DISP8	256L	// 8bit Displacement
#define MODRM_FORMAT_DISP16	512L	// 16bit Displacement
#define MODRM_FORMAT_INBRACK	1024L	// memory location (ie, in brackets)

#define MODRM_FORMAT_EAX	2048L
#define MODRM_FORMAT_EBX	4096L
#define MODRM_FORMAT_ECX	8192L
#define MODRM_FORMAT_EDX	16384L
#define MODRM_FORMAT_ESI	32768L
#define MODRM_FORMAT_EDI	65536L
#define MODRM_FORMAT_EBP	131072L
#define MODRM_FORMAT_ESP	262144L
#define MODRM_FORMAT_DISP32	524288L


#define SIZE_CORRECT_NONE	0
#define SIZE_CORRECT_BYTE	1
#define SIZE_CORRECT_WORD	2


typedef struct
{
	char l_name[40];
	long m_offset;
	char active;
	unsigned char pass_number;
} t_label;

#define MAX_LABELS 500
t_label labels[MAX_LABELS];

typedef struct
{
	unsigned int length;
	unsigned char *i;
} t_instruction;

typedef struct
{
	unsigned char modrm_byte;	// modrm byte, duh.. :-)
	unsigned long format;		// uses MODRM_FORMAT defines
} t_modrm;

typedef struct
{
	unsigned char value;
	char reg[4];
} t_reg_lookup;

t_reg_lookup reg_lookup[] = {
	{0, "al"}, {1, "cl"}, {2, "dl"}, {3, "bl"}, {4, "ah"}, {5, "ch"}, {6, "dh"}, {7, "bh"},
	{0, "ax"}, {1, "cx"}, {2, "dx"}, {3, "bx"}, {4, "sp"}, {5, "bp"}, {6, "si"}, {7, "di"},
	{0, "eax"}, {1, "ecx"}, {2, "edx"}, {3, "ebx"}, {4, "esp"}, {5, "ebp"}, {6, "esi"}, {7, "edi"},
	{0, ""}
};

t_modrm modrm_lookup[] = {
	{0x00, MODRM_FORMAT_BX + MODRM_FORMAT_SI + MODRM_FORMAT_INBRACK},	// [BX][SI]
	{0x01, MODRM_FORMAT_BX + MODRM_FORMAT_DI + MODRM_FORMAT_INBRACK},	// [BX][DI]
	{0x02, MODRM_FORMAT_BP + MODRM_FORMAT_SI + MODRM_FORMAT_INBRACK},	// [BP][SI]
	{0x03, MODRM_FORMAT_BP + MODRM_FORMAT_DI + MODRM_FORMAT_INBRACK},	// [BP][DI]
	{0x04, MODRM_FORMAT_SI + MODRM_FORMAT_INBRACK},		// [SI]
	{0x05, MODRM_FORMAT_DI + MODRM_FORMAT_INBRACK},		// [DI]
	{0x06, MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK},	// [0x0000]
	{0x07, MODRM_FORMAT_BX + MODRM_FORMAT_INBRACK},		// [BX]

	{0x40, MODRM_FORMAT_BX + MODRM_FORMAT_SI + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [BX][SI][0x00]
	{0x41, MODRM_FORMAT_BX + MODRM_FORMAT_DI + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [BX][DI][0x00]
	{0x42, MODRM_FORMAT_BP + MODRM_FORMAT_SI + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [BP][SI][0x00]
	{0x43, MODRM_FORMAT_BP + MODRM_FORMAT_DI + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [BP][DI][0x00]
	{0x44, MODRM_FORMAT_SI + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [SI][0x00]
	{0x45, MODRM_FORMAT_DI + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [DI][0x00]
	{0x46, MODRM_FORMAT_BP + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [BP][0x00]
	{0x47, MODRM_FORMAT_BX + MODRM_FORMAT_DISP8 + MODRM_FORMAT_INBRACK},	// [BX][0x00]

	{0x80, MODRM_FORMAT_BX + MODRM_FORMAT_SI + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK},	// [BX][SI][0x0000]
	{0x81, MODRM_FORMAT_BX + MODRM_FORMAT_DI + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK}, // [BX][DI][0x0000]
	{0x82, MODRM_FORMAT_BP + MODRM_FORMAT_SI + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK}, // [BP][SI][0x0000]
	{0x83, MODRM_FORMAT_BP + MODRM_FORMAT_DI + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK}, // [BP][DI][0x0000]
	{0x84, MODRM_FORMAT_SI + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK},	// [SI][0x0000]
	{0x85, MODRM_FORMAT_DI + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK},	// [DI][0x0000]
	{0x86, MODRM_FORMAT_BP + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK},	// [BP][0x0000]
	{0x87, MODRM_FORMAT_BX + MODRM_FORMAT_DISP16 + MODRM_FORMAT_INBRACK},	// [BX][0x0000]

	{0x40, MODRM_FORMAT_BX + MODRM_FORMAT_SI + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [BX][SI][0x00]
	{0x41, MODRM_FORMAT_BX + MODRM_FORMAT_DI + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [BX][DI][0x00]
	{0x42, MODRM_FORMAT_BP + MODRM_FORMAT_SI + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [BP][SI][0x00]
	{0x43, MODRM_FORMAT_BP + MODRM_FORMAT_DI + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [BP][DI][0x00]
	{0x44, MODRM_FORMAT_SI + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [SI][0x00]
	{0x45, MODRM_FORMAT_DI + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [DI][0x00]
	{0x46, MODRM_FORMAT_BP + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [BP][0x00]
	{0x47, MODRM_FORMAT_BX + MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},	// [BX][0x00]

	{0xC0, MODRM_FORMAT_AX},	// AX, AL
	{0xC1, MODRM_FORMAT_CX},	// CX, CL
	{0xC2, MODRM_FORMAT_DX},	// DX, DL
	{0xC3, MODRM_FORMAT_BX},	// BX, BL
	{0xC4, MODRM_FORMAT_SP},	// SP, AH
	{0xC5, MODRM_FORMAT_BP},	// BP, CH
	{0xC6, MODRM_FORMAT_SI},	// SI, DH
	{0xC7, MODRM_FORMAT_DI},	// DI, BH
	

// <-> <-> 32bit - MODRM32 <-> <->
	
	{0x00, MODRM_FORMAT_EAX + MODRM_FORMAT_INBRACK},		// [EAX]
	{0x01, MODRM_FORMAT_ECX + MODRM_FORMAT_INBRACK},		// [ECX]
	{0x02, MODRM_FORMAT_EDX + MODRM_FORMAT_INBRACK},		// [EDX]
	{0x03, MODRM_FORMAT_EBX + MODRM_FORMAT_INBRACK},		// [EBX]
	{0x05, MODRM_FORMAT_DISP32 + MODRM_FORMAT_INBRACK},		// [0x00000000]
	{0x06, MODRM_FORMAT_ESI + MODRM_FORMAT_INBRACK},		// [ESI]
	{0x07, MODRM_FORMAT_EDI + MODRM_FORMAT_INBRACK},		// [EDI]

	{0x40, MODRM_FORMAT_DISP8 + MODRM_FORMAT_EAX + MODRM_FORMAT_INBRACK},	// [0x00][EAX]
	{0x41, MODRM_FORMAT_DISP8 + MODRM_FORMAT_ECX + MODRM_FORMAT_INBRACK},	// [0x00][ECX]
	{0x42, MODRM_FORMAT_DISP8 + MODRM_FORMAT_EDX + MODRM_FORMAT_INBRACK},	// [0x00][EDX]
	{0x43, MODRM_FORMAT_DISP8 + MODRM_FORMAT_EBX + MODRM_FORMAT_INBRACK},	// [0x00][EBX]
	{0x45, MODRM_FORMAT_DISP8 + MODRM_FORMAT_EBP + MODRM_FORMAT_INBRACK},	// [0x00][EBP]
	{0x46, MODRM_FORMAT_DISP8 + MODRM_FORMAT_ESI + MODRM_FORMAT_INBRACK},	// [0x00][ESI]
	{0x47, MODRM_FORMAT_DISP8 + MODRM_FORMAT_EDI + MODRM_FORMAT_INBRACK},	// [0x00][EDI]

	{0xC0, MODRM_FORMAT_EAX},
	{0xC1, MODRM_FORMAT_ECX},
	{0xC2, MODRM_FORMAT_EDX},
	{0xC3, MODRM_FORMAT_EBX},
	{0xC4, MODRM_FORMAT_ESP},
	{0xC5, MODRM_FORMAT_EBP},
	{0xC6, MODRM_FORMAT_ESI},
	{0xC7, MODRM_FORMAT_EDI},
	
	{0x00, 0x00}	// Terminator
};

typedef struct
{
	char c1;
	char c2;
	char c3;
	char length;
	char i_name[20];
	char bits;
} t_fixed_instruction;

typedef struct
{
	unsigned char c1, c2 ,c3;
	unsigned char opcode_length;
	unsigned char initial_modrm;
        unsigned int parm1, parm2;
	unsigned int format;
	char instruction[10];
} t_dynamic_instruction;


unsigned int Evaluator(char *e_string);
void Addlabel(char *label_name, long offset);
t_label Findlabel(char *label_name);
unsigned char StringtoChar(char *string);
unsigned int  StringtoInt(char *string);
unsigned long StringtoLong(char *string);

t_fixed_instruction fixed_instruction_lookup[] = {
	{0x37, 0x00, 0x00, 1, "aaa", 16},		{0xD5, 0x0A, 0x00, 2, "aad", 16},
	{0xD4, 0x0A, 0x00, 2, "aam", 16},		{0x3F, 0x00, 0x00, 1, "aas", 16},
	{0x98, 0x00, 0x00, 1, "cbw", 16},		{0x98, 0x00, 0x00, 1, "cwde", 32},
	{0xF8, 0x00, 0x00, 1, "clc", 16},		{0xFC, 0x00, 0x00, 1, "cld", 16},
	{0xFA, 0x00, 0x00, 1, "cli", 16},		{0x0F, 0x06, 0x00, 2, "clts", 16},
	{0xF5, 0x00, 0x00, 1, "cmc", 16},		{0xA6, 0x00, 0x00, 1, "cmpsb", 16},
	{0xA7, 0x00, 0x00, 1, "cmpsw", 16},		{0xA7, 0x00, 0x00, 1, "cmpsd", 32},
	{0x0F, 0xA2, 0x00, 2, "cpuid", 16},  	{0x99, 0x00, 0x00, 1, "cwd", 16},		
	{0x99, 0x00, 0x00, 1, "cdq", 32},		{0x27, 0x00, 0x00, 1, "daa", 16},		
	{0x2F, 0x00, 0x00, 1, "das", 16},		{0x0F, 0x77, 0x00, 2, "emms", 16},		
	{0xD9, 0xF0, 0x00, 2, "f2xm1", 16},		{0xD9, 0xE1, 0x00, 2, "fabs", 16},		
	{0xDE, 0xC1, 0x00, 2, "faddp", 16},		{0xD9, 0xE0, 0x00, 2, "fchs", 16},		
	{0x9B, 0xDB, 0xE2, 3, "fclex", 16},		{0xDB, 0xE2, 0x00, 2, "fnclex", 16},	
	{0xD8, 0xD1, 0x00, 2, "fcom", 16},		{0xD8, 0xD9, 0x00, 2, "fcomp", 16},		
	{0xDE, 0xD9, 0x00, 2, "fcompp", 16},	{0xD9, 0xFF, 0x00, 2, "fcos", 16},		
	{0xD9, 0xF6, 0x00, 2, "fdecstp", 16},	{0xDE, 0xF9, 0x00, 2, "fdivp", 16},		
	{0xDE, 0xF1, 0x00, 2, "fdivrp", 16},	{0xD9, 0xF7, 0x00, 2, "fincstp", 16},	
	{0x9B, 0xDB, 0xE3, 3, "finit", 16},		{0xDB, 0xE3, 0x00, 2, "fninit", 16},	
	{0xD9, 0xE8, 0x00, 2, "fld1", 16},		{0xD9, 0xE9, 0x00, 2, "fldl2t", 16},	
	{0xD9, 0xEA, 0x00, 2, "fldl2e", 16},	{0xD9, 0xEB, 0x00, 2, "fldpi", 16}, 	
	{0xD9, 0xEC, 0x00, 2, "fldlg2", 16},	{0xD9, 0xED, 0x00, 2, "fldln2", 16},	
	{0xD9, 0xEE, 0x00, 2, "fldz", 16},		{0xDE, 0xC9, 0x00, 2, "fmulp", 16}, 	
	{0xD9, 0xD0, 0x00, 2, "fnop", 16},		{0xD9, 0xF3, 0x00, 2, "fpatan", 16},	
	{0xD9, 0xF8, 0x00, 2, "fprem", 16},		{0xD9, 0xF5, 0x00, 2, "fprem1", 16},	
	{0xD9, 0xF2, 0x00, 2, "fptan", 16},		{0xD9, 0xFC, 0x00, 2, "frndint", 16},	
	{0xD9, 0xFD, 0x00, 2, "fscale", 16},	{0xD9, 0xFE, 0x00, 2, "fsin", 16},		
	{0xD9, 0xFB, 0x00, 2, "fsincos", 16},	{0xD9, 0xFA, 0x00, 2, "fsqrt", 16},		
	{0xDE, 0xE9, 0x00, 2, "fsubp", 16},		{0xDE, 0xE1, 0x00, 2, "fsubrp", 16},	
	{0xD9, 0xE4, 0x00, 2, "ftst", 16},		{0xDD, 0xE1, 0x00, 2, "fucom", 16},		
	{0xDD, 0xE9, 0x00, 2, "fucomp", 16},	{0xD9, 0xE5, 0x00, 2, "fxam", 16},		
	{0xD9, 0xC9, 0x00, 2, "fxch", 16},		{0xD9, 0xF4, 0x00, 2, "fxtract", 16},	
	{0xD9, 0xF1, 0x00, 2, "fyl2x", 16},		{0xD9, 0xF9, 0x00, 2, "fyl2xp1", 16},	
	{0xF4, 0x00, 0x00, 1, "hlt", 16},		{0x6C, 0x00, 0x00, 1, "insb", 16},		
	{0x6D, 0x00, 0x00, 1, "insw", 16},		{0x6D, 0x00, 0x00, 1, "insd", 32},		
	{0xCE, 0x00, 0x00, 1, "into", 16},		{0x0F, 0x08, 0x00, 2, "invd", 16},		
	{0xCF, 0x00, 0x00, 1, "iret", 16},		{0xCF, 0x00, 0x00, 1, "iretd", 32},		
	{0x9F, 0x00, 0x00, 1, "lahf", 16},		{0xC9, 0x00, 0x00, 1, "leave", 16},		
	{0xAC, 0x00, 0x00, 1, "lodsb", 16},		{0xF0, 0x00, 0x00, 1, "lock", 16},
	{0xAD, 0x00, 0x00, 1, "lodsw", 16},		{0xAD, 0x00, 0x00, 1, "lodsd", 32},		
	{0xA4, 0x00, 0x00, 1, "movsb", 16},		{0xA5, 0x00, 0x00, 1, "movsw", 16},		
	{0xA5, 0x00, 0x00, 1, "movsd", 32},		{0x90, 0x00, 0x00, 1, "nop", 16},		
	{0x6E, 0x00, 0x00, 1, "outsb", 16},		{0x6f, 0x00, 0x00, 1, "outsw", 16},		
	{0x6F, 0x00, 0x00, 1, "outsd", 32},		{0x61, 0x00, 0x00, 1, "popa", 16},		
	{0x61, 0x00, 0x00, 1, "popad", 32},		{0x9D, 0x00, 0x00, 1, "popf", 16},		
	{0x9D, 0x00, 0x00, 1, "popfd", 32},		{0x60, 0x00, 0x00, 1, "pusha", 16},		
	{0x60, 0x00, 0x00, 1, "pushad", 32},	{0x9C, 0x00, 0x00, 1, "pushf", 16},		
	{0x9C, 0x00, 0x00, 1, "pushfd", 32},	{0x0F, 0x32, 0x00, 2, "rdmsr", 16},
	{0xF2, 0x00, 0x00, 1, "repne", 16},	{0xF2, 0x00, 0x00, 1, "repnz", 16},		
	{0xF3, 0x00, 0x00, 1, "rep", 16},		{0xF3, 0x00, 0x00, 1, "repe", 16},
	{0xF3, 0x00, 0x00, 1, "repz", 16},
	{0x0F, 0x33, 0x00, 2, "rdpmc", 16},		{0x0F, 0x31, 0x00, 2, "rdtsc", 16},		
	{0xC3, 0x00, 0x00, 1, "ret", 16},		{0xCB, 0x00, 0x00, 1, "retf", 16},		
	{0x0F, 0xAA, 0x00, 2, "rsm", 16},		{0x9E, 0x00, 0x00, 1, "sahf", 16},		
	{0xAE, 0x00, 0x00, 1, "scasb", 16},		{0xAF, 0x00, 0x00, 1, "scasw", 16},		
	{0xAF, 0x00, 0x00, 1, "scasd", 32},		{0xF9, 0x00, 0x00, 1, "stc", 16},		
	{0xFD, 0x00, 0x00, 1, "std", 16},		{0xFB, 0x00, 0x00, 1, "sti", 16},		
	{0xAA, 0x00, 0x00, 1, "stosb", 16},		{0xAB, 0x00, 0x00, 1, "stosw", 16},		
	{0xAB, 0x00, 0x00, 1, "stosd", 32},		{0x0F, 0x0B, 0x00, 2, "ud2", 16},		
	{0x9B, 0x00, 0x00, 1, "wait", 16},		{0x9B, 0x00, 0x00, 1, "fwait", 32},		
	{0x0F, 0x09, 0x00, 2, "wbinvd", 16},	{0x0F, 0x30, 0x00, 2, "wrmsr", 16},		
	{0xD7, 0x00, 0x00, 1, "xlat", 16}, 		

	{0x00, 0x00, 0x00, 0, ""}	// Terminator
};

t_dynamic_instruction dynamic_lookup[] = {
	{0x14, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "adc"},
        {0x15, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "adc"},
        {0x15, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "adc"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "adc"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "adc"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "adc"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "adc"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "adc"},
	{0x10, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "adc"},
	{0x11, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "adc"},
	{0x11, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "adc"},
	{0x12, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "adc"},
	{0x13, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "adc"},
	{0x13, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "adc"},


	{0x04, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "add"},
	{0x05, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "add"},
	{0x05, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "add"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "add"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "add"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "add"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "add"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "add"},
	{0x00, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "add"},
	{0x01, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "add"},
	{0x01, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "add"},
	{0x02, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "add"},
	{0x03, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "add"},
	{0x03, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "add"},

	{0x24, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "and"},
	{0x25, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "and"},
	{0x25, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "and"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "and"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "and"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "and"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "and"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "and"},
	{0x20, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "and"},
	{0x21, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "and"},
	{0x21, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "and"},
	{0x22, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "and"},
	{0x23, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "and"},
	{0x23, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "and"},
	
	{0x63, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "arpl"},

	{0x62, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "bound"},
	{0x62, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "bound"},

	{0x0F, 0xBC, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "bsf"},
	{0x0F, 0xBC, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "bsf"},

	{0x0F, 0xBD, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "bsr"},
	{0x0F, 0xBD, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "bsr"},

	{0x0F, 0xC8, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_NONE, FORMAT_REGPLUSOP, "bswap"},

	{0x0F, 0xA3, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "bt"},
	{0x0F, 0xA3, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "bt"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "bt"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "bt"},

	{0x0F, 0xBB, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "btc"},
	{0x0F, 0xBB, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "btc"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_7, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "btc"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_7, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "btc"},

	{0x0F, 0xB3, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "btr"},
	{0x0F, 0xB3, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "btr"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_6, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "btr"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_6, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "btr"},

	{0x0F, 0xAB, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "bts"},
	{0x0F, 0xAB, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "bts"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "bts"},
	{0x0F, 0xBA, 0x00, 2, MODRM_OPCODE_5, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "bts"},

	{0xE8, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "call"},
	{0xE8, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "call"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "call"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "call"},
	{0x9A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_PTR16_PTR16, EVALUATE_NONE, FORMAT_NONE, "call"},
	{0x9A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_PTR16_PTR32, EVALUATE_NONE, FORMAT_NONE, "call"},


	{0x0F, 0x47, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmova"},
	{0x0F, 0x47, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmova"},
	{0x0F, 0x43, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovae"},
	{0x0F, 0x43, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovae"},
	{0x0F, 0x42, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovb"},
	{0x0F, 0x42, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovb"},
	{0x0F, 0x46, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovbe"},
	{0x0F, 0x46, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovbe"},
	{0x0F, 0x42, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovc"},
	{0x0F, 0x42, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovc"},
	{0x0F, 0x44, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmove"},
	{0x0F, 0x44, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmove"},
	{0x0F, 0x4F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovg"},
	{0x0F, 0x4F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovg"},
	{0x0F, 0x4D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovge"},
	{0x0F, 0x4D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovge"},
	{0x0F, 0x4C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovl"},
	{0x0F, 0x4C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovl"},
	{0x0F, 0x4E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovle"},
	{0x0F, 0x4E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovle"},
	{0x0F, 0x46, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovna"},
	{0x0F, 0x46, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovna"},
	{0x0F, 0x42, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnae"},
	{0x0F, 0x42, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnae"},
	{0x0F, 0x43, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnb"},
	{0x0F, 0x43, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnb"},
	{0x0F, 0x47, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnbe"},
	{0x0F, 0x47, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnbe"},
	{0x0F, 0x43, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnc"},
	{0x0F, 0x43, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnc"},
	{0x0F, 0x45, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovne"},
	{0x0F, 0x45, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovne"},
	{0x0F, 0x4E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovng"},
	{0x0F, 0x4E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovng"},
	{0x0F, 0x4C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnge"},
	{0x0F, 0x4C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnge"},
	{0x0F, 0x4D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnl"},
	{0x0F, 0x4D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnl"},
	{0x0F, 0x4F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnle"},
	{0x0F, 0x4F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnle"},
	{0x0F, 0x41, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovno"},
	{0x0F, 0x41, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovno"},
	{0x0F, 0x4B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnp"},
	{0x0F, 0x4B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnp"},
	{0x0F, 0x49, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovns"},
	{0x0F, 0x49, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovns"},
	{0x0F, 0x45, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovnz"},
	{0x0F, 0x45, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovnz"},
	{0x0F, 0x40, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovo"},
	{0x0F, 0x40, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovo"},
	{0x0F, 0x4A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovp"},
	{0x0F, 0x4A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovp"},
	{0x0F, 0x4A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovpe"},
	{0x0F, 0x4A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovpe"},
	{0x0F, 0x4B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovpo"},
	{0x0F, 0x4B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovpo"},
	{0x0F, 0x48, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovs"},
	{0x0F, 0x48, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovs"},
	{0x0F, 0x44, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmovz"},
	{0x0F, 0x44, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmovz"},

	{0x3C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "cmp"},
	{0x3D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "cmp"},
	{0x3D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "cmp"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "cmp"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "cmp"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "cmp"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "cmp"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "cmp"},
	{0x38, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "cmp"},
	{0x39, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "cmp"},
	{0x39, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "cmp"},
	{0x3A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM16, FORMAT_MODRM, "cmp"},
	{0x3B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "cmp"},
	{0x3B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "cmp"},

	{0x0F, 0xB0, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "cmpxchg"},
	{0x0F, 0xB1, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "cmpxchg"},
	{0x0F, 0xB1, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "cmpxchg"},

	{0xFE, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "dec"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "dec"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "dec"},
	{0x48, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_NONE, FORMAT_REGPLUSOP, "dec"},
	{0x48, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_NONE, FORMAT_REGPLUSOP, "dec"},

	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "div"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "div"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "div"},

	{0xC8, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_IMM8, FORMAT_NONE, "enter"},

	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "idiv"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "idiv"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "idiv"},

	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "imul"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "imul"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "imul"},
	{0x0F, 0xAF, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "imul"},
	{0x0F, 0xAF, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "imul"},
	
	{0xE4, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "in"},
	{0xE5, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM8, FORMAT_NONE, "in"},
	{0xE5, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM8, FORMAT_NONE, "in"},

	{0xEC, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_DX, FORMAT_NONE, "in"},
	{0xED, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_DX, FORMAT_NONE, "in"},
	{0xED, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_DX, FORMAT_NONE, "in"},

	{0xFE, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "inc"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "inc"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "inc"},
	{0x40, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_NONE, FORMAT_REGPLUSOP, "inc"},
	{0x40, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_NONE, FORMAT_REGPLUSOP, "inc"},

	{0xCD, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_NONE, "int"},

	{0x77, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "ja"},
	{0x73, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jae"},
	{0x72, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jb"},
	{0x76, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jbe"},
	{0x72, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jc"},
	{0xE3, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jcxz"},
	{0xE3, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jecxz"},
	{0x74, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "je"},
	{0x7F, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jg"},
	{0x7D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jge"},
	{0x7C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jl"},
	{0x7E, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jle"},
	{0x76, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jna"},
	{0x72, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnae"},
	{0x73, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnb"},
	{0x77, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnbe"},
	{0x73, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnc"},
	{0x75, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jne"},
	{0x7E, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jng"},
	{0x7C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnge"},
	{0x7D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnl"},
	{0x7F, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnle"},
	{0x71, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jno"},
	{0x7B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnp"},
	{0x79, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jns"},
	{0x75, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jnz"},
	{0x70, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jo"},
	{0x7A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jp"},
	{0x7A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jpe"},
	{0x7B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jpo"},
	{0x78, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "js"},
	{0x74, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jz"},
	{0x0F, 0x87, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "ja"},
	{0x0F, 0x87, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "ja"},
	{0x0F, 0x83, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jae"},
	{0x0F, 0x83, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jae"},
	{0x0F, 0x82, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jb"},
	{0x0F, 0x82, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jb"},
	{0x0F, 0x86, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jbe"},
	{0x0F, 0x86, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jbe"},
	{0x0F, 0x82, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jc"},
	{0x0F, 0x82, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jc"},
	{0x0F, 0x84, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "je"},
	{0x0F, 0x84, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "je"},
	{0x0F, 0x84, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jz"},
	{0x0F, 0x84, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jz"},
	{0x0F, 0x8F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jg"},
	{0x0F, 0x8F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jg"},
	{0x0F, 0x8D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jge"},
	{0x0F, 0x8D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jge"},
	{0x0F, 0x8C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jl"},
	{0x0F, 0x8C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jl"},
	{0x0F, 0x8E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jle"},
	{0x0F, 0x8E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jle"},
	{0x0F, 0x86, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jna"},
	{0x0F, 0x86, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jna"},
	{0x0F, 0x82, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnae"},
	{0x0F, 0x82, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnae"},
	{0x0F, 0x83, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnb"},
	{0x0F, 0x83, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnb"},
	{0x0F, 0x87, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnbe"},
	{0x0F, 0x87, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnbe"},
	{0x0F, 0x83, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnc"},
	{0x0F, 0x83, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnc"},
	{0x0F, 0x85, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jne"},
	{0x0F, 0x85, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jne"},
	{0x0F, 0x8E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jng"},
	{0x0F, 0x8E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jng"},
	{0x0F, 0x8C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnge"},
	{0x0F, 0x8C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnge"},
	{0x0F, 0x8D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnl"},
	{0x0F, 0x8D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnl"},
	{0x0F, 0x8F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnle"},
	{0x0F, 0x8F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnle"},
	{0x0F, 0x81, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jno"},
	{0x0F, 0x81, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jno"},
	{0x0F, 0x8B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnp"},
	{0x0F, 0x8B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnp"},
	{0x0F, 0x89, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jns"},
	{0x0F, 0x89, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jns"},
	{0x0F, 0x85, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jnz"},
	{0x0F, 0x85, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jnz"},
	{0x0F, 0x80, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jo"},
	{0x0F, 0x80, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jo"},
	{0x0F, 0x8A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jp"},
	{0x0F, 0x8A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jp"},
	{0x0F, 0x8A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jpe"},
	{0x0F, 0x8A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jpe"},
	{0x0F, 0x8B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jpo"},
	{0x0F, 0x8B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jpo"},
	{0x0F, 0x88, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "js"},
	{0x0F, 0x88, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "js"},
	{0x0F, 0x84, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jz"},
	{0x0F, 0x84, 0x00, 2, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jz"},

	{0xEB, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "jmp"},
	{0xE9, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_REL16, "jmp"},
	{0xE9, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_REL32, "jmp"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "jmp"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "jmp"},
	{0xEA, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_PTR16_PTR16, EVALUATE_NONE, FORMAT_NONE, "jmp"},
	{0xEA, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_PTR16_PTR32, EVALUATE_NONE, FORMAT_NONE, "jmp"},
	
	{0x0F, 0x02, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lar"},
	{0x0F, 0x02, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lar"},

	{0xC5, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lds"},
	{0xC5, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lds"},

	{0x0F, 0xB2, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lss"},
	{0x0F, 0xB2, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lss"},

	{0xC4, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "les"},
	{0xC4, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "les"},

	{0x0F, 0xB4, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lfs"},
	{0x0F, 0xB4, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lfs"},

	{0x0F, 0xB5, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lgs"},
	{0x0F, 0xB5, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lgs"},

	{0x8D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lea"},
	{0x8D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lea"},

	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "lgdt"},
	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "lgdt"},
	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "lidt"},
	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_3, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "lidt"},

	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "lldt"},

	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_6, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "lmsw"},

	{0xE2, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "loop"},
	{0xE1, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "loope"},
	{0xE1, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "loopz"},
	{0xE0, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "loopne"},
	{0xE0, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_REL8, "loopnz"},

	{0x0F, 0x03, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "lsl"},
	{0x0F, 0x03, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "lsl"},

	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "ltr"},

	{0x88, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "mov"},
	{0x89, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "mov"},
	{0x89, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "mov"},
	{0x8A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "mov"},
	{0x8B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "mov"},
	{0x8B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "mov"},
	{0xC6, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "mov"},
	{0xC7, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "mov"},
	{0xC7, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "mov"},
	{0x8C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_SREG, FORMAT_MODRM, "mov"},
	{0x8E, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_SREG, EVALUATE_REGM16, FORMAT_MODRM, "mov"},
	{0x0F, 0x22, 0x00, 2, MODRM_OPCODE_0, EVALUATE_CREG, EVALUATE_REGM32, FORMAT_MODRM, "mov"},
	{0x0F, 0x20, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_CREG, FORMAT_MODRM, "mov"},
	{0x0F, 0x23, 0x00, 2, MODRM_OPCODE_0, EVALUATE_DREG, EVALUATE_REGM32, FORMAT_MODRM, "mov"},
	{0x0F, 0x21, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_DREG, FORMAT_MODRM, "mov"},
	{0xB0, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_IMM8, FORMAT_REGPLUSOP, "mov"},
	{0xB8, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_IMM16, FORMAT_REGPLUSOP, "mov"},
	{0xB8, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_IMM32, FORMAT_REGPLUSOP, "mov"},

	{0x0F, 0xBE, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM8, FORMAT_MODRM, "movsx"},
	{0x0F, 0xBE, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM8, FORMAT_MODRM, "movsx"},
	{0x0F, 0xBE, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM16, FORMAT_MODRM, "movsx"},
	
	{0x0F, 0xB6, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM8, FORMAT_MODRM, "movzx"},
	{0x0F, 0xB6, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM8, FORMAT_MODRM, "movzx"},
	{0x0F, 0xB7, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM16, FORMAT_MODRM, "movzx"},

	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "mul"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "mul"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "mul"},

	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "neg"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "neg"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "neg"},

	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "not"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "not"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "not"},

	{0x0C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "or"},
	{0x0D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "or"},
	{0x0D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "or"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "or"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "or"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "or"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "or"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "or"},
	{0x08, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "or"},
	{0x09, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "or"},
	{0x09, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "or"},
	{0x0A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "or"},
	{0x0B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "or"},
	{0x0B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "or"},

	{0xE6, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_AL, FORMAT_NONE, "out"},
	{0xE7, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_AX, FORMAT_NONE, "out"},
	{0xE7, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_EAX, FORMAT_NONE, "out"},
	{0xEE, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_DX, EVALUATE_AL, FORMAT_NONE, "out"},
	{0xEF, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_DX, EVALUATE_AX, FORMAT_NONE, "out"},
	{0xEF, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_DX, EVALUATE_EAX, FORMAT_NONE, "out"},

	{0x8F, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "pop"},
	{0x8F, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "pop"},
	{0x58, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_NONE, FORMAT_REGPLUSOP, "pop"},
	{0x58, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_NONE, FORMAT_REGPLUSOP, "pop"},

	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "push"},
	{0xFF, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "push"},
	{0x6A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM8, EVALUATE_NONE, FORMAT_NONE, "push"},
	{0x68, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_NONE, "push"},
	{0x68, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM32, EVALUATE_NONE, FORMAT_NONE, "push"},
	{0x50, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_NONE, FORMAT_REGPLUSOP, "push"},
	{0x50, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_NONE, FORMAT_REGPLUSOP, "push"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "rcl"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "rcl"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "rcl"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "rcl"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "rcl"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_2, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "rcl"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "rcr"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "rcr"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "rcr"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "rcr"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "rcr"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "rcr"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "rol"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "rol"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "rol"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "rol"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "rol"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "rol"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "ror"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "ror"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "ror"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "ror"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "ror"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_1, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "ror"},

	{0xC2, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_NONE, "ret"},
	{0xCA, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_IMM16, EVALUATE_NONE, FORMAT_NONE, "retf"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "sal"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "sal"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "sal"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "sal"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "sal"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "sal"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "sar"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "sar"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "sar"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "sar"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "sar"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_7, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "sar"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "shl"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "shl"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "shl"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "shl"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "shl"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_4, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "shl"},

	{0xD2, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM8, EVALUATE_CL, FORMAT_MODRM, "shr"},
	{0xC0, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "shr"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_CL, FORMAT_MODRM, "shr"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "shr"},
	{0xD3, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM32, EVALUATE_CL, FORMAT_MODRM, "shr"},
	{0xC1, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "shr"},

	{0x1C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "sbb"},
	{0x1D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "sbb"},
	{0x1D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "sbb"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "sbb"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "sbb"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "sbb"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "sbb"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_3, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "sbb"},
	{0x18, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "sbb"},
	{0x19, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "sbb"},
	{0x19, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "sbb"},
	{0x1A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "sbb"},
	{0x1B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "sbb"},
	{0x1B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "sbb"},

	{0x0F, 0x97, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "seta"},
	{0x0F, 0x93, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setae"},
	{0x0F, 0x92, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setb"},
	{0x0F, 0x96, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setbe"},
	{0x0F, 0x92, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setc"},
	{0x0F, 0x94, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "sete"},
	{0x0F, 0x9F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setg"},
	{0x0F, 0x9D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setge"},
	{0x0F, 0x9C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setl"},
	{0x0F, 0x9E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setle"},
	{0x0F, 0x96, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setna"},
	{0x0F, 0x92, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnae"},
	{0x0F, 0x93, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnb"},
	{0x0F, 0x97, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnbe"},
	{0x0F, 0x93, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnc"},
	{0x0F, 0x95, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setne"},
	{0x0F, 0x9E, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setng"},
	{0x0F, 0x9C, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnge"},
	{0x0F, 0x9D, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnl"},
	{0x0F, 0x9F, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnle"},
	{0x0F, 0x91, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setno"},
	{0x0F, 0x9B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnp"},
	{0x0F, 0x99, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setns"},
	{0x0F, 0x95, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setnz"},
	{0x0F, 0x90, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "seto"},
	{0x0F, 0x9A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setp"},
	{0x0F, 0x9A, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setpe"},
	{0x0F, 0x9B, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setpo"},
	{0x0F, 0x98, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "sets"},
	{0x0F, 0x94, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_NONE, FORMAT_MODRM, "setz"},

	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "sgdt"},
	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "sgdt"},

	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "sidt"},
	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_1, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "sidt"},

	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "sldt"},
	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_NONE, FORMAT_MODRM, "sldt"},

	{0x0F, 0x01, 0x00, 2, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "smsw"},

	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_1, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "str"},

	{0x2C, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "sub"},
	{0x2D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "sub"},
	{0x2D, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "sub"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "sub"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "sub"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "sub"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "sub"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_5, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "sub"},
	{0x28, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "sub"},
	{0x29, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "sub"},
	{0x29, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "sub"},
	{0x2A, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "sub"},
	{0x2B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "sub"},
	{0x2B, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "sub"},	

	{0xA8, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "test"},
	{0xA9, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "test"},
	{0xA9, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "test"},
	{0xF6, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "test"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "test"},
	{0xF7, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "test"},
	{0x84, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "test"},
	{0x85, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "test"},
	{0x85, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "test"},
	
	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_4, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "verr"},
	{0x0F, 0x00, 0x00, 2, MODRM_OPCODE_5, EVALUATE_REGM16, EVALUATE_NONE, FORMAT_MODRM, "verw"},

	{0x0F, 0xC0, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "xadd"},
	{0x0F, 0xC1, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "xadd"},
	{0x0F, 0xC1, 0x00, 2, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "xadd"},

	{0x90, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_REG16, FORMAT_REGPLUSOP, "xchg"},
	{0x90, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_AX, FORMAT_REGPLUSOP, "xchg"},
	{0x90, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_REG32, FORMAT_REGPLUSOP, "xchg"},
	{0x90, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_EAX, FORMAT_REGPLUSOP, "xchg"},

	{0x86, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "xchg"},
	{0x86, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "xchg"},
	{0x87, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "xchg"},
	{0x87, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "xchg"},
	{0x87, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "xchg"},
	{0x87, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "xchg"},

	{0x34, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AL, EVALUATE_IMM8, FORMAT_NONE, "xor"},
	{0x35, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_AX, EVALUATE_IMM16, FORMAT_NONE, "xor"},
	{0x35, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_EAX, EVALUATE_IMM32, FORMAT_NONE, "xor"},
	{0x80, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM8, EVALUATE_IMM8, FORMAT_MODRM, "xor"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM16, EVALUATE_IMM16, FORMAT_MODRM, "xor"},
	{0x81, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM32, EVALUATE_IMM32, FORMAT_MODRM, "xor"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM16, EVALUATE_IMM8, FORMAT_MODRM, "xor"},
	{0x83, 0x00, 0x00, 1, MODRM_OPCODE_6, EVALUATE_REGM32, EVALUATE_IMM8, FORMAT_MODRM, "xor"},
	{0x30, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM8, EVALUATE_REG8, FORMAT_MODRM, "xor"},
	{0x31, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM16, EVALUATE_REG16, FORMAT_MODRM, "xor"},
	{0x31, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REGM32, EVALUATE_REG32, FORMAT_MODRM, "xor"},
	{0x32, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG8, EVALUATE_REGM8, FORMAT_MODRM, "xor"},
	{0x33, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG16, EVALUATE_REGM16, FORMAT_MODRM, "xor"},
	{0x33, 0x00, 0x00, 1, MODRM_OPCODE_0, EVALUATE_REG32, EVALUATE_REGM32, FORMAT_MODRM, "xor"},	

        {0, 0, 0, 0, 0, 0, 0, 0, ""}
};

t_label predefines[] = {

	{"D_LDT", 0x200, TRUE, 1},
	{"D_TASK", 0x500, TRUE, 1},
	{"D_TSS", 0x900, TRUE, 1},
	{"D_CALL", 0x0C00, TRUE, 1},
	{"D_INT", 0x0E00, TRUE, 1},
	{"D_TRAP", 0x0F00, TRUE, 1},
	{"D_DATA", 0x1000, TRUE, 1},
	{"D_CODE", 0x1800, TRUE, 1},
	{"D_DPL3", 0x6000, TRUE, 1},
	{"D_DPL2", 0x4000, TRUE, 1},
	{"D_DPL1", 0x2000, TRUE, 1},
	{"D_PRESENT", 0x8000, TRUE, 1},
	{"D_NOT_PRESENT", 0x8000, TRUE, 1},
	{"D_ACC", 0x100, TRUE, 1},
	{"D_WRITE", 0x200, TRUE, 1},
	{"D_READ", 0x200, TRUE, 1},
	{"D_BUSY", 0x200, TRUE, 1},
	{"D_EXDOWN", 0x400, TRUE, 1},
	{"D_CONFORM", 0x400, TRUE, 1},
	{"D_BIG", 0x40, TRUE, 1},
	{"D_BIG_LIM", 0x80, TRUE, 1}
};
	

#endif
