12b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%module x86disasm
22b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%{
32b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#ifdef _MSC_VER
42b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef __int64         qword;
52b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#else
62b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef long long       qword;
72b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#endif
82b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
92b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include <sys/types.h>
102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_REGNAME 8
122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_PREFIX_STR 32
132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_MNEM_STR 16
142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_SIZE 20
152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_OP_STRING 32
162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_OP_RAW_STRING 64
172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_OP_XML_STRING 256
182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_NUM_OPERANDS 8
192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_STRING 512
202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_RAW_STRING 1024
212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_XML_STRING 4096
222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "../../../config.h"
242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgconst char * version_string( void ) {
272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	return PACKAGE_VERSION;
282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgconst char * version_string( void );
332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Register) x86_reg_t;
352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_EAddr) x86_ea_t;
362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Operand) x86_op_t;
372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//%rename(X86_OpList) x86_oplist_t;
382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Insn) x86_insn_t;
392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_InvOperand) x86_invariant_op_t;
402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Invariant) x86_invariant_t;
412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%include "carrays.i"
432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%array_class( unsigned char, byteArray );
452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%apply (unsigned char *STRING, int LENGTH) {
482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	(unsigned char *buf, size_t buf_len)
492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org};
502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgenum x86_asm_format {
562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unknown_syntax = 0,		/* never use! */
572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	native_syntax, 			/* header: 35 bytes */
582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	intel_syntax, 			/* header: 23 bytes */
592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	att_syntax,  			/* header: 23 bytes */
602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	xml_syntax,			/* header: 679 bytes */
612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	raw_syntax			/* header: 172 bytes */
622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org};
632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* operand class */
672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_reg_type {
692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_gen         = 0x00001, reg_in          = 0x00002,
702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_out         = 0x00004, reg_local       = 0x00008,
712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_fpu         = 0x00010, reg_seg         = 0x00020,
722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_simd        = 0x00040, reg_sys         = 0x00080,
732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_sp          = 0x00100, reg_fp          = 0x00200,
742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_pc          = 0x00400, reg_retaddr     = 0x00800,
752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_cond        = 0x01000, reg_zero        = 0x02000,
762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_ret         = 0x04000, reg_src         = 0x10000,
772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        reg_dest        = 0x20000, reg_count       = 0x40000
782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org       	 	char name[MAX_REGNAME];
822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_reg_type type;
832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        unsigned int size;
842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        unsigned int id;
852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned int alias;
862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned int shift;
872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_reg_t;
882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_reg_from_id( unsigned int id, x86_reg_t * reg );
902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        unsigned int     scale;
932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        x86_reg_t        index, base;
942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        long             disp;
952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        char             disp_sign;
962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        char             disp_size;
972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_ea_t;
982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_op_type {
1002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_unused = 0,
1012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_register = 1,
1022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_immediate = 2,
1032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_relative_near = 3,
1042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_relative_far = 4,
1052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_absolute = 5,
1062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_expression = 6,
1072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_offset = 7,
1082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_unknown
1092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
1102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_op_datatype {
1122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	       	op_byte = 1, op_word = 2,
1132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_dword = 3, op_qword = 4,
1142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_dqword = 5, op_sreal = 6,
1152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_dreal = 7, op_extreal = 8,
1162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_bcd = 9,  op_ssimd = 10,
1172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_dsimd = 11, op_sssimd = 12,
1182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_sdsimd = 13, op_descr32 = 14,
1192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_descr16 = 15, op_pdescr32 = 16,
1202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_pdescr16 = 17, op_fpuenv = 18,
1212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_fpregset = 19,
1222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
1232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_op_access {
1252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_read = 1,
1262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_write = 2,
1272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_execute = 4
1282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
1292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_op_flags {
1312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_signed = 1, op_string = 2,
1322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_constant = 4, op_pointer = 8,
1332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_sysref = 0x010, op_implied = 0x020,
1342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_hardcode = 0x40, op_es_seg = 0x100,
1352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_cs_seg = 0x200, op_ss_seg = 0x300,
1362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_ds_seg = 0x400, op_fs_seg = 0x500,
1372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        op_gs_seg = 0x600
1382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
1392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
1412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_op_type        type;
1422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_op_datatype    datatype;
1432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_op_access      access;
1442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_op_flags       flags;
1452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        union {
1462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                char            sbyte;
1472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                short           sword;
1482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                long            sdword;
1492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                qword           sqword;
1502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned char   byte;
1512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	       	         unsigned short  word;
1522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned long   dword;
1532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                qword           qword;
1542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                float           sreal;
1552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                double          dreal;
1562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned char   extreal[10];
1572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned char   bcd[10];
1582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                qword           dqword[2];
1592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned char   simd[16];
1602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned char   fpuenv[28];
1612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                void            * address;
1622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned long   offset;
1632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                x86_reg_t       reg;
1642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                char            relative_near;
1652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	       	         long            relative_far;
1662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org       	         	x86_ea_t        expression;
1672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	} data;
1682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		void * insn;
1692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_op_t;
1702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_operand_size( x86_op_t *op );
1722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_format_operand(x86_op_t *op, char *buf, int len,
1742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	          enum x86_asm_format format);
1752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
1762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_reg_t{
1782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_reg_t * aliased_reg( ) {
1792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_reg_t * reg = (x86_reg_t * )
1802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				  calloc( sizeof(x86_reg_t), 1 );
1812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_reg_from_id( self->id, reg );
1822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return reg;
1832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
1842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
1852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_op_t{
1872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t size() {
1882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_size( self );
1892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
1902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	char * format( enum x86_asm_format format ) {
1912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		char *buf, *str;
1922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t len;
1932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		switch ( format ) {
1952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case xml_syntax:
1962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = MAX_OP_XML_STRING;
1972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
1982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case raw_syntax:
1992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = MAX_OP_RAW_STRING;
2002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
2012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case native_syntax:
2022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case intel_syntax:
2032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case att_syntax:
2042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case unknown_syntax:
2052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			default:
2062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = MAX_OP_STRING;
2072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
2082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
2092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		buf = (char * ) calloc( len + 1, 1 );
2112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_format_operand( self, buf, len, format );
2122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		/* drop buffer down to a reasonable size */
2142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		str = strdup( buf );
2152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free(buf);
2162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return str;
2172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int is_address( ) {
2202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( self->type == op_absolute ||
2212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		     self->type == op_offset ) {
2222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		     return 1;
2232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
2242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return 0;
2262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int is_relative( ) {
2292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( self->type == op_relative_near ||
2302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		     self->type == op_relative_far ) {
2312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		     return 1;
2322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
2332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return 0;
2352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject copy;
2382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * copy() {
2392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_op_t *op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 );
2402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( op ) {
2422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			memcpy( op, self, sizeof(x86_op_t) );
2432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
2442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return op;
2462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
2482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
2502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* operand list class */
2512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
2522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct X86_OpListNode {
2532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_op_t *op;
2542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		struct X86_OpListNode *next, *prev;
2552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} X86_OpListNode;
2562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct X86_OpList {
2582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t count;
2592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_OpListNode *head, *tail, *curr;
2602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} X86_OpList;
2612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
2622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend X86_OpList {
2642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_OpList () {
2652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_OpList *list = (X86_OpList *)
2662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof(X86_OpList), 1 );
2672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		list->count = 0;
2682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return list;
2692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	~X86_OpList() {
2722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_OpListNode *node, *next;
2732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		node = self->head;
2752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		while ( node ) {
2762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			next = node->next;
2772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			/* free( node->insn ); */
2782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			free( node );
2792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			node = next;
2802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
2812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free( self );
2832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_OpListNode * first() {
2862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->curr = self->head;
2872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return self->head;
2882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_OpListNode * last() {
2912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->curr = self->tail;
2922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return self->tail;
2932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
2942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_OpListNode * next() {
2962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if (! self->curr ) {
2972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->curr = self->head;
2982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return self->head;
2992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
3002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->curr = self->curr->next;
3022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return self->curr;
3032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
3042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_OpListNode * prev() {
3062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if (! self->curr ) {
3072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->curr = self->tail;
3082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return self->tail;
3092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
3102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->curr = self->curr->prev;
3122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return self->curr;
3132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
3142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject append;
3162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void append( x86_op_t *op ) {
3172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_OpListNode *node = (X86_OpListNode *)
3182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					calloc( sizeof(X86_OpListNode) , 1 );
3192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if (! node ) {
3202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return;
3212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
3222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->count++;
3242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( ! self->tail ) {
3252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->head = self->tail = node;
3262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		} else {
3272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->tail->next = node;
3282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			node->prev = self->tail;
3292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->tail = node;
3302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
3312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		node->op = x86_op_t_copy( op );
3332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
3342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
3352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
3372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct x86_operand_list {
3382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_op_t op;
3392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		struct x86_operand_list *next;
3402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_oplist_t;
3412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
3422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_oplist_t {
3442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject x86_oplist_node_copy;
3452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
3462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
3482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* instruction class */
3492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
3502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_oplist_t * x86_oplist_node_copy( x86_oplist_t * list ) {
3512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_oplist_t *ptr;
3522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 );
3532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( ptr ) {
3542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			memcpy( &ptr->op, &list->op, sizeof(x86_op_t) );
3552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
3562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return ptr;
3582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
3592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_insn_group {
3612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		insn_none = 0, insn_controlflow = 1,
3622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_arithmetic = 2, insn_logic = 3,
3632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_stack = 4, insn_comparison = 5,
3642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_move = 6, insn_string = 7,
3652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_bit_manip = 8, insn_flag_manip = 9,
3662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fpu = 10, insn_interrupt = 13,
3672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_system = 14, insn_other = 15
3682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
3692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
3702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_insn_type {
3712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		insn_invalid = 0, insn_jmp = 0x1001,
3722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_jcc = 0x1002, insn_call = 0x1003,
3732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_callcc = 0x1004, insn_return = 0x1005,
3742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_add = 0x2001, insn_sub = 0x2002,
3752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_mul = 0x2003, insn_div = 0x2004,
3762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_inc = 0x2005, insn_dec = 0x2006,
3772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_shl = 0x2007, insn_shr = 0x2008,
3782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_rol = 0x2009, insn_ror = 0x200A,
3792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_and = 0x3001, insn_or = 0x3002,
3802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_xor = 0x3003, insn_not = 0x3004,
3812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_neg = 0x3005, insn_push = 0x4001,
3822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_pop = 0x4002, insn_pushregs = 0x4003,
3832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_popregs = 0x4004, insn_pushflags = 0x4005,
3842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_popflags = 0x4006, insn_enter = 0x4007,
3852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_leave = 0x4008, insn_test = 0x5001,
3862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_cmp = 0x5002, insn_mov = 0x6001,
3872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_movcc = 0x6002, insn_xchg = 0x6003,
3882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_xchgcc = 0x6004, insn_strcmp = 0x7001,
3892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_strload = 0x7002, insn_strmov = 0x7003,
3902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_strstore = 0x7004, insn_translate = 0x7005,
3912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_bittest = 0x8001, insn_bitset = 0x8002,
3922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_bitclear = 0x8003, insn_clear_carry = 0x9001,
3932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_clear_zero = 0x9002, insn_clear_oflow = 0x9003,
3942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_clear_dir = 0x9004, insn_clear_sign = 0x9005,
3952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_clear_parity = 0x9006, insn_set_carry = 0x9007,
3962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_set_zero = 0x9008, insn_set_oflow = 0x9009,
3972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_set_dir = 0x900A, insn_set_sign = 0x900B,
3982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_set_parity = 0x900C, insn_tog_carry = 0x9010,
3992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_tog_zero = 0x9020, insn_tog_oflow = 0x9030,
4002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_tog_dir = 0x9040, insn_tog_sign = 0x9050,
4012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_tog_parity = 0x9060, insn_fmov = 0xA001,
4022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fmovcc = 0xA002, insn_fneg = 0xA003,
4032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	       	insn_fabs = 0xA004, insn_fadd = 0xA005,
4042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fsub = 0xA006, insn_fmul = 0xA007,
4052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fdiv = 0xA008, insn_fsqrt = 0xA009,
4062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fcmp = 0xA00A, insn_fcos = 0xA00C,
4072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fldpi = 0xA00D, insn_fldz = 0xA00E,
4082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_ftan = 0xA00F, insn_fsine = 0xA010,
4092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_fsys = 0xA020, insn_int = 0xD001,
4102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_intcc = 0xD002,   insn_iret = 0xD003,
4112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_bound = 0xD004, insn_debug = 0xD005,
4122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_trace = 0xD006, insn_invalid_op = 0xD007,
4132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_oflow = 0xD008, insn_halt = 0xE001,
4142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_in = 0xE002, insn_out = 0xE003,
4152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_cpuid = 0xE004, insn_nop = 0xF001,
4162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_bcdconv = 0xF002, insn_szconv = 0xF003
4172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
4182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_insn_note {
4202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		insn_note_ring0		= 1,
4212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		insn_note_smm		= 2,
4222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		insn_note_serial	= 4
4232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
4242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_flag_status {
4262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_carry_set = 0x1,
4272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_zero_set = 0x2,
4282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_oflow_set = 0x4,
4292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_dir_set = 0x8,
4302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_sign_set = 0x10,
4312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_parity_set = 0x20,
4322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_carry_or_zero_set = 0x40,
4332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_zero_set_or_sign_ne_oflow = 0x80,
4342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_carry_clear = 0x100,
4352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_zero_clear = 0x200,
4362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_oflow_clear = 0x400,
4372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_dir_clear = 0x800,
4382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_sign_clear = 0x1000,
4392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_parity_clear = 0x2000,
4402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_sign_eq_oflow = 0x4000,
4412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_sign_ne_oflow = 0x8000
4422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
4432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_insn_cpu {
4452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_8086 	= 1, cpu_80286	= 2,
4462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_80386	= 3, cpu_80387	= 4,
4472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_80486	= 5, cpu_pentium	= 6,
4482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_pentiumpro	= 7, cpu_pentium2	= 8,
4492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_pentium3	= 9, cpu_pentium4	= 10,
4502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_k6		= 16, cpu_k7		= 32,
4512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		cpu_athlon	= 48
4522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
4532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_insn_isa {
4552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		isa_gp		= 1, isa_fp		= 2,
4562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		isa_fpumgt	= 3, isa_mmx		= 4,
4572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		isa_sse1	= 5, isa_sse2	= 6,
4582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		isa_sse3	= 7, isa_3dnow	= 8,
4592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		isa_sys		= 9
4602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
4612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_insn_prefix {
4632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_no_prefix = 0,
4642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_rep_zero = 1,
4652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_rep_notzero = 2,
4662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        insn_lock = 4
4672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
4682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
4712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	unsigned long addr;
4722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        unsigned long offset;
4732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_insn_group group;
4742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_insn_type type;
4752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		enum x86_insn_note note;
4762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        unsigned char bytes[MAX_INSN_SIZE];
4772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        unsigned char size;
4782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned char addr_size;
4792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned char op_size;
4802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		enum x86_insn_cpu cpu;
4812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		enum x86_insn_isa isa;
4822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_flag_status flags_set;
4832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_flag_status flags_tested;
4842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned char stack_mod;
4852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		long stack_mod_val;
4862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        enum x86_insn_prefix prefix;
4872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        char prefix_string[MAX_PREFIX_STR];
4882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        char mnemonic[MAX_MNEM_STR];
4892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        x86_oplist_t *operands;
4902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t operand_count;
4912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t explicit_count;
4922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        void *block;
4932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        void *function;
4942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	        int tag;
4952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_insn_t;
4962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
4972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn,
4982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		      void *arg);
4992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_op_foreach_type {
5012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_any 	= 0,
5022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_dest = 1,
5032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_src 	= 2,
5042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_ro 	= 3,
5052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_wo 	= 4,
5062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_xo 	= 5,
5072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_rw 	= 6,
5082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_implicit = 0x10,
5092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		op_explicit = 0x20
5102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
5112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t x86_operand_count( x86_insn_t *insn,
5132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				enum x86_op_foreach_type type );
5142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * x86_operand_1st( x86_insn_t *insn );
5152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * x86_operand_2nd( x86_insn_t *insn );
5162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * x86_operand_3rd( x86_insn_t *insn );
5172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	long x86_get_rel_offset( x86_insn_t *insn );
5182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * x86_get_branch_target( x86_insn_t *insn );
5192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * x86_get_imm( x86_insn_t *insn );
5202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned char * x86_get_raw_imm( x86_insn_t *insn );
5212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_set_insn_addr( x86_insn_t *insn, unsigned long addr );
5222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len,
5232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org                        enum x86_asm_format format);
5242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_format_insn(x86_insn_t *insn, char *buf, int len,
5252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				enum x86_asm_format);
5262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_oplist_free( x86_insn_t *insn );
5272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_insn_is_valid( x86_insn_t *insn );
5282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
5292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_insn_t {
5312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_insn_t() {
5322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_insn_t *insn = (x86_insn_t *)
5332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				   calloc( sizeof(x86_insn_t), 1 );
5342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return insn;
5352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	~x86_insn_t() {
5372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_oplist_free( self );
5382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free( self );
5392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int is_valid( ) {
5422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_insn_is_valid( self );
5432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * operand_1st() {
5462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_1st( self );
5472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * operand_2nd() {
5502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_2nd( self );
5512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * operand_3rd() {
5542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_3rd( self );
5552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * operand_dest() {
5582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_1st( self );
5592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * operand_src() {
5622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_2nd( self );
5632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t num_operands( enum x86_op_foreach_type type ) {
5662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_operand_count( self, type );
5672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	long rel_offset() {
5702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_get_rel_offset( self );
5712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * branch_target() {
5742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_get_branch_target( self );
5752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_op_t * imm() {
5782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_get_imm( self );
5792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned char * raw_imm() {
5822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_get_raw_imm( self );
5832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
5842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject format;
5862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	char * format( enum x86_asm_format format ) {
5872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		char *buf, *str;
5882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t len;
5892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
5902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		switch ( format ) {
5912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case xml_syntax:
5922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = MAX_INSN_XML_STRING;
5932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
5942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case raw_syntax:
5952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = MAX_INSN_RAW_STRING;
5962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
5972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case native_syntax:
5982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case intel_syntax:
5992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case att_syntax:
6002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case unknown_syntax:
6012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			default:
6022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = MAX_INSN_STRING;
6032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
6042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
6052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		buf = (char * ) calloc( len + 1, 1 );
6072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_format_insn( self, buf, len, format );
6082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		/* drop buffer down to a reasonable size */
6102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		str = strdup( buf );
6112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free(buf);
6122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return str;
6132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
6142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject format_mnemonic;
6162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	char * format_mnemonic( enum x86_asm_format format ) {
6172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		char *buf, *str;
6182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t len = MAX_MNEM_STR + MAX_PREFIX_STR + 4;
6192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		buf = (char * ) calloc( len, 1 );
6212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_format_mnemonic( self, buf, len, format );
6222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		/* drop buffer down to a reasonable size */
6242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		str = strdup( buf );
6252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free(buf);
6262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return str;
6282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
6292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject copy;
6312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_insn_t * copy() {
6322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_oplist_t *ptr, *list, *last = NULL;
6332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_insn_t *insn = (x86_insn_t *)
6342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				   calloc( sizeof(x86_insn_t), 1 );
6352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( insn ) {
6372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			memcpy( insn, self, sizeof(x86_insn_t) );
6382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			insn->operands = NULL;
6392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			insn->block = NULL;
6402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			insn->function = NULL;
6412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			/* copy operand list */
6432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			for ( list = self->operands; list; list = list->next ) {
6442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				ptr = x86_oplist_node_copy( list );
6452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				if (! ptr ) {
6472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					continue;
6482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				}
6492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				if ( insn->operands ) {
6512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					last->next = ptr;
6522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				} else {
6532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					insn->operands = ptr;
6542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				}
6552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				last = ptr;
6562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			}
6572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
6582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return insn;
6602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
6612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_OpList * operand_list( ) {
6632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_oplist_t *list = self->operands;
6642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_OpList *op_list = new_X86_OpList();
6652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		for ( list = self->operands; list; list = list->next ) {
6672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			X86_OpList_append( op_list, &list->op );
6682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
6692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return op_list;
6712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
6722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
6732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
6752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* invariant instruction class */
6762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
6772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	#define X86_WILDCARD_BYTE 0xF4
6782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
6802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	enum x86_op_type        type;
6812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	enum x86_op_datatype    datatype;
6822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	enum x86_op_access      access;
6832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	enum x86_op_flags       flags;
6842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_invariant_op_t;
6852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
6872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned char bytes[64];
6882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		unsigned int  size;
6892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	enum x86_insn_group group;
6902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	enum x86_insn_type type;
6912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_invariant_op_t operands[3];
6922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} x86_invariant_t;
6932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
6942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_invariant_t {
6962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
6972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_invariant_t() {
6982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_invariant_t *inv = (x86_invariant_t *)
6992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof(x86_invariant_t), 1 );
7002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return inv;
7012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	~x86_invariant_t() {
7042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free( self );
7052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
7072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
7092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* instruction list class */
7102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
7112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct X86_InsnListNode {
7122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_insn_t *insn;
7132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		struct X86_InsnListNode *next, *prev;
7142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} X86_InsnListNode;
7152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct X86_InsnList {
7172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t count;
7182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnListNode *head, *tail, *curr;
7192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} X86_InsnList;
7202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
7212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend X86_InsnList {
7232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_InsnList () {
7242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnList *list = (X86_InsnList *)
7252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof(X86_InsnList), 1 );
7262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		list->count = 0;
7272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return list;
7282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	~X86_InsnList() {
7312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnListNode *node, *next;
7322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		node = self->head;
7342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		while ( node ) {
7352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			next = node->next;
7362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			/* free( node->insn ); */
7372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			free( node );
7382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			node = next;
7392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
7402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free( self );
7422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_InsnListNode * first() { return self->head; }
7452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_InsnListNode * last() { return self->tail; }
7472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_InsnListNode * next() {
7492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if (! self->curr ) {
7502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->curr = self->head;
7512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return self->head;
7522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
7532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->curr = self->curr->next;
7552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return self->curr;
7562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_InsnListNode * prev() {
7592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if (! self->curr ) {
7602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->curr = self->tail;
7612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return self->tail;
7622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
7632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->curr = self->curr->prev;
7652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return self->curr;
7662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject append;
7692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void append( x86_insn_t *insn ) {
7702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnListNode *node = (X86_InsnListNode *)
7712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					calloc( sizeof(X86_InsnListNode) , 1 );
7722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if (! node ) {
7732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return;
7742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
7752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->count++;
7772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( ! self->tail ) {
7782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->head = self->tail = node;
7792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		} else {
7802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->tail->next = node;
7812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			node->prev = self->tail;
7822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			self->tail = node;
7832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
7842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		node->insn = x86_insn_t_copy( insn );
7862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
7872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
7882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
7902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* address table class */
7912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* slight TODO */
7922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */
7942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* Main disassembler class */
7952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{
7962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
7972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_options {
7982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		opt_none= 0,
7992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		opt_ignore_nulls=1,
8002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		opt_16_bit=2
8012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		};
8022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_report_codes {
8032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	report_disasm_bounds,
8042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	report_insn_bounds,
8052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	report_invalid_insn,
8062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org        	report_unknown
8072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	};
8082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef struct {
8112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		enum x86_report_codes last_error;
8122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		void * last_error_data;
8132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		void * disasm_callback;
8142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		void * disasm_resolver;
8152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	} X86_Disasm;
8162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef void (*DISASM_REPORTER)( enum x86_report_codes code,
8182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				 	 void *data, void *arg );
8192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg );
8202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	typedef long (*DISASM_RESOLVER)( x86_op_t *op,
8212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					 x86_insn_t * current_insn,
8222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				 	 void *arg );
8232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_report_error( enum x86_report_codes code, void *data );
8252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_init( enum x86_options options, DISASM_REPORTER reporter,
8262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		      void *arg);
8272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_set_reporter( DISASM_REPORTER reporter, void *arg);
8282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_set_options( enum x86_options options );
8292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_options x86_get_options( void );
8302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_cleanup(void);
8312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_format_header( char *buf, int len, enum x86_asm_format format);
8322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_endian(void);
8332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_addr_size(void);
8342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_op_size(void);
8352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_word_size(void);
8362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_max_insn_size(void);
8372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_sp_reg(void);
8382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_fp_reg(void);
8392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int x86_ip_reg(void);
8402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t x86_invariant_disasm( unsigned char *buf, int buf_len,
8412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			  x86_invariant_t *inv );
8422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len );
8432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_disasm( unsigned char *buf, unsigned int buf_len,
8442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                unsigned long buf_rva, unsigned int offset,
8452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                x86_insn_t * insn );
8462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_disasm_range( unsigned char *buf, unsigned long buf_rva,
8472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                      unsigned int offset, unsigned int len,
8482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                      DISASM_CALLBACK func, void *arg );
8492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int x86_disasm_forward( unsigned char *buf, unsigned int buf_len,
8502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                        unsigned long buf_rva, unsigned int offset,
8512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                        DISASM_CALLBACK func, void *arg,
8522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	                        DISASM_RESOLVER resolver, void *r_arg );
8532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_default_reporter( enum x86_report_codes code,
8552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				   void *data, void *arg ) {
8562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_Disasm *dis = (X86_Disasm *) arg;
8572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( dis ) {
8582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			dis->last_error = code;
8592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			dis->last_error_data = data;
8602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
8612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
8622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void x86_default_callback( x86_insn_t *insn, void *arg ) {
8642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnList *list = (X86_InsnList *) arg;
8652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( list ) {
8662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			X86_InsnList_append( list, insn );
8672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
8682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
8692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	/* TODO: resolver stack, maybe a callback */
8712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) {
8722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_Disasm *dis = (X86_Disasm *) arg;
8732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( dis ) {
8742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			//return dis->resolver( op, insn );
8752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			return 0;
8762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
8772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return 0;
8792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
8802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%}
8822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend X86_Disasm {
8842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_Disasm( ) {
8862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_Disasm * dis = (X86_Disasm *)
8872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof( X86_Disasm ), 1 );
8882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_init( opt_none, x86_default_reporter, dis );
8892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return dis;
8902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
8912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_Disasm( enum x86_options options ) {
8932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_Disasm * dis = (X86_Disasm *)
8942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof( X86_Disasm ), 1 );
8952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_init( options, x86_default_reporter, dis );
8962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return dis;
8972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
8982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
8992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_Disasm( enum x86_options options, DISASM_REPORTER reporter ) {
9002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_Disasm * dis = (X86_Disasm *)
9012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof( X86_Disasm ), 1 );
9022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_init( options, reporter, NULL );
9032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return dis;
9042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	X86_Disasm( enum x86_options options, DISASM_REPORTER reporter,
9072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		    void * arg ) {
9082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_Disasm * dis = (X86_Disasm *)
9092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				calloc( sizeof( X86_Disasm ), 1 );
9102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_init( options, reporter, arg );
9112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return dis;
9122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	~X86_Disasm() {
9152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_cleanup();
9162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		free( self );
9172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void set_options( enum x86_options options ) {
9202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_set_options( options );
9212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	enum x86_options options() {
9242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_get_options();
9252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void set_callback( void * callback ) {
9282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->disasm_callback = callback;
9292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void set_resolver( void * callback ) {
9322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		self->disasm_resolver = callback;
9332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	void report_error( enum x86_report_codes code ) {
9362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_report_error( code, NULL );
9372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject disasm;
9402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_insn_t * disasm( unsigned char *buf, size_t buf_len,
9412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		           unsigned long buf_rva, unsigned int offset ) {
9422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 );
9432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_disasm( buf, buf_len, buf_rva, offset, insn );
9442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return insn;
9452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int disasm_range( unsigned char *buf, size_t buf_len,
9482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	              unsigned long buf_rva, unsigned int offset,
9492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		      unsigned int len ) {
9502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnList *list = new_X86_InsnList();
9522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		if ( len > buf_len ) {
9542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			len = buf_len;
9552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
9562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_disasm_range( buf, buf_rva, offset, len,
9582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				x86_default_callback, list );
9592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int disasm_forward( unsigned char *buf, size_t buf_len,
9622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			    unsigned long buf_rva, unsigned int offset ) {
9632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		X86_InsnList *list = new_X86_InsnList();
9642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		/* use default resolver: damn SWIG callbacks! */
9662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_disasm_forward( buf, buf_len, buf_rva, offset,
9672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			                   x86_default_callback, list,
9682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org					   x86_default_resolver, NULL );
9692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t disasm_invariant( unsigned char *buf, size_t buf_len,
9722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			  x86_invariant_t *inv ) {
9732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_invariant_disasm( buf, buf_len, inv );
9742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	size_t disasm_size( unsigned char *buf, size_t buf_len ) {
9772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_size_disasm( buf, buf_len );
9782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
9792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject format_header;
9812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	char * format_header( enum x86_asm_format format) {
9822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		char *buf, *str;
9832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		size_t len;
9842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
9852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		switch ( format ) {
9862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			/* these were obtained from x86_format.c */
9872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case xml_syntax:
9882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = 679; break;
9892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case raw_syntax:
9902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = 172; break;
9912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case native_syntax:
9922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = 35; break;
9932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case intel_syntax:
9942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = 23; break;
9952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case att_syntax:
9962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = 23; break;
9972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case unknown_syntax:
9982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			default:
9992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				len = 23; break;
10002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
10012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		buf = (char * ) calloc( len + 1, 1 );
10032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_format_header( buf, len, format );
10042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return buf;
10062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int endian() {
10092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_endian();
10102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int addr_size() {
10132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_addr_size();
10142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int op_size() {
10172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_op_size();
10182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int word_size() {
10212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_word_size();
10222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int max_insn_size() {
10252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_max_insn_size();
10262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int sp_reg() {
10292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_sp_reg();
10302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int fp_reg() {
10332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_fp_reg();
10342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned int ip_reg() {
10372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return x86_ip_reg();
10382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	%newobject reg_from_id;
10412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	x86_reg_t * reg_from_id( unsigned int id ) {
10422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_reg_t * reg = calloc( sizeof(x86_reg_t), 1 );
10432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		x86_reg_from_id( id, reg );
10442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		return reg;
10452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	unsigned char wildcard_byte() { return X86_WILDCARD_BYTE; }
10482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int max_register_string() { return MAX_REGNAME; }
10502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int max_prefix_string() { return MAX_PREFIX_STR; }
10522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int max_mnemonic_string() { return MAX_MNEM_STR; }
10542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int max_operand_string( enum x86_asm_format format ) {
10562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		switch ( format ) {
10572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case xml_syntax:
10582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				return  MAX_OP_XML_STRING;
10592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
10602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case raw_syntax:
10612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				return MAX_OP_RAW_STRING;
10622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
10632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case native_syntax:
10642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case intel_syntax:
10652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case att_syntax:
10662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case unknown_syntax:
10672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			default:
10682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				return MAX_OP_STRING;
10692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
10702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
10712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int max_insn_string( enum x86_asm_format format ) {
10752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		switch ( format ) {
10762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case xml_syntax:
10772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				return  MAX_INSN_XML_STRING;
10782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
10792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case raw_syntax:
10802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				return MAX_INSN_RAW_STRING;
10812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
10822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case native_syntax:
10832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case intel_syntax:
10842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case att_syntax:
10852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			case unknown_syntax:
10862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org			default:
10872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				return MAX_INSN_STRING;
10882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org				break;
10892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		}
10902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
10912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	int max_num_operands( ) { return MAX_NUM_OPERANDS; }
10932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
10942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
10952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* python callback, per the manual */
10962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/*%typemap(python,in) PyObject *pyfunc {
10972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	if (!PyCallable_Check($source)) {
10982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org		PyErr_SetString(PyExc_TypeError, "Need a callable object!");
10992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 		return NULL;
11002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	}
11012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org	$target = $source;
11022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}*/
11032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
11042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* python FILE * callback, per the manual */
11052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/*
11062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%typemap(python,in) FILE * {
11072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  if (!PyFile_Check($source)) {
11082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org      PyErr_SetString(PyExc_TypeError, "Need a file!");
11092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org      return NULL;
11102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  }
11112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  $target = PyFile_AsFile($source);
11122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}*/
11132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
11142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1115