initial recleaning of this mess, preparing for merge of JIT proper
authorDavid Anderson <dvander@alliedmods.net>
Wed Sep 20 01:59:56 2006 +0000 (2006-09-20)
changeset 69e23e2b0a2d7e
parent 68 7661eb8de243
child 70 88418cb55304
initial recleaning of this mess, preparing for merge of JIT proper
sourcepawn/include/sp_vm_api.h
sourcepawn/include/sp_vm_base.h
sourcepawn/include/sp_vm_types.h
sourcepawn/vm/jit/jit_helpers.cpp
sourcepawn/vm/jit/jit_helpers.h
sourcepawn/vm/jit/x86/jit_x86.cpp
sourcepawn/vm/jit/x86/jit_x86.h
sourcepawn/vm/jit/x86/msvc8/jit-x86.vcproj
sourcepawn/vm/jit/x86/x86_macros.h
     1.1 --- a/sourcepawn/include/sp_vm_api.h	Wed Sep 20 00:41:24 2006 +0000
     1.2 +++ b/sourcepawn/include/sp_vm_api.h	Wed Sep 20 01:59:56 2006 +0000
     1.3 @@ -74,7 +74,11 @@
     1.4  		virtual void BaseFree(void *memory) =0;
     1.5  	};
     1.6  
     1.7 -	class ICompilation;
     1.8 +	class ICompilation
     1.9 +	{
    1.10 +	public:
    1.11 +		virtual ~ICompilation() { };
    1.12 +	};
    1.13  
    1.14  	class IVirtualMachine
    1.15  	{
    1.16 @@ -107,9 +111,17 @@
    1.17  		 * Note: This will free the ICompilation pointer.
    1.18  		 *
    1.19  		 * @param co		Compilation pointer.
    1.20 +		 * @param err		Filled with error code on exit.
    1.21  		 * @return			New plugin context.
    1.22  		 */
    1.23 -		virtual IPluginContext *CompileToContext(ICompilation *co) =0;
    1.24 +		virtual IPluginContext *CompileToContext(ICompilation *co, int *err) =0;
    1.25 +
    1.26 +		/**
    1.27 +		 * Aborts a compilation and frees the ICompilation pointer.
    1.28 +		 *
    1.29 +		 * @param co		Compilation pointer.
    1.30 +		 */
    1.31 +		virtual void AbortCompilation(ICompilation *co) =0;
    1.32  
    1.33  		/**
    1.34  		 * Frees any internal variable usage on a context.
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/sourcepawn/include/sp_vm_base.h	Wed Sep 20 01:59:56 2006 +0000
     2.3 @@ -0,0 +1,14 @@
     2.4 +#ifndef _INCLUDE_SOURCEPAWN_VM_BASE_H_
     2.5 +#define _INCLUDE_SOURCEPAWN_VM_BASE_H_
     2.6 +
     2.7 +#include <sp_vm_api.h>
     2.8 +
     2.9 +#if defined WIN32
    2.10 +#define EXPORT_LINK		extern "C" __declspec(dllexport)
    2.11 +#else if defined __GNUC__
    2.12 +#define EXPORT_LINK		extern "C" __attribute__((visibility("default")))
    2.13 +#endif
    2.14 +
    2.15 +typedef SourcePawn::IVirtualMachine *(*SP_GETVM_FUNC)(SourcePawn::ISourcePawnEngine *);
    2.16 +
    2.17 +#endif //_INCLUDE_SOURCEPAWN_VM_BASE_H_
     3.1 --- a/sourcepawn/include/sp_vm_types.h	Wed Sep 20 00:41:24 2006 +0000
     3.2 +++ b/sourcepawn/include/sp_vm_types.h	Wed Sep 20 01:59:56 2006 +0000
     3.3 @@ -20,6 +20,7 @@
     3.4  #define SP_ERR_NATIVE_PENDING		8	/* A script tried to exec an unbound native */
     3.5  #define SP_ERR_STACKERR				9	/* Stack/Heap collision */
     3.6  #define SP_ERR_NOTDEBUGGING			10	/* Debug mode was not on or debug section not found */
     3.7 +#define SP_ERR_INVALID_INSTRUCTION	11	/* Invalid instruction was encountered */
     3.8  
     3.9  /**********************************************
    3.10   *** The following structures are reference structures.
     4.1 --- a/sourcepawn/vm/jit/jit_helpers.cpp	Wed Sep 20 00:41:24 2006 +0000
     4.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.3 @@ -1,100 +0,0 @@
     4.4 -#include <string.h>
     4.5 -#include <assert.h>
     4.6 -#include "jit_helpers.h"
     4.7 -
     4.8 -cell_t jit_read_cell(jitinfo_t *jit)
     4.9 -{
    4.10 -	cell_t val = *(jit->inptr);
    4.11 -	jit->inptr++;
    4.12 -	return val;
    4.13 -}
    4.14 -
    4.15 -cell_t jit_read_cell_null(jitinfo_t *jit)
    4.16 -{
    4.17 -	return 0;
    4.18 -}
    4.19 -
    4.20 -cell_t *jit_read_cellptr(jitinfo_t *jit)
    4.21 -{
    4.22 -	cell_t *val = *(cell_t **)(jit->inptr);
    4.23 -	jit->inptr++;
    4.24 -	return val;
    4.25 -}
    4.26 -
    4.27 -cell_t *jit_read_cellptr_null(jitinfo_t *jit)
    4.28 -{
    4.29 -	return NULL;
    4.30 -}
    4.31 -
    4.32 -void jit_write_ubyte(jitinfo_t *jit, jit_uint8_t c)
    4.33 -{
    4.34 -	*(jit->outptr++) = c;
    4.35 -}
    4.36 -
    4.37 -void jit_write_ubyte_null(jitinfo_t *jit, jit_uint8_t c)
    4.38 -{
    4.39 -	jit->outptr++;
    4.40 -}
    4.41 -
    4.42 -void jit_write_byte(jitinfo_t *jit, jit_int8_t c)
    4.43 -{
    4.44 -	*(jit->outptr++) = c;
    4.45 -}
    4.46 -
    4.47 -void jit_write_byte_null(jitinfo_t *jit, jit_int8_t c)
    4.48 -{
    4.49 -	jit->outptr++;
    4.50 -}
    4.51 -
    4.52 -void jit_write_int32(jitinfo_t *jit, jit_int32_t c)
    4.53 -{
    4.54 -	jit_int32_t *ptr = (jit_int32_t *)jit->outptr;
    4.55 -	*ptr = c;
    4.56 -	jit->outptr += sizeof(jit_int32_t);
    4.57 -}
    4.58 -
    4.59 -void jit_write_int32_null(jitinfo_t *jit, jit_int32_t c)
    4.60 -{
    4.61 -	jit->outptr += sizeof(jit_int32_t);
    4.62 -}
    4.63 -
    4.64 -void jit_write_int64(jitinfo_t *jit, jit_int64_t c)
    4.65 -{
    4.66 -	jit_int64_t *ptr = (jit_int64_t *)jit->outptr;
    4.67 -	*ptr = c;
    4.68 -	jit->outptr += sizeof(jit_int64_t);
    4.69 -}
    4.70 -
    4.71 -void jit_write_int64_null(jitinfo_t *jit, jit_int64_t c)
    4.72 -{
    4.73 -	jit->outptr += sizeof(jit_int64_t);
    4.74 -}
    4.75 -
    4.76 -jitoffs_t jit_curpos(jitinfo_t *jit)
    4.77 -{
    4.78 -	return (jit->outptr - jit->outbase);
    4.79 -}
    4.80 -
    4.81 -jitwritefuncs_t g_write_funcs = 
    4.82 -{
    4.83 -	jit_read_cell,
    4.84 -	jit_read_cellptr,
    4.85 -	jit_write_ubyte,
    4.86 -	jit_write_byte,
    4.87 -	jit_write_int32,
    4.88 -	jit_write_int64,
    4.89 -	jit_curpos
    4.90 -};
    4.91 -
    4.92 -jitwritefuncs_t g_write_null_funcs = 
    4.93 -{
    4.94 -	jit_read_cell_null,
    4.95 -	jit_read_cellptr_null,
    4.96 -	jit_write_ubyte_null,
    4.97 -	jit_write_byte_null,
    4.98 -	jit_write_int32_null,
    4.99 -	jit_write_int64_null,
   4.100 -	jit_curpos
   4.101 -};
   4.102 -
   4.103 -
     5.1 --- a/sourcepawn/vm/jit/jit_helpers.h	Wed Sep 20 00:41:24 2006 +0000
     5.2 +++ b/sourcepawn/vm/jit/jit_helpers.h	Wed Sep 20 01:59:56 2006 +0000
     5.3 @@ -1,5 +1,5 @@
     5.4 -#ifndef _INCLUDE_AMX_JIT_H
     5.5 -#define _INCLUDE_AMX_JIT_H
     5.6 +#ifndef _INCLUDE_SOURCEPAWN_JIT_HELPERS_H_
     5.7 +#define _INCLUDE_SOURCEPAWN_JIT_HELPERS_H_
     5.8  
     5.9  #include <sp_vm_types.h>
    5.10  
    5.11 @@ -23,27 +23,53 @@
    5.12  typedef char * jitcode_t;
    5.13  typedef unsigned int jitoffs_t;
    5.14  
    5.15 -//functions for writing to a JIT
    5.16 -typedef struct tagJITWRITEFUNCS
    5.17 +class JitWriter
    5.18  {
    5.19 -	//Reading from the input stream
    5.20 -	cell_t (*read_cell)(struct tagJITINFO *);
    5.21 -	cell_t *(*read_cellptr)(struct tagJITINFO *);
    5.22 -	//Writing to the output stream
    5.23 -	void (*write_ubyte)(struct tagJITINFO *, jit_uint8_t);
    5.24 -	void (*write_byte)(struct tagJITINFO *, jit_int8_t);
    5.25 -	void (*write_int32)(struct tagJITINFO *, jit_int32_t);
    5.26 -	void (*write_int64)(struct tagJITINFO *, jit_int64_t);
    5.27 -	//helpers
    5.28 -	jitoffs_t (*jit_curpos)(struct tagJITINFO *);
    5.29 -} jitwritefuncs_t;
    5.30 -
    5.31 -typedef struct tagJITINFO
    5.32 -{
    5.33 -	jitwritefuncs_t wrfuncs;
    5.34 +public:
    5.35 +	inline cell_t read_cell()
    5.36 +	{
    5.37 +		cell_t val = *(inptr);
    5.38 +		inptr++;
    5.39 +		return val;
    5.40 +	}
    5.41 +	inline cell_t read_cellptr()
    5.42 +	{
    5.43 +		cell_t *val = *(cell_t **)(inptr);
    5.44 +		inptr++;
    5.45 +		return val;
    5.46 +	}
    5.47 +	inline void write_ubyte(jit_uint8_t c)
    5.48 +	{
    5.49 +		if (outptr)
    5.50 +		{
    5.51 +			*outptr = c;
    5.52 +		}
    5.53 +		outptr++;
    5.54 +	}
    5.55 +	inline void write_byte(jit_int8_t c)
    5.56 +	{
    5.57 +		if (outptr)
    5.58 +		{
    5.59 +			*outptr = c;
    5.60 +		}
    5.61 +		outptr++;
    5.62 +	}
    5.63 +	inline void write_int32(jit_int32_t c)
    5.64 +	{
    5.65 +		if (outptr)
    5.66 +		{
    5.67 +			*(jit_int32_t *)ptr = c;
    5.68 +		}
    5.69 +		outptr += sizeof(jit_int32_t);
    5.70 +	}
    5.71 +	inline jitoffs_t jit_curpos()
    5.72 +	{
    5.73 +		return (outptr - outbase);
    5.74 +	}
    5.75 +public:
    5.76  	cell_t *inptr;		/* input pointer */
    5.77  	jitcode_t outbase;	/* output pointer */
    5.78  	jitcode_t outptr;	/* output base */
    5.79 -} jitinfo_t;
    5.80 +};
    5.81  
    5.82 -#endif //_INCLUDE_AMX_JIT_H
    5.83 +#endif //_INCLUDE_SOURCEPAWN_JIT_HELPERS_H_
     6.1 --- a/sourcepawn/vm/jit/x86/jit_x86.cpp	Wed Sep 20 00:41:24 2006 +0000
     6.2 +++ b/sourcepawn/vm/jit/x86/jit_x86.cpp	Wed Sep 20 01:59:56 2006 +0000
     6.3 @@ -2,6 +2,255 @@
     6.4  #include <stdlib.h>
     6.5  #include "jit_x86.h"
     6.6  
     6.7 +int OpAdvTable[OP_NUM_OPCODES];
     6.8 +
     6.9 +JITX86::JITX86()
    6.10 +{
    6.11 +	memset(OpAdvTable, -1, sizeof(OpAdvTable));
    6.12 +
    6.13 +	/* instructions with 5 parameters */
    6.14 +	OpAdvTable[OP_PUSH5_C] = sizeof(cell_t)*5;
    6.15 +	OpAdvTable[OP_PUSH5] = sizeof(cell_t)*5;
    6.16 +	OpAdvTable[OP_PUSH5_S] = sizeof(cell_t)*5;
    6.17 +	OpAdvTable[OP_PUSH5_ADR] = sizeof(cell_t)*5;
    6.18 +
    6.19 +	/* instructions with 4 parameters */
    6.20 +	OpAdvTable[OP_PUSH4_C] = sizeof(cell_t)*4;
    6.21 +	OpAdvTable[OP_PUSH4] = sizeof(cell_t)*4;
    6.22 +	OpAdvTable[OP_PUSH4_S] = sizeof(cell_t)*4;
    6.23 +	OpAdvTable[OP_PUSH4_ADR] = sizeof(cell_t)*4;
    6.24 +
    6.25 +	/* instructions with 3 parameters */
    6.26 +	OpAdvTable[OP_PUSH3_C] = sizeof(cell_t)*3;
    6.27 +	OpAdvTable[OP_PUSH3] = sizeof(cell_t)*3;
    6.28 +	OpAdvTable[OP_PUSH3_S] = sizeof(cell_t)*3;
    6.29 +	OpAdvTable[OP_PUSH3_ADR] = sizeof(cell_t)*3;
    6.30 +
    6.31 +	/* instructions with 2 parameters */
    6.32 +	OpAdvTable[OP_PUSH2_C] = sizeof(cell_t)*2;
    6.33 +	OpAdvTable[OP_PUSH2] = sizeof(cell_t)*2;
    6.34 +	OpAdvTable[OP_PUSH2_S] = sizeof(cell_t)*2;
    6.35 +	OpAdvTable[OP_PUSH2_ADR] = sizeof(cell_t)*2;
    6.36 +	OpAdvTable[OP_LOAD_BOTH] = sizeof(cell_t)*2;
    6.37 +	OpAdvTable[OP_LOAD_S_BOTH] = sizeof(cell_t)*2;
    6.38 +	OpAdvTable[OP_CONST] = sizeof(cell_t)*2;
    6.39 +	OpAdvTable[OP_CONST_S] = sizeof(cell_t)*2;
    6.40 +
    6.41 +	/* instructions with 1 parameter */
    6.42 +	OpAdvTable[OP_LOAD_PRI] = sizeof(cell_t);
    6.43 +	OpAdvTable[OP_LOAD_ALT] = sizeof(cell_t);
    6.44 +	OpAdvTable[OP_LOAD_S_PRI] = sizeof(cell_t);
    6.45 +	OpAdvTable[OP_LOAD_S_ALT] = sizeof(cell_t);
    6.46 +	OpAdvTable[OP_LREF_PRI] = sizeof(cell_t);
    6.47 +	OpAdvTable[OP_LREF_ALT] = sizeof(cell_t);
    6.48 +	OpAdvTable[OP_LREF_S_PRI] = sizeof(cell_t);
    6.49 +	OpAdvTable[OP_LREF_S_ALT] = sizeof(cell_t);
    6.50 +	OpAdvTable[OP_LODB_I] = sizeof(cell_t);
    6.51 +	OpAdvTable[OP_CONST_PRI] = sizeof(cell_t);
    6.52 +	OpAdvTable[OP_CONST_ALT] = sizeof(cell_t);
    6.53 +	OpAdvTable[OP_ADDR_PRI] = sizeof(cell_t);
    6.54 +	OpAdvTable[OP_ADDR_ALT] = sizeof(cell_t);
    6.55 +	OpAdvTable[OP_STOR_PRI] = sizeof(cell_t);
    6.56 +	OpAdvTable[OP_STOR_ALT] = sizeof(cell_t);
    6.57 +	OpAdvTable[OP_STOR_S_PRI] = sizeof(cell_t);
    6.58 +	OpAdvTable[OP_STOR_S_ALT] = sizeof(cell_t);
    6.59 +	OpAdvTable[OP_SREF_PRI] = sizeof(cell_t);
    6.60 +	OpAdvTable[OP_SREF_ALT] = sizeof(cell_t);
    6.61 +	OpAdvTable[OP_SREF_S_PRI] = sizeof(cell_t);
    6.62 +	OpAdvTable[OP_SREF_S_ALT] = sizeof(cell_t);
    6.63 +	OpAdvTable[OP_STRB_I] = sizeof(cell_t);
    6.64 +	OpAdvTable[OP_LIDX_B] = sizeof(cell_t);
    6.65 +	OpAdvTable[OP_IDXADDR_B] = sizeof(cell_t);
    6.66 +	OpAdvTable[OP_ALIGN_PRI] = sizeof(cell_t);
    6.67 +	OpAdvTable[OP_ALIGN_ALT] = sizeof(cell_t);
    6.68 +	OpAdvTable[OP_LCTRL] = sizeof(cell_t);
    6.69 +	OpAdvTable[OP_SCTRL] = sizeof(cell_t);
    6.70 +	OpAdvTable[OP_PUSH_R] = sizeof(cell_t);
    6.71 +	OpAdvTable[OP_PUSH_C] = sizeof(cell_t);
    6.72 +	OpAdvTable[OP_PUSH] = sizeof(cell_t);
    6.73 +	OpAdvTable[OP_PUSH_S] = sizeof(cell_t);
    6.74 +	OpAdvTable[OP_STACK] = sizeof(cell_t);
    6.75 +	OpAdvTable[OP_HEAP] = sizeof(cell_t);
    6.76 +	OpAdvTable[OP_JREL] = sizeof(cell_t);
    6.77 +	OpAdvTable[OP_SHL_C_PRI] = sizeof(cell_t);
    6.78 +	OpAdvTable[OP_SHL_C_ALT] = sizeof(cell_t);
    6.79 +	OpAdvTable[OP_SHR_C_PRI] = sizeof(cell_t);
    6.80 +	OpAdvTable[OP_SHR_C_ALT] = sizeof(cell_t);
    6.81 +	OpAdvTable[OP_ADD_C] = sizeof(cell_t);
    6.82 +	OpAdvTable[OP_SMUL_C] = sizeof(cell_t);
    6.83 +	OpAdvTable[OP_ZERO] = sizeof(cell_t);
    6.84 +	OpAdvTable[OP_ZERO_S] = sizeof(cell_t);
    6.85 +	OpAdvTable[OP_EQ_C_PRI] = sizeof(cell_t);
    6.86 +	OpAdvTable[OP_EQ_C_ALT] = sizeof(cell_t);
    6.87 +	OpAdvTable[OP_INC] = sizeof(cell_t);
    6.88 +	OpAdvTable[OP_INC_S] = sizeof(cell_t);
    6.89 +	OpAdvTable[OP_DEC] = sizeof(cell_t);
    6.90 +	OpAdvTable[OP_DEC_S] = sizeof(cell_t);
    6.91 +	OpAdvTable[OP_MOVS] = sizeof(cell_t);
    6.92 +	OpAdvTable[OP_CMPS] = sizeof(cell_t);
    6.93 +	OpAdvTable[OP_FILL] = sizeof(cell_t);
    6.94 +	OpAdvTable[OP_HALT] = sizeof(cell_t);
    6.95 +	OpAdvTable[OP_BOUNDS] = sizeof(cell_t);
    6.96 +	OpAdvTable[OP_PUSH_ADR] = sizeof(cell_t);
    6.97 +
    6.98 +	/* instructions with 0 parameters */
    6.99 +	OpAdvTable[OP_LOAD_I] = 0;
   6.100 +	OpAdvTable[OP_STOR_I] = 0;
   6.101 +	OpAdvTable[OP_LIDX] = 0;
   6.102 +	OpAdvTable[OP_IDXADDR] = 0;
   6.103 +	OpAdvTable[OP_MOVE_PRI] = 0;
   6.104 +	OpAdvTable[OP_MOVE_ALT] = 0;
   6.105 +	OpAdvTable[OP_XCHG] = 0;
   6.106 +	OpAdvTable[OP_PUSH_PRI] = 0;
   6.107 +	OpAdvTable[OP_PUSH_ALT] = 0;
   6.108 +	OpAdvTable[OP_POP_PRI] = 0;
   6.109 +	OpAdvTable[OP_POP_ALT] = 0;
   6.110 +	OpAdvTable[OP_PROC] = 0;
   6.111 +	OpAdvTable[OP_RET] = 0;
   6.112 +	OpAdvTable[OP_RETN] = 0;
   6.113 +	OpAdvTable[OP_CALL_PRI] = 0;
   6.114 +	OpAdvTable[OP_SHL] = 0;
   6.115 +	OpAdvTable[OP_SHR] = 0;
   6.116 +	OpAdvTable[OP_SSHR] = 0;
   6.117 +	OpAdvTable[OP_SMUL] = 0;
   6.118 +	OpAdvTable[OP_SDIV] = 0;
   6.119 +	OpAdvTable[OP_SDIV_ALT] = 0;
   6.120 +	OpAdvTable[OP_UMUL] = 0;
   6.121 +	OpAdvTable[OP_UDIV] = 0;
   6.122 +	OpAdvTable[OP_UDIV_ALT] = 0;
   6.123 +	OpAdvTable[OP_ADD] = 0;
   6.124 +	OpAdvTable[OP_SUB] = 0;
   6.125 +	OpAdvTable[OP_SUB_ALT] = 0;
   6.126 +	OpAdvTable[OP_AND] = 0;
   6.127 +	OpAdvTable[OP_OR] = 0;
   6.128 +	OpAdvTable[OP_XOR] = 0;
   6.129 +	OpAdvTable[OP_NOT] = 0;
   6.130 +	OpAdvTable[OP_NEG] = 0;
   6.131 +	OpAdvTable[OP_INVERT] = 0;
   6.132 +	OpAdvTable[OP_ZERO_PRI] = 0;
   6.133 +	OpAdvTable[OP_ZERO_ALT] = 0;
   6.134 +	OpAdvTable[OP_SIGN_PRI] = 0;
   6.135 +	OpAdvTable[OP_SIGN_ALT] = 0;
   6.136 +	OpAdvTable[OP_EQ] = 0;
   6.137 +	OpAdvTable[OP_NEQ] = 0;
   6.138 +	OpAdvTable[OP_LESS] = 0;
   6.139 +	OpAdvTable[OP_LEQ] = 0;
   6.140 +	OpAdvTable[OP_GRTR] = 0;
   6.141 +	OpAdvTable[OP_GEQ] = 0;
   6.142 +	OpAdvTable[OP_SLESS] = 0;
   6.143 +	OpAdvTable[OP_SLEQ] = 0;
   6.144 +	OpAdvTable[OP_SGRTR] = 0;
   6.145 +	OpAdvTable[OP_SGEQ] = 0;
   6.146 +	OpAdvTable[OP_INC_PRI] = 0;
   6.147 +	OpAdvTable[OP_INC_ALT] = 0;
   6.148 +	OpAdvTable[OP_INC_I] = 0;
   6.149 +	OpAdvTable[OP_DEC_PRI] = 0;
   6.150 +	OpAdvTable[OP_DEC_ALT] = 0;
   6.151 +	OpAdvTable[OP_DEC_I] = 0;
   6.152 +	OpAdvTable[OP_JUMP_PRI] = 0;
   6.153 +	OpAdvTable[OP_SWAP_PRI] = 0;
   6.154 +	OpAdvTable[OP_SWAP_ALT] = 0;
   6.155 +	OpAdvTable[OP_NOP] = 0;
   6.156 +	OpAdvTable[OP_BREAK] = 0;
   6.157 +
   6.158 +	/* opcodes that need relocation */
   6.159 +	OpAdvTable[OP_CALL] = -2;
   6.160 +	OpAdvTable[OP_JUMP] = -2;
   6.161 +	OpAdvTable[OP_JZER] = -2;
   6.162 +	OpAdvTable[OP_JNZ] = -2;
   6.163 +	OpAdvTable[OP_JEQ] = -2;
   6.164 +	OpAdvTable[OP_JNEQ] = -2;
   6.165 +	OpAdvTable[OP_JLESS] = -2;
   6.166 +	OpAdvTable[OP_JLEQ] = -2;
   6.167 +	OpAdvTable[OP_JGRTR] = -2;
   6.168 +	OpAdvTable[OP_JGEQ] = -2;
   6.169 +	OpAdvTable[OP_JSLESS] = -2;
   6.170 +	OpAdvTable[OP_JSLEQ] = -2;
   6.171 +	OpAdvTable[OP_JSGRTR] = -2;
   6.172 +	OpAdvTable[OP_JSGEQ] = -2;
   6.173 +	OpAdvTable[OP_SWITCH] = -2;
   6.174 +
   6.175 +	/* opcodes that are totally invalid */
   6.176 +	OpAdvTable[OP_FILE] = -3;
   6.177 +	OpAdvTable[OP_SYMBOL] = -3;
   6.178 +	OpAdvTable[OP_LINE] = -3;
   6.179 +	OpAdvTable[OP_SRANGE] = -3;
   6.180 +	OpAdvTable[OP_SYMTAG] = -3;
   6.181 +	OpAdvTable[OP_SYSREQ_D] = -3;
   6.182 +	OpAdvTable[OP_SYSREQ_ND] = -3;
   6.183 +}
   6.184 +
   6.185 +IPluginContext *JITX86::CompileToContext(ICompilation *co, int *err)
   6.186 +{
   6.187 +	CompData *data = (CompData *)co;
   6.188 +	sp_plugin_t *plugin = data->plugin;
   6.189 +
   6.190 +	/* The first phase is to browse */
   6.191 +	uint8_t *code = plugin->pcode;
   6.192 +	uint8_t *cip;
   6.193 +	uint8_t *end_cip = plugin->pcode + plugin->pcode_size;
   6.194 +	OPCODE op;
   6.195 +	int op_c;
   6.196 +	uint32_t reloc_count = 0;
   6.197 +
   6.198 +	/* FIRST PASS (light load) - Get initial opcode information */
   6.199 +	for (cip = code; cip < end_cip;)
   6.200 +	{
   6.201 +		op = (OPCODE)*(ucell_t *)cip;
   6.202 +		if ((unsigned)op >= OP_NUM_OPCODES)
   6.203 +		{
   6.204 +			AbortCompilation(co);
   6.205 +			*err = SP_ERR_INVALID_INSTRUCTION;
   6.206 +			return NULL;
   6.207 +		}
   6.208 +		cip += sizeof(cell_t);
   6.209 +		op_c = OpAdvTable[op];
   6.210 +		if (op_c >= 0)
   6.211 +		{
   6.212 +			cip += op_c;
   6.213 +		} else if (op_c == -3) {
   6.214 +			AbortCompilation(co);
   6.215 +			*err = SP_ERR_INVALID_INSTRUCTION;
   6.216 +			return NULL;
   6.217 +		} else if (op_c == -2) {
   6.218 +			reloc_count++;
   6.219 +			cip += sizeof(cell_t);
   6.220 +		} else if (op_c == -1) {
   6.221 +			switch (op)
   6.222 +			{
   6.223 +			case OP_SYSREQ_C:
   6.224 +			case OP_SYSREQ_PRI:
   6.225 +			case OP_SYSREQ_N:
   6.226 +				{
   6.227 +					if (!data->always_inline)
   6.228 +					{
   6.229 +						reloc_count++;
   6.230 +					}
   6.231 +					break;
   6.232 +				}
   6.233 +			case OP_CASETBL:
   6.234 +				{
   6.235 +					ucell_t num = *(ucell_t *)cip;
   6.236 +					cip += sizeof(cell_t);
   6.237 +					reloc_count += (num + 1);
   6.238 +					cip += ((2*num) + 1) * sizeof(cell_t);
   6.239 +					break;
   6.240 +				}
   6.241 +			default:
   6.242 +				{
   6.243 +					AbortCompilation(co);
   6.244 +					*err = SP_ERR_INVALID_INSTRUCTION;
   6.245 +					return NULL;
   6.246 +				}
   6.247 +			}
   6.248 +		}
   6.249 +	}
   6.250 +
   6.251 +	*err = SP_ERR_NONE;
   6.252 +
   6.253 +	return NULL;
   6.254 +}
   6.255 +
   6.256  const char *JITX86::GetVMName()
   6.257  {
   6.258  	return "JIT (x86)";
     7.1 --- a/sourcepawn/vm/jit/x86/jit_x86.h	Wed Sep 20 00:41:24 2006 +0000
     7.2 +++ b/sourcepawn/vm/jit/x86/jit_x86.h	Wed Sep 20 01:59:56 2006 +0000
     7.3 @@ -8,24 +8,198 @@
     7.4  class CompData : public ICompilation
     7.5  {
     7.6  public:
     7.7 -	CompData() : plugin(NULL), debug(false)
     7.8 +	CompData() : plugin(NULL), debug(false), always_inline(true)
     7.9  	{
    7.10  	};
    7.11  public:
    7.12  	sp_plugin_t *plugin;
    7.13 +	bool always_inline;
    7.14  	bool debug;
    7.15  };
    7.16  
    7.17  class JITX86 : public IVirtualMachine
    7.18  {
    7.19  public:
    7.20 +	JITX86();
    7.21 +public:
    7.22  	const char *GetVMName() =0;
    7.23  	ICompilation *StartCompilation(sp_plugin_t *plugin);
    7.24  	bool SetCompilationOption(ICompilation *co, const char *key, const char *val) ;
    7.25 -	IPluginContext *CompileToContext(ICompilation *co);
    7.26 +	IPluginContext *CompileToContext(ICompilation *co, int *err);
    7.27  	void AbortCompilation(ICompilation *co);
    7.28  	void FreeContextVars(sp_context_t *ctx);
    7.29  	int ContextExecute(sp_context_t *ctx, uint32_t code_idx, cell_t *result);
    7.30  };
    7.31  
    7.32 +typedef enum
    7.33 +{
    7.34 +	OP_NONE,              /* invalid opcode */
    7.35 +	OP_LOAD_PRI,		//DONE
    7.36 +	OP_LOAD_ALT,		//DONE
    7.37 +	OP_LOAD_S_PRI,		//DONE
    7.38 +	OP_LOAD_S_ALT,		//DONE
    7.39 +	OP_LREF_PRI,		//DONE
    7.40 +	OP_LREF_ALT,		//DONE
    7.41 +	OP_LREF_S_PRI,		//DONE
    7.42 +	OP_LREF_S_ALT,		//DONE
    7.43 +	OP_LOAD_I,			//DONE
    7.44 +	OP_LODB_I,
    7.45 +	OP_CONST_PRI,		//DONE
    7.46 +	OP_CONST_ALT,		//DONE
    7.47 +	OP_ADDR_PRI,		//DONE
    7.48 +	OP_ADDR_ALT,		//DONE
    7.49 +	OP_STOR_PRI,		//DONE
    7.50 +	OP_STOR_ALT,		//DONE
    7.51 +	OP_STOR_S_PRI,		//DONE
    7.52 +	OP_STOR_S_ALT,		//DONE
    7.53 +	OP_SREF_PRI,		//DONE
    7.54 +	OP_SREF_ALT,		//DONE
    7.55 +	OP_SREF_S_PRI,		//DONE
    7.56 +	OP_SREF_S_ALT,		//DONE
    7.57 +	OP_STOR_I,			//DONE
    7.58 +	OP_STRB_I,
    7.59 +	OP_LIDX,			//DONE
    7.60 +	OP_LIDX_B,
    7.61 +	OP_IDXADDR,			//DONE
    7.62 +	OP_IDXADDR_B,
    7.63 +	OP_ALIGN_PRI,		//DONE
    7.64 +	OP_ALIGN_ALT,		//DONE
    7.65 +	OP_LCTRL,
    7.66 +	OP_SCTRL,
    7.67 +	OP_MOVE_PRI,		//DONE
    7.68 +	OP_MOVE_ALT,		//DONE
    7.69 +	OP_XCHG,			//DONE
    7.70 +	OP_PUSH_PRI,		//DONE
    7.71 +	OP_PUSH_ALT,		//DONE
    7.72 +	OP_PUSH_R,			//DONE
    7.73 +	OP_PUSH_C,			//DONE
    7.74 +	OP_PUSH,			//DONE
    7.75 +	OP_PUSH_S,			//DONE
    7.76 +	OP_POP_PRI,			//DONE
    7.77 +	OP_POP_ALT,			//DONE
    7.78 +	OP_STACK,			//DONE
    7.79 +	OP_HEAP,			//DONE
    7.80 +	OP_PROC,			//DONE
    7.81 +	OP_RET,
    7.82 +	OP_RETN,			//DONE
    7.83 +	OP_CALL,
    7.84 +	OP_CALL_PRI,
    7.85 +	OP_JUMP,			//DONE
    7.86 +	OP_JREL,			//DONE
    7.87 +	OP_JZER,			//DONE
    7.88 +	OP_JNZ,				//DONE
    7.89 +	OP_JEQ,				//DONE
    7.90 +	OP_JNEQ,			//DONE
    7.91 +	OP_JLESS,			//DONE
    7.92 +	OP_JLEQ,			//DONE
    7.93 +	OP_JGRTR,			//DONE
    7.94 +	OP_JGEQ,			//DONE
    7.95 +	OP_JSLESS,			//DONE
    7.96 +	OP_JSLEQ,			//DONE
    7.97 +	OP_JSGRTR,			//DONE
    7.98 +	OP_JSGEQ,			//DONE
    7.99 +	OP_SHL,				//DONE
   7.100 +	OP_SHR,				//DONE
   7.101 +	OP_SSHR,			//DONE
   7.102 +	OP_SHL_C_PRI,		//DONE
   7.103 +	OP_SHL_C_ALT,		//DONE
   7.104 +	OP_SHR_C_PRI,		//DONE
   7.105 +	OP_SHR_C_ALT,		//DONE
   7.106 +	OP_SMUL,			//DONE
   7.107 +	OP_SDIV,			//DONE
   7.108 +	OP_SDIV_ALT,		//DONE
   7.109 +	OP_UMUL,			//DONE
   7.110 +	OP_UDIV,			//DONE
   7.111 +	OP_UDIV_ALT,		//DONE
   7.112 +	OP_ADD,				//DONE
   7.113 +	OP_SUB,				//DONE
   7.114 +	OP_SUB_ALT,			//DONE
   7.115 +	OP_AND,				//DONE
   7.116 +	OP_OR,				//DONE
   7.117 +	OP_XOR,				//DONE
   7.118 +	OP_NOT,				//DONE
   7.119 +	OP_NEG,				//DONE
   7.120 +	OP_INVERT,			//DONE
   7.121 +	OP_ADD_C,			//DONE
   7.122 +	OP_SMUL_C,			//DONE
   7.123 +	OP_ZERO_PRI,		//DONE
   7.124 +	OP_ZERO_ALT,		//DONE
   7.125 +	OP_ZERO,			//DONE
   7.126 +	OP_ZERO_S,			//DONE
   7.127 +	OP_SIGN_PRI,		//DONE
   7.128 +	OP_SIGN_ALT,		//DONE
   7.129 +	OP_EQ,				//DONE
   7.130 +	OP_NEQ,				//DONE
   7.131 +	OP_LESS,			//DONE
   7.132 +	OP_LEQ,				//DONE
   7.133 +	OP_GRTR,			//DONE
   7.134 +	OP_GEQ,				//DONE
   7.135 +	OP_SLESS,			//DONE
   7.136 +	OP_SLEQ,			//DONE
   7.137 +	OP_SGRTR,			//DONE
   7.138 +	OP_SGEQ,			//DONE
   7.139 +	OP_EQ_C_PRI,		//DONE
   7.140 +	OP_EQ_C_ALT,		//DONE
   7.141 +	OP_INC_PRI,			//DONE
   7.142 +	OP_INC_ALT,			//DONE
   7.143 +	OP_INC,				//DONE
   7.144 +	OP_INC_S,			//DONE
   7.145 +	OP_INC_I,			//DONE
   7.146 +	OP_DEC_PRI,			//DONE
   7.147 +	OP_DEC_ALT,			//DONE
   7.148 +	OP_DEC,				//DONE
   7.149 +	OP_DEC_S,			//DONE
   7.150 +	OP_DEC_I,			//DONE
   7.151 +	OP_MOVS,			//DONE
   7.152 +	OP_CMPS,			//DONE
   7.153 +	OP_FILL,			//DONE
   7.154 +	OP_HALT,			//DONE
   7.155 +	OP_BOUNDS,
   7.156 +	OP_SYSREQ_PRI,
   7.157 +	OP_SYSREQ_C,
   7.158 +	OP_FILE,
   7.159 +	OP_LINE,
   7.160 +	OP_SYMBOL,
   7.161 +	OP_SRANGE,
   7.162 +	OP_JUMP_PRI,
   7.163 +	OP_SWITCH,
   7.164 +	OP_CASETBL,			//DONE
   7.165 +	OP_SWAP_PRI,		//DONE
   7.166 +	OP_SWAP_ALT,		//DONE
   7.167 +	OP_PUSH_ADR,		//DONE
   7.168 +	OP_NOP,				//DONE
   7.169 +	OP_SYSREQ_N,
   7.170 +	OP_SYMTAG, 
   7.171 +	OP_BREAK,
   7.172 +	OP_PUSH2_C,			//DONE
   7.173 +	OP_PUSH2,			//DONE
   7.174 +	OP_PUSH2_S,			//DONE
   7.175 +	OP_PUSH2_ADR,		//DONE
   7.176 +	OP_PUSH3_C,			//DONE
   7.177 +	OP_PUSH3,			//DONE
   7.178 +	OP_PUSH3_S,			//DONE
   7.179 +	OP_PUSH3_ADR,		//DONE
   7.180 +	OP_PUSH4_C,			//DONE
   7.181 +	OP_PUSH4,			//DONE
   7.182 +	OP_PUSH4_S,			//DONE
   7.183 +	OP_PUSH4_ADR,		//DONE
   7.184 +	OP_PUSH5_C,			//DONE
   7.185 +	OP_PUSH5,			//DONE
   7.186 +	OP_PUSH5_S,			//DONE
   7.187 +	OP_PUSH5_ADR,		//DONE
   7.188 +	OP_LOAD_BOTH,
   7.189 +	OP_LOAD_S_BOTH,
   7.190 +	OP_CONST,
   7.191 +	OP_CONST_S,
   7.192 +	/* ----- */
   7.193 +	OP_SYSREQ_D,
   7.194 +	OP_SYSREQ_ND,
   7.195 +	/* ----- */
   7.196 +	OP_HEAP_PRI,
   7.197 +	OP_PUSH_HEAP_C,
   7.198 +	OP_POP_HEAP_PRI,
   7.199 +	/* ----- */
   7.200 +	OP_NUM_OPCODES
   7.201 +} OPCODE;
   7.202 +
   7.203  #endif //_INCLUDE_SOURCEPAWN_JIT_X86_H_
     8.1 --- a/sourcepawn/vm/jit/x86/msvc8/jit-x86.vcproj	Wed Sep 20 00:41:24 2006 +0000
     8.2 +++ b/sourcepawn/vm/jit/x86/msvc8/jit-x86.vcproj	Wed Sep 20 01:59:56 2006 +0000
     8.3 @@ -188,10 +188,6 @@
     8.4  				</FileConfiguration>
     8.5  			</File>
     8.6  			<File
     8.7 -				RelativePath="..\..\jit_helpers.cpp"
     8.8 -				>
     8.9 -			</File>
    8.10 -			<File
    8.11  				RelativePath="..\jit_x86.cpp"
    8.12  				>
    8.13  			</File>
     9.1 --- a/sourcepawn/vm/jit/x86/x86_macros.h	Wed Sep 20 00:41:24 2006 +0000
     9.2 +++ b/sourcepawn/vm/jit/x86/x86_macros.h	Wed Sep 20 01:59:56 2006 +0000
     9.3 @@ -1,6 +1,8 @@
     9.4  #ifndef _INCLUDE_JIT_X86_MACROS_H
     9.5  #define _INCLUDE_JIT_X86_MACROS_H
     9.6  
     9.7 +#include "..\jit_helpers.h"
     9.8 +
     9.9  //MOD R/M
    9.10  #define MOD_MEM_REG	0
    9.11  #define MOD_DISP8	1
    9.12 @@ -134,544 +136,544 @@
    9.13   * INCREMENT/DECREMENT *
    9.14   ***********************/
    9.15  
    9.16 -inline void IA32_Inc_Rm_Disp32(jitinfo_t *jit, jit_uint8_t reg, jit_int32_t disp)
    9.17 +inline void IA32_Inc_Rm_Disp32(JitWriter *jit, jit_uint8_t reg, jit_int32_t disp)
    9.18  {
    9.19 -	jit->wrfuncs.write_ubyte(jit, IA32_INC_RM);
    9.20 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, 0, reg));
    9.21 -	jit->wrfuncs.write_int32(jit, disp);
    9.22 +	jit->write_ubyte(jit, IA32_INC_RM);
    9.23 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, 0, reg));
    9.24 +	jit->write_int32(jit, disp);
    9.25  }
    9.26  
    9.27 -inline void IA32_Inc_Rm_Disp8(jitinfo_t *jit, jit_uint8_t reg, jit_int8_t disp)
    9.28 +inline void IA32_Inc_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp)
    9.29  {
    9.30 -	jit->wrfuncs.write_ubyte(jit, IA32_INC_RM);
    9.31 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, reg));
    9.32 -	jit->wrfuncs.write_byte(jit, disp);
    9.33 +	jit->write_ubyte(jit, IA32_INC_RM);
    9.34 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, reg));
    9.35 +	jit->write_byte(jit, disp);
    9.36  }
    9.37  
    9.38 -inline void IA32_Inc_Rm_Disp_Reg(jitinfo_t *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
    9.39 +inline void IA32_Inc_Rm_Disp_Reg(JitWriter *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
    9.40  {
    9.41 -	jit->wrfuncs.write_ubyte(jit, IA32_INC_RM);
    9.42 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
    9.43 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(scale, reg, base));
    9.44 +	jit->write_ubyte(jit, IA32_INC_RM);
    9.45 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
    9.46 +	jit->write_ubyte(jit, ia32_sib(scale, reg, base));
    9.47  }
    9.48  
    9.49 -inline void IA32_Inc_Reg(jitinfo_t *jit, jit_uint8_t reg)
    9.50 +inline void IA32_Inc_Reg(JitWriter *jit, jit_uint8_t reg)
    9.51  {
    9.52 -	jit->wrfuncs.write_ubyte(jit, IA32_INC_REG+reg);
    9.53 +	jit->write_ubyte(jit, IA32_INC_REG+reg);
    9.54  }
    9.55  
    9.56 -inline void IA32_Dec_Rm_Disp32(jitinfo_t *jit, jit_uint8_t reg, jit_int32_t disp)
    9.57 +inline void IA32_Dec_Rm_Disp32(JitWriter *jit, jit_uint8_t reg, jit_int32_t disp)
    9.58  {
    9.59 -	jit->wrfuncs.write_ubyte(jit, IA32_DEC_RM);
    9.60 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, 1, reg));
    9.61 -	jit->wrfuncs.write_int32(jit, disp);
    9.62 +	jit->write_ubyte(jit, IA32_DEC_RM);
    9.63 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, 1, reg));
    9.64 +	jit->write_int32(jit, disp);
    9.65  }
    9.66  
    9.67 -inline void IA32_Dec_Rm_Disp8(jitinfo_t *jit, jit_uint8_t reg, jit_int8_t disp)
    9.68 +inline void IA32_Dec_Rm_Disp8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp)
    9.69  {
    9.70 -	jit->wrfuncs.write_ubyte(jit, IA32_DEC_RM);
    9.71 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 1, reg));
    9.72 -	jit->wrfuncs.write_byte(jit, disp);
    9.73 +	jit->write_ubyte(jit, IA32_DEC_RM);
    9.74 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 1, reg));
    9.75 +	jit->write_byte(jit, disp);
    9.76  }
    9.77  
    9.78 -inline void IA32_Dec_Rm_Disp_Reg(jitinfo_t *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
    9.79 +inline void IA32_Dec_Rm_Disp_Reg(JitWriter *jit, jit_uint8_t base, jit_uint8_t reg, jit_uint8_t scale)
    9.80  {
    9.81 -	jit->wrfuncs.write_ubyte(jit, IA32_DEC_RM);
    9.82 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 1, REG_SIB));
    9.83 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(scale, reg, base));
    9.84 +	jit->write_ubyte(jit, IA32_DEC_RM);
    9.85 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 1, REG_SIB));
    9.86 +	jit->write_ubyte(jit, ia32_sib(scale, reg, base));
    9.87  }
    9.88  
    9.89 -inline void IA32_Dec_Reg(jitinfo_t *jit, jit_uint8_t reg)
    9.90 +inline void IA32_Dec_Reg(JitWriter *jit, jit_uint8_t reg)
    9.91  {
    9.92 -	jit->wrfuncs.write_ubyte(jit, IA32_DEC_REG+reg);
    9.93 +	jit->write_ubyte(jit, IA32_DEC_REG+reg);
    9.94  }
    9.95  
    9.96  /****************
    9.97   * BINARY LOGIC *
    9.98   ****************/
    9.99  
   9.100 -inline void IA32_Xor_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t dest_mode)
   9.101 +inline void IA32_Xor_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t dest_mode)
   9.102  {
   9.103 -	jit->wrfuncs.write_ubyte(jit, IA32_XOR_RM_REG);
   9.104 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(dest_mode, src, dest));
   9.105 +	jit->write_ubyte(jit, IA32_XOR_RM_REG);
   9.106 +	jit->write_ubyte(jit, ia32_modrm(dest_mode, src, dest));
   9.107  }
   9.108  
   9.109 -inline void IA32_Xor_Eax_Imm32(jitinfo_t *jit, jit_int32_t value)
   9.110 +inline void IA32_Xor_Eax_Imm32(JitWriter *jit, jit_int32_t value)
   9.111  {
   9.112 -	jit->wrfuncs.write_ubyte(jit, IA32_XOR_EAX_IMM32);
   9.113 -	jit->wrfuncs.write_int32(jit, value);
   9.114 +	jit->write_ubyte(jit, IA32_XOR_EAX_IMM32);
   9.115 +	jit->write_int32(jit, value);
   9.116  }
   9.117  
   9.118 -inline void IA32_Xor_Rm_Imm32(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
   9.119 +inline void IA32_Xor_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
   9.120  {
   9.121 -	jit->wrfuncs.write_ubyte(jit, IA32_XOR_RM_IMM32);
   9.122 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 6, reg));
   9.123 -	jit->wrfuncs.write_int32(jit, value);
   9.124 +	jit->write_ubyte(jit, IA32_XOR_RM_IMM32);
   9.125 +	jit->write_ubyte(jit, ia32_modrm(mode, 6, reg));
   9.126 +	jit->write_int32(jit, value);
   9.127  }
   9.128  
   9.129 -inline void IA32_Xor_Rm_Imm8(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
   9.130 +inline void IA32_Xor_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
   9.131  {
   9.132 -	jit->wrfuncs.write_ubyte(jit, IA32_XOR_RM_IMM8);
   9.133 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 6, reg));
   9.134 -	jit->wrfuncs.write_byte(jit, value);
   9.135 +	jit->write_ubyte(jit, IA32_XOR_RM_IMM8);
   9.136 +	jit->write_ubyte(jit, ia32_modrm(mode, 6, reg));
   9.137 +	jit->write_byte(jit, value);
   9.138  }
   9.139  
   9.140 -inline void IA32_Neg_Rm(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.141 +inline void IA32_Neg_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.142  {
   9.143 -	jit->wrfuncs.write_ubyte(jit, IA32_NEG_RM);
   9.144 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 3, reg));
   9.145 +	jit->write_ubyte(jit, IA32_NEG_RM);
   9.146 +	jit->write_ubyte(jit, ia32_modrm(mode, 3, reg));
   9.147  }
   9.148  
   9.149 -inline void IA32_Or_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.150 +inline void IA32_Or_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.151  {
   9.152 -	jit->wrfuncs.write_ubyte(jit, IA32_OR_RM_REG);
   9.153 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.154 +	jit->write_ubyte(jit, IA32_OR_RM_REG);
   9.155 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.156  }
   9.157  
   9.158 -inline void IA32_And_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.159 +inline void IA32_And_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.160  {
   9.161 -	jit->wrfuncs.write_ubyte(jit, IA32_AND_RM_REG);
   9.162 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.163 +	jit->write_ubyte(jit, IA32_AND_RM_REG);
   9.164 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.165  }
   9.166  
   9.167 -inline void IA32_Not_Rm(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.168 +inline void IA32_Not_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.169  {
   9.170 -	jit->wrfuncs.write_ubyte(jit, IA32_NOT_RM);
   9.171 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 2, reg));
   9.172 +	jit->write_ubyte(jit, IA32_NOT_RM);
   9.173 +	jit->write_ubyte(jit, ia32_modrm(mode, 2, reg));
   9.174  }
   9.175  
   9.176 -inline void IA32_Shr_Rm_Imm8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
   9.177 +inline void IA32_Shr_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
   9.178  {
   9.179 -	jit->wrfuncs.write_ubyte(jit, IA32_SHR_RM_IMM8);
   9.180 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 5, dest));
   9.181 -	jit->wrfuncs.write_ubyte(jit, value);
   9.182 +	jit->write_ubyte(jit, IA32_SHR_RM_IMM8);
   9.183 +	jit->write_ubyte(jit, ia32_modrm(mode, 5, dest));
   9.184 +	jit->write_ubyte(jit, value);
   9.185  }
   9.186  
   9.187 -inline void IA32_Shl_Rm_Imm8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
   9.188 +inline void IA32_Shl_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
   9.189  {
   9.190 -	jit->wrfuncs.write_ubyte(jit, IA32_SHL_RM_IMM8);
   9.191 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 4, dest));
   9.192 -	jit->wrfuncs.write_ubyte(jit, value);
   9.193 +	jit->write_ubyte(jit, IA32_SHL_RM_IMM8);
   9.194 +	jit->write_ubyte(jit, ia32_modrm(mode, 4, dest));
   9.195 +	jit->write_ubyte(jit, value);
   9.196  }
   9.197  
   9.198 -inline void IA32_Sar_Rm_Imm8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
   9.199 +inline void IA32_Sar_Rm_Imm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t value, jit_uint8_t mode)
   9.200  {
   9.201 -	jit->wrfuncs.write_ubyte(jit, IA32_SAR_RM_IMM8);
   9.202 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 7, dest));
   9.203 -	jit->wrfuncs.write_ubyte(jit, value);
   9.204 +	jit->write_ubyte(jit, IA32_SAR_RM_IMM8);
   9.205 +	jit->write_ubyte(jit, ia32_modrm(mode, 7, dest));
   9.206 +	jit->write_ubyte(jit, value);
   9.207  }
   9.208  
   9.209 -inline void IA32_Sar_Rm_CL(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.210 +inline void IA32_Sar_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.211  {
   9.212 -	jit->wrfuncs.write_ubyte(jit, IA32_SAR_RM_CL);
   9.213 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 7, reg));
   9.214 +	jit->write_ubyte(jit, IA32_SAR_RM_CL);
   9.215 +	jit->write_ubyte(jit, ia32_modrm(mode, 7, reg));
   9.216  }
   9.217  
   9.218 -inline void IA32_Shr_Rm_CL(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.219 +inline void IA32_Shr_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.220  {
   9.221 -	jit->wrfuncs.write_ubyte(jit, IA32_SHR_RM_CL);
   9.222 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.223 +	jit->write_ubyte(jit, IA32_SHR_RM_CL);
   9.224 +	jit->write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.225  }
   9.226  
   9.227 -inline void IA32_Shl_Rm_CL(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.228 +inline void IA32_Shl_Rm_CL(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.229  {
   9.230 -	jit->wrfuncs.write_ubyte(jit, IA32_SHL_RM_CL);
   9.231 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 4, reg));
   9.232 +	jit->write_ubyte(jit, IA32_SHL_RM_CL);
   9.233 +	jit->write_ubyte(jit, ia32_modrm(mode, 4, reg));
   9.234  }
   9.235  
   9.236 -inline void IA32_Xchg_Eax_Reg(jitinfo_t *jit, jit_uint8_t reg)
   9.237 +inline void IA32_Xchg_Eax_Reg(JitWriter *jit, jit_uint8_t reg)
   9.238  {
   9.239 -	jit->wrfuncs.write_ubyte(jit, IA32_XCHG_EAX_REG+reg);
   9.240 +	jit->write_ubyte(jit, IA32_XCHG_EAX_REG+reg);
   9.241  }
   9.242  
   9.243 -inline void IA32_Xchg_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.244 +inline void IA32_Xchg_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.245  {
   9.246 -	jit->wrfuncs.write_ubyte(jit, IA32_XCHG_RM_REG);
   9.247 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.248 +	jit->write_ubyte(jit, IA32_XCHG_RM_REG);
   9.249 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.250  }
   9.251  
   9.252  /**********************
   9.253   * ARITHMETIC (BASIC) *
   9.254   **********************/
   9.255  
   9.256 -inline void IA32_Add_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.257 +inline void IA32_Add_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.258  {
   9.259 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_REG);
   9.260 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.261 +	jit->write_ubyte(jit, IA32_ADD_RM_REG);
   9.262 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.263  }
   9.264  
   9.265 -inline void IA32_Add_Rm_Imm8(jitinfo_t *jit, jit_uint8_t reg, jit_int8_t value, jit_uint8_t mode)
   9.266 +inline void IA32_Add_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t value, jit_uint8_t mode)
   9.267  {
   9.268 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.269 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.270 -	jit->wrfuncs.write_byte(jit, value);
   9.271 +	jit->write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.272 +	jit->write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.273 +	jit->write_byte(jit, value);
   9.274  }
   9.275  
   9.276 -inline void IA32_Add_Rm_Imm32(jitinfo_t *jit, jit_uint8_t reg, jit_int32_t value, jit_uint8_t mode)
   9.277 +inline void IA32_Add_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t value, jit_uint8_t mode)
   9.278  {
   9.279 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_IMM32);
   9.280 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.281 -	jit->wrfuncs.write_int32(jit, value);
   9.282 +	jit->write_ubyte(jit, IA32_ADD_RM_IMM32);
   9.283 +	jit->write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.284 +	jit->write_int32(jit, value);
   9.285  }
   9.286  
   9.287 -inline void IA32_Add_Eax_Imm32(jitinfo_t *jit, jit_int32_t value)
   9.288 +inline void IA32_Add_Eax_Imm32(JitWriter *jit, jit_int32_t value)
   9.289  {
   9.290 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_EAX_IMM32);
   9.291 -	jit->wrfuncs.write_int32(jit, value);
   9.292 +	jit->write_ubyte(jit, IA32_ADD_EAX_IMM32);
   9.293 +	jit->write_int32(jit, value);
   9.294  }
   9.295  
   9.296 -inline void IA32_Sub_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.297 +inline void IA32_Sub_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.298  {
   9.299 -	jit->wrfuncs.write_ubyte(jit, IA32_SUB_RM_REG);
   9.300 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.301 +	jit->write_ubyte(jit, IA32_SUB_RM_REG);
   9.302 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.303  }
   9.304  
   9.305 -inline void IA32_Sub_Rm_Imm8(jitinfo_t *jit, jit_uint8_t reg, jit_int8_t val, jit_uint8_t mode)
   9.306 +inline void IA32_Sub_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t val, jit_uint8_t mode)
   9.307  {
   9.308 -	jit->wrfuncs.write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.309 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.310 -	jit->wrfuncs.write_byte(jit, val);
   9.311 +	jit->write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.312 +	jit->write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.313 +	jit->write_byte(jit, val);
   9.314  }
   9.315  
   9.316 -inline void IA32_Sub_Rm_Imm32(jitinfo_t *jit, jit_uint8_t reg, jit_int32_t val, jit_uint8_t mode)
   9.317 +inline void IA32_Sub_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t val, jit_uint8_t mode)
   9.318  {
   9.319 -	jit->wrfuncs.write_ubyte(jit, IA32_SUB_RM_IMM32);
   9.320 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.321 -	jit->wrfuncs.write_int32(jit, val);
   9.322 +	jit->write_ubyte(jit, IA32_SUB_RM_IMM32);
   9.323 +	jit->write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.324 +	jit->write_int32(jit, val);
   9.325  }
   9.326  
   9.327 -inline void IA32_Div_Rm(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.328 +inline void IA32_Div_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.329  {
   9.330 -	jit->wrfuncs.write_ubyte(jit, IA32_DIV_RM);
   9.331 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 6, reg));
   9.332 +	jit->write_ubyte(jit, IA32_DIV_RM);
   9.333 +	jit->write_ubyte(jit, ia32_modrm(mode, 6, reg));
   9.334  }
   9.335  
   9.336 -inline void IA32_IDiv_Rm(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.337 +inline void IA32_IDiv_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.338  {
   9.339 -	jit->wrfuncs.write_ubyte(jit, IA32_IDIV_RM);
   9.340 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 7, reg));
   9.341 +	jit->write_ubyte(jit, IA32_IDIV_RM);
   9.342 +	jit->write_ubyte(jit, ia32_modrm(mode, 7, reg));
   9.343  }
   9.344  
   9.345 -inline void IA32_Mul_Rm(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.346 +inline void IA32_Mul_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.347  {
   9.348 -	jit->wrfuncs.write_ubyte(jit, IA32_MUL_RM);
   9.349 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 4, reg));
   9.350 +	jit->write_ubyte(jit, IA32_MUL_RM);
   9.351 +	jit->write_ubyte(jit, ia32_modrm(mode, 4, reg));
   9.352  }
   9.353  
   9.354 -inline void IA32_IMul_Rm(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.355 +inline void IA32_IMul_Rm(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode)
   9.356  {
   9.357 -	jit->wrfuncs.write_ubyte(jit, IA32_IMUL_RM);
   9.358 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.359 +	jit->write_ubyte(jit, IA32_IMUL_RM);
   9.360 +	jit->write_ubyte(jit, ia32_modrm(mode, 5, reg));
   9.361  }
   9.362  
   9.363 -inline void IA32_IMul_Reg_Imm8(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
   9.364 +inline void IA32_IMul_Reg_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value)
   9.365  {
   9.366 -	jit->wrfuncs.write_ubyte(jit, IA32_IMUL_REG_IMM8);
   9.367 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.368 -	jit->wrfuncs.write_byte(jit, value);
   9.369 +	jit->write_ubyte(jit, IA32_IMUL_REG_IMM8);
   9.370 +	jit->write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.371 +	jit->write_byte(jit, value);
   9.372  }
   9.373  
   9.374 -inline void IA32_IMul_Reg_Imm32(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
   9.375 +inline void IA32_IMul_Reg_Imm32(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int32_t value)
   9.376  {
   9.377 -	jit->wrfuncs.write_ubyte(jit, IA32_IMUL_REG_IMM32);
   9.378 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.379 -	jit->wrfuncs.write_int32(jit, value);
   9.380 +	jit->write_ubyte(jit, IA32_IMUL_REG_IMM32);
   9.381 +	jit->write_ubyte(jit, ia32_modrm(mode, 0, reg));
   9.382 +	jit->write_int32(jit, value);
   9.383  }
   9.384  
   9.385 -inline void IA32_Add_Rm_Reg_Disp8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
   9.386 +inline void IA32_Add_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
   9.387  {
   9.388 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_REG);
   9.389 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, src, dest));
   9.390 -	jit->wrfuncs.write_byte(jit, disp);
   9.391 +	jit->write_ubyte(jit, IA32_ADD_RM_REG);
   9.392 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, src, dest));
   9.393 +	jit->write_byte(jit, disp);
   9.394  }
   9.395  
   9.396 -inline void IA32_Add_Rm_Imm8_Disp8(jitinfo_t *jit, 
   9.397 +inline void IA32_Add_Rm_Imm8_Disp8(JitWriter *jit, 
   9.398  							 jit_uint8_t dest, 
   9.399  							 jit_int8_t val, 
   9.400  							 jit_int8_t disp8)
   9.401  {
   9.402 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.403 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, dest));
   9.404 -	jit->wrfuncs.write_byte(jit, disp8);
   9.405 -	jit->wrfuncs.write_byte(jit, val);
   9.406 +	jit->write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.407 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, dest));
   9.408 +	jit->write_byte(jit, disp8);
   9.409 +	jit->write_byte(jit, val);
   9.410  }
   9.411  
   9.412 -inline void IA32_Add_Rm_Imm32_Disp8(jitinfo_t *jit, 
   9.413 +inline void IA32_Add_Rm_Imm32_Disp8(JitWriter *jit, 
   9.414  							 jit_uint8_t dest, 
   9.415  							 jit_int32_t val, 
   9.416  							 jit_int8_t disp8)
   9.417  {
   9.418 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_IMM32);
   9.419 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, dest));
   9.420 -	jit->wrfuncs.write_byte(jit, disp8);
   9.421 -	jit->wrfuncs.write_int32(jit, val);
   9.422 +	jit->write_ubyte(jit, IA32_ADD_RM_IMM32);
   9.423 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, dest));
   9.424 +	jit->write_byte(jit, disp8);
   9.425 +	jit->write_int32(jit, val);
   9.426  }
   9.427  
   9.428 -inline void IA32_Add_Rm_Imm8_Disp32(jitinfo_t *jit, 
   9.429 +inline void IA32_Add_Rm_Imm8_Disp32(JitWriter *jit, 
   9.430  							jit_uint8_t dest, 
   9.431  							jit_int8_t val, 
   9.432  							jit_int32_t disp32)
   9.433  {
   9.434 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.435 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, 0, dest));
   9.436 -	jit->wrfuncs.write_int32(jit, disp32);
   9.437 -	jit->wrfuncs.write_byte(jit, val);
   9.438 +	jit->write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.439 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, 0, dest));
   9.440 +	jit->write_int32(jit, disp32);
   9.441 +	jit->write_byte(jit, val);
   9.442  }
   9.443  
   9.444 -inline void IA32_Add_Rm_Imm8_Disp_Reg(jitinfo_t *jit, 
   9.445 +inline void IA32_Add_Rm_Imm8_Disp_Reg(JitWriter *jit, 
   9.446  								jit_uint8_t dest_base, 
   9.447  								jit_uint8_t dest_index,
   9.448  								jit_uint8_t dest_scale,
   9.449  								jit_int8_t val)
   9.450  {
   9.451 -	jit->wrfuncs.write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.452 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
   9.453 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.454 -	jit->wrfuncs.write_byte(jit, val);
   9.455 +	jit->write_ubyte(jit, IA32_ADD_RM_IMM8);
   9.456 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
   9.457 +	jit->write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.458 +	jit->write_byte(jit, val);
   9.459  }
   9.460  
   9.461 -inline void IA32_Sub_Rm_Imm8_Disp8(jitinfo_t *jit, 
   9.462 +inline void IA32_Sub_Rm_Imm8_Disp8(JitWriter *jit, 
   9.463  							jit_uint8_t dest, 
   9.464  							jit_int8_t val, 
   9.465  							jit_int8_t disp8)
   9.466  {
   9.467 -	jit->wrfuncs.write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.468 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 5, dest));
   9.469 -	jit->wrfuncs.write_byte(jit, disp8);
   9.470 -	jit->wrfuncs.write_byte(jit, val);
   9.471 +	jit->write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.472 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 5, dest));
   9.473 +	jit->write_byte(jit, disp8);
   9.474 +	jit->write_byte(jit, val);
   9.475  }
   9.476  
   9.477 -inline void IA32_Sub_Rm_Imm8_Disp32(jitinfo_t *jit, 
   9.478 +inline void IA32_Sub_Rm_Imm8_Disp32(JitWriter *jit, 
   9.479  							 jit_uint8_t dest, 
   9.480  							 jit_int8_t val, 
   9.481  							 jit_int32_t disp32)
   9.482  {
   9.483 -	jit->wrfuncs.write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.484 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, 5, dest));
   9.485 -	jit->wrfuncs.write_int32(jit, disp32);
   9.486 -	jit->wrfuncs.write_byte(jit, val);
   9.487 +	jit->write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.488 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, 5, dest));
   9.489 +	jit->write_int32(jit, disp32);
   9.490 +	jit->write_byte(jit, val);
   9.491  }
   9.492  
   9.493 -inline void IA32_Sub_Rm_Imm8_Disp_Reg(jitinfo_t *jit, 
   9.494 +inline void IA32_Sub_Rm_Imm8_Disp_Reg(JitWriter *jit, 
   9.495  							   jit_uint8_t dest_base, 
   9.496  							   jit_uint8_t dest_index,
   9.497  							   jit_uint8_t dest_scale,
   9.498  							   jit_int8_t val)
   9.499  {
   9.500 -	jit->wrfuncs.write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.501 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 5, REG_SIB));
   9.502 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.503 -	jit->wrfuncs.write_byte(jit, val);
   9.504 +	jit->write_ubyte(jit, IA32_SUB_RM_IMM8);
   9.505 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 5, REG_SIB));
   9.506 +	jit->write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.507 +	jit->write_byte(jit, val);
   9.508  }
   9.509  
   9.510  /**
   9.511  * Memory Instructions
   9.512  */
   9.513  
   9.514 -inline void IA32_Lea_Reg_DispRegMult(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_uint8_t src_index, jit_uint8_t scale)
   9.515 +inline void IA32_Lea_Reg_DispRegMult(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_uint8_t src_index, jit_uint8_t scale)
   9.516  {
   9.517 -	jit->wrfuncs.write_ubyte(jit, IA32_LEA_REG_MEM);
   9.518 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
   9.519 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(scale, src_index, src_base));
   9.520 +	jit->write_ubyte(jit, IA32_LEA_REG_MEM);
   9.521 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
   9.522 +	jit->write_ubyte(jit, ia32_sib(scale, src_index, src_base));
   9.523  }
   9.524  
   9.525 -inline void IA32_Lea_Reg_DispRegMultImm8(jitinfo_t *jit, 
   9.526 +inline void IA32_Lea_Reg_DispRegMultImm8(JitWriter *jit, 
   9.527  							  jit_uint8_t dest, 
   9.528  							  jit_uint8_t src_base, 
   9.529  							  jit_uint8_t src_index, 
   9.530  							  jit_uint8_t scale, 
   9.531  							  jit_int8_t val)
   9.532  {
   9.533 -	jit->wrfuncs.write_ubyte(jit, IA32_LEA_REG_MEM);
   9.534 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, dest, REG_SIB));
   9.535 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(scale, src_index, src_base));
   9.536 -	jit->wrfuncs.write_byte(jit, val);
   9.537 +	jit->write_ubyte(jit, IA32_LEA_REG_MEM);
   9.538 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, dest, REG_SIB));
   9.539 +	jit->write_ubyte(jit, ia32_sib(scale, src_index, src_base));
   9.540 +	jit->write_byte(jit, val);
   9.541  }
   9.542  
   9.543 -inline void IA32_Lea_DispRegImm8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int8_t val)
   9.544 +inline void IA32_Lea_DispRegImm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int8_t val)
   9.545  {
   9.546 -	jit->wrfuncs.write_ubyte(jit, IA32_LEA_REG_MEM);
   9.547 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, dest, MOD_MEM_REG));
   9.548 -	jit->wrfuncs.write_byte(jit, val);
   9.549 +	jit->write_ubyte(jit, IA32_LEA_REG_MEM);
   9.550 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, dest, MOD_MEM_REG));
   9.551 +	jit->write_byte(jit, val);
   9.552  }
   9.553  
   9.554 -inline void IA32_Lea_DispRegImm32(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int32_t val)
   9.555 +inline void IA32_Lea_DispRegImm32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int32_t val)
   9.556  {
   9.557 -	jit->wrfuncs.write_ubyte(jit, IA32_LEA_REG_MEM);
   9.558 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, dest, MOD_MEM_REG));
   9.559 -	jit->wrfuncs.write_int32(jit, val);
   9.560 +	jit->write_ubyte(jit, IA32_LEA_REG_MEM);
   9.561 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, dest, MOD_MEM_REG));
   9.562 +	jit->write_int32(jit, val);
   9.563  }
   9.564  
   9.565  /**
   9.566  * Stack Instructions
   9.567  */
   9.568  
   9.569 -inline void IA32_Pop_Reg(jitinfo_t *jit, jit_uint8_t reg)
   9.570 +inline void IA32_Pop_Reg(JitWriter *jit, jit_uint8_t reg)
   9.571  {
   9.572 -	jit->wrfuncs.write_ubyte(jit, IA32_POP_REG+reg);
   9.573 +	jit->write_ubyte(jit, IA32_POP_REG+reg);
   9.574  }
   9.575  
   9.576 -inline void IA32_Push_Reg(jitinfo_t *jit, jit_uint8_t reg)
   9.577 +inline void IA32_Push_Reg(JitWriter *jit, jit_uint8_t reg)
   9.578  {
   9.579 -	jit->wrfuncs.write_ubyte(jit, IA32_PUSH_REG+reg);
   9.580 +	jit->write_ubyte(jit, IA32_PUSH_REG+reg);
   9.581  }
   9.582  
   9.583  /**
   9.584   * Moving from REGISTER/MEMORY to REGISTER
   9.585   */
   9.586  
   9.587 -inline void IA32_Mov_Reg_Rm(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.588 +inline void IA32_Mov_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.589  {
   9.590 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_REG_MEM);
   9.591 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, dest, src));
   9.592 +	jit->write_ubyte(jit, IA32_MOV_REG_MEM);
   9.593 +	jit->write_ubyte(jit, ia32_modrm(mode, dest, src));
   9.594  }
   9.595  
   9.596 -inline void IA32_Mov_Reg_Rm_Disp8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
   9.597 +inline void IA32_Mov_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
   9.598  {
   9.599 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_REG_MEM);
   9.600 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, dest, src));
   9.601 -	jit->wrfuncs.write_byte(jit, disp);
   9.602 +	jit->write_ubyte(jit, IA32_MOV_REG_MEM);
   9.603 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, dest, src));
   9.604 +	jit->write_byte(jit, disp);
   9.605  }
   9.606  
   9.607 -inline void IA32_Mov_Reg_Rm_Disp32(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
   9.608 +inline void IA32_Mov_Reg_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
   9.609  {
   9.610 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_REG_MEM);
   9.611 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, dest, src));
   9.612 -	jit->wrfuncs.write_int32(jit, disp);
   9.613 +	jit->write_ubyte(jit, IA32_MOV_REG_MEM);
   9.614 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, dest, src));
   9.615 +	jit->write_int32(jit, disp);
   9.616  }
   9.617  
   9.618 -inline void IA32_Mov_Reg_Rm_Disp_Reg(jitinfo_t *jit, 
   9.619 +inline void IA32_Mov_Reg_Rm_Disp_Reg(JitWriter *jit, 
   9.620  							jit_uint8_t dest, 
   9.621  							jit_uint8_t src_base, 
   9.622  							jit_uint8_t src_index,
   9.623  							jit_uint8_t src_scale)
   9.624  {
   9.625 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_REG_MEM);
   9.626 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
   9.627 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(src_scale, src_index, src_base));
   9.628 +	jit->write_ubyte(jit, IA32_MOV_REG_MEM);
   9.629 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, dest, REG_SIB));
   9.630 +	jit->write_ubyte(jit, ia32_sib(src_scale, src_index, src_base));
   9.631  }
   9.632  
   9.633  /**
   9.634   * Moving from REGISTER to REGISTER/MEMORY
   9.635   */
   9.636  
   9.637 -inline void IA32_Mov_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.638 +inline void IA32_Mov_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.639  {
   9.640 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_REG);
   9.641 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.642 +	jit->write_ubyte(jit, IA32_MOV_RM_REG);
   9.643 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.644  }
   9.645  
   9.646 -inline void IA32_Mov_Rm_Reg_Disp8(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
   9.647 +inline void IA32_Mov_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp)
   9.648  {
   9.649 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_REG);
   9.650 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, src, dest));
   9.651 -	jit->wrfuncs.write_byte(jit, disp);
   9.652 +	jit->write_ubyte(jit, IA32_MOV_RM_REG);
   9.653 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, src, dest));
   9.654 +	jit->write_byte(jit, disp);
   9.655  }
   9.656  
   9.657 -inline void IA32_Mov_Rm_Reg_Disp32(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
   9.658 +inline void IA32_Mov_Rm_Reg_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp)
   9.659  {
   9.660 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_REG);
   9.661 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, src, dest));
   9.662 -	jit->wrfuncs.write_int32(jit, disp);
   9.663 +	jit->write_ubyte(jit, IA32_MOV_RM_REG);
   9.664 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, src, dest));
   9.665 +	jit->write_int32(jit, disp);
   9.666  }
   9.667  
   9.668 -inline void IA32_Mov_Rm_Reg_Disp_Reg(jitinfo_t *jit, 
   9.669 +inline void IA32_Mov_Rm_Reg_Disp_Reg(JitWriter *jit, 
   9.670  							  jit_uint8_t dest_base, 
   9.671  							  jit_uint8_t dest_index,
   9.672  							  jit_uint8_t dest_scale,
   9.673  							  jit_uint8_t src)
   9.674  {
   9.675 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_REG);
   9.676 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, src, REG_SIB));
   9.677 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.678 +	jit->write_ubyte(jit, IA32_MOV_RM_REG);
   9.679 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, src, REG_SIB));
   9.680 +	jit->write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.681  }
   9.682  
   9.683  /**
   9.684   * Moving from IMMEDIATE to REGISTER
   9.685   */
   9.686  
   9.687 -inline void IA32_Mov_Reg_Imm32(jitinfo_t *jit, jit_uint8_t dest, jit_int32_t num)
   9.688 +inline void IA32_Mov_Reg_Imm32(JitWriter *jit, jit_uint8_t dest, jit_int32_t num)
   9.689  {
   9.690 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_REG_IMM+dest);
   9.691 -	jit->wrfuncs.write_int32(jit, num);
   9.692 +	jit->write_ubyte(jit, IA32_MOV_REG_IMM+dest);
   9.693 +	jit->write_int32(jit, num);
   9.694  }
   9.695  
   9.696 -inline void IA32_Mov_Rm_Imm32_Disp8(jitinfo_t *jit, 
   9.697 +inline void IA32_Mov_Rm_Imm32_Disp8(JitWriter *jit, 
   9.698  							 jit_uint8_t dest, 
   9.699  							 jit_int32_t val, 
   9.700  							 jit_int8_t disp8)
   9.701  {
   9.702 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_IMM32);
   9.703 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, dest));
   9.704 -	jit->wrfuncs.write_byte(jit, disp8);
   9.705 -	jit->wrfuncs.write_int32(jit, val);
   9.706 +	jit->write_ubyte(jit, IA32_MOV_RM_IMM32);
   9.707 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 0, dest));
   9.708 +	jit->write_byte(jit, disp8);
   9.709 +	jit->write_int32(jit, val);
   9.710  }
   9.711  
   9.712 -inline void IA32_Mov_Rm_Imm32_Disp32(jitinfo_t *jit, 
   9.713 +inline void IA32_Mov_Rm_Imm32_Disp32(JitWriter *jit, 
   9.714  							 jit_uint8_t dest, 
   9.715  							 jit_int32_t val, 
   9.716  							 jit_int32_t disp32)
   9.717  {
   9.718 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_IMM32);
   9.719 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP32, 0, dest));
   9.720 -	jit->wrfuncs.write_int32(jit, disp32);
   9.721 -	jit->wrfuncs.write_int32(jit, val);
   9.722 +	jit->write_ubyte(jit, IA32_MOV_RM_IMM32);
   9.723 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP32, 0, dest));
   9.724 +	jit->write_int32(jit, disp32);
   9.725 +	jit->write_int32(jit, val);
   9.726  }
   9.727  
   9.728 -inline void IA32_Mov_Rm_Imm32_Disp_Reg(jitinfo_t *jit, 
   9.729 +inline void IA32_Mov_Rm_Imm32_Disp_Reg(JitWriter *jit, 
   9.730  								jit_uint8_t dest_base, 
   9.731  								jit_uint8_t dest_index, 
   9.732  								jit_uint8_t dest_scale, 
   9.733  								jit_int32_t val)
   9.734  {
   9.735 -	jit->wrfuncs.write_ubyte(jit, IA32_MOV_RM_IMM32);
   9.736 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
   9.737 -	jit->wrfuncs.write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.738 -	jit->wrfuncs.write_int32(jit, val);
   9.739 +	jit->write_ubyte(jit, IA32_MOV_RM_IMM32);
   9.740 +	jit->write_ubyte(jit, ia32_modrm(MOD_MEM_REG, 0, REG_SIB));
   9.741 +	jit->write_ubyte(jit, ia32_sib(dest_scale, dest_index, dest_base));
   9.742 +	jit->write_int32(jit, val);
   9.743  }
   9.744  
   9.745  /**
   9.746   * Branching/Jumping
   9.747   */
   9.748  
   9.749 -inline jitoffs_t IA32_Jump_Cond_Imm8(jitinfo_t *jit, jit_uint8_t cond, jit_int8_t disp)
   9.750 +inline jitoffs_t IA32_Jump_Cond_Imm8(JitWriter *jit, jit_uint8_t cond, jit_int8_t disp)
   9.751  {
   9.752  	jitoffs_t ptr;
   9.753 -	jit->wrfuncs.write_ubyte(jit, IA32_JCC_IMM+cond);
   9.754 -	ptr = (jit->outptr-jit->outbase);
   9.755 -	jit->wrfuncs.write_byte(jit, disp);
   9.756 +	jit->write_ubyte(jit, IA32_JCC_IMM+cond);
   9.757 +	ptr = jit->jit_curpos();
   9.758 +	jit->write_byte(jit, disp);
   9.759  	return ptr;
   9.760  }
   9.761  
   9.762 -inline jitoffs_t IA32_Jump_Imm32(jitinfo_t *jit, jit_int32_t disp)
   9.763 +inline jitoffs_t IA32_Jump_Imm32(JitWriter *jit, jit_int32_t disp)
   9.764  {
   9.765  	jitoffs_t ptr;
   9.766 -	jit->wrfuncs.write_ubyte(jit, IA32_JMP_IMM32);
   9.767 -	ptr = (jit->outptr-jit->outbase);
   9.768 -	jit->wrfuncs.write_int32(jit, disp);
   9.769 +	jit->write_ubyte(jit, IA32_JMP_IMM32);
   9.770 +	ptr = jit->jit_curpos();
   9.771 +	jit->write_int32(jit, disp);
   9.772  	return ptr;
   9.773  }
   9.774  
   9.775 -inline jitoffs_t IA32_Jump_Cond_Imm32(jitinfo_t *jit, jit_uint8_t cond, jit_int32_t disp)
   9.776 +inline jitoffs_t IA32_Jump_Cond_Imm32(JitWriter *jit, jit_uint8_t cond, jit_int32_t disp)
   9.777  {
   9.778  	jitoffs_t ptr;
   9.779 -	jit->wrfuncs.write_ubyte(jit, IA32_JCC_IMM32_1);
   9.780 -	jit->wrfuncs.write_ubyte(jit, IA32_JCC_IMM32_2+cond);
   9.781 -	ptr = (jit->outptr-jit->outbase);
   9.782 -	jit->wrfuncs.write_int32(jit, disp);
   9.783 +	jit->write_ubyte(jit, IA32_JCC_IMM32_1);
   9.784 +	jit->write_ubyte(jit, IA32_JCC_IMM32_2+cond);
   9.785 +	ptr = jit->jit_curpos();
   9.786 +	jit->write_int32(jit, disp);
   9.787  	return ptr;
   9.788  }
   9.789  
   9.790 -inline jitoffs_t IA32_Call_Imm32(jitinfo_t *jit, jit_int32_t disp)
   9.791 +inline jitoffs_t IA32_Call_Imm32(JitWriter *jit, jit_int32_t disp)
   9.792  {
   9.793  	jitoffs_t ptr;
   9.794 -	jit->wrfuncs.write_ubyte(jit, IA32_CALL_IMM32);
   9.795 -	ptr = (jit->outptr-jit->outbase);
   9.796 -	jit->wrfuncs.write_int32(jit, disp);
   9.797 +	jit->write_ubyte(jit, IA32_CALL_IMM32);
   9.798 +	ptr = jit->jit_curpos();
   9.799 +	jit->write_int32(jit, disp);
   9.800  	return ptr;
   9.801  }
   9.802  
   9.803 -inline void IA32_Write_Jump8(jitinfo_t *jit, jitoffs_t jmp, jitoffs_t target)
   9.804 +inline void IA32_Write_Jump8(JitWriter *jit, jitoffs_t jmp, jitoffs_t target)
   9.805  {
   9.806  	//save old ptr
   9.807  	jitcode_t oldptr = jit->outptr;
   9.808 @@ -679,92 +681,92 @@
   9.809  	jit_int8_t diff = (target - (jmp + 1));
   9.810  	//overwrite old value
   9.811  	jit->outptr = jit->outbase + jmp;
   9.812 -	jit->wrfuncs.write_byte(jit, diff);
   9.813 +	jit->write_byte(jit, diff);
   9.814  	//restore old ptr
   9.815  	jit->outptr = oldptr;
   9.816  }
   9.817  
   9.818 -inline void IA32_Send_Jump8_Here(jitinfo_t *jit, jitoffs_t jmp)
   9.819 +inline void IA32_Send_Jump8_Here(JitWriter *jit, jitoffs_t jmp)
   9.820  {
   9.821 -	jitoffs_t curptr = jit->wrfuncs.jit_curpos(jit);
   9.822 +	jitoffs_t curptr = jit->jit_curpos(jit);
   9.823  	IA32_Write_Jump8(jit, jmp, curptr);
   9.824  }
   9.825  
   9.826 -inline void IA32_Return(jitinfo_t *jit)
   9.827 +inline void IA32_Return(JitWriter *jit)
   9.828  {
   9.829 -	jit->wrfuncs.write_ubyte(jit, IA32_RET);
   9.830 +	jit->write_ubyte(jit, IA32_RET);
   9.831  }
   9.832  
   9.833 -inline void IA32_Test_Rm_Reg(jitinfo_t *jit, jit_uint8_t reg1, jit_uint8_t reg2, jit_uint8_t mode)
   9.834 +inline void IA32_Test_Rm_Reg(JitWriter *jit, jit_uint8_t reg1, jit_uint8_t reg2, jit_uint8_t mode)
   9.835  {
   9.836 -	jit->wrfuncs.write_ubyte(jit, IA32_TEST_RM_REG);
   9.837 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, reg2, reg1));
   9.838 +	jit->write_ubyte(jit, IA32_TEST_RM_REG);
   9.839 +	jit->write_ubyte(jit, ia32_modrm(mode, reg2, reg1));
   9.840  }
   9.841  
   9.842 -inline void IA32_Cmp_Rm_Reg(jitinfo_t *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.843 +inline void IA32_Cmp_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode)
   9.844  {
   9.845 -	jit->wrfuncs.write_ubyte(jit, IA32_CMP_RM_REG);
   9.846 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.847 +	jit->write_ubyte(jit, IA32_CMP_RM_REG);
   9.848 +	jit->write_ubyte(jit, ia32_modrm(mode, src, dest));
   9.849  }
   9.850  
   9.851 -inline void IA32_Cmp_Rm_Imm8(jitinfo_t *jit, jit_uint8_t mode, jit_uint8_t rm, jit_int8_t imm8)
   9.852 +inline void IA32_Cmp_Rm_Imm8(JitWriter *jit, jit_uint8_t mode, jit_uint8_t rm, jit_int8_t imm8)
   9.853  {
   9.854 -	jit->wrfuncs.write_ubyte(jit, IA32_CMP_RM_IMM8);
   9.855 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 7, rm));
   9.856 -	jit->wrfuncs.write_byte(jit, imm8);
   9.857 +	jit->write_ubyte(jit, IA32_CMP_RM_IMM8);
   9.858 +	jit->write_ubyte(jit, ia32_modrm(mode, 7, rm));
   9.859 +	jit->write_byte(jit, imm8);
   9.860  }
   9.861  
   9.862 -inline void IA32_Cmp_Rm_Imm32(jitinfo_t *jit, jit_uint8_t mode, jit_uint8_t rm, jit_int32_t imm32)
   9.863 +inline void IA32_Cmp_Rm_Imm32(JitWriter *jit, jit_uint8_t mode, jit_uint8_t rm, jit_int32_t imm32)
   9.864  {
   9.865 -	jit->wrfuncs.write_ubyte(jit, IA32_CMP_RM_IMM32);
   9.866 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(mode, 7, rm));
   9.867 -	jit->wrfuncs.write_int32(jit, imm32);
   9.868 +	jit->write_ubyte(jit, IA32_CMP_RM_IMM32);
   9.869 +	jit->write_ubyte(jit, ia32_modrm(mode, 7, rm));
   9.870 +	jit->write_int32(jit, imm32);
   9.871  }
   9.872  
   9.873 -inline void IA32_Cmp_Rm_Disp8_Imm8(jitinfo_t *jit, jit_uint8_t reg, jit_int8_t disp, jit_int8_t imm8)
   9.874 +inline void IA32_Cmp_Rm_Disp8_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t disp, jit_int8_t imm8)
   9.875  {
   9.876 -	jit->wrfuncs.write_ubyte(jit, IA32_CMP_RM_IMM8);
   9.877 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_DISP8, 7, reg));
   9.878 -	jit->wrfuncs.write_byte(jit, disp);
   9.879 -	jit->wrfuncs.write_byte(jit, imm8);
   9.880 +	jit->write_ubyte(jit, IA32_CMP_RM_IMM8);
   9.881 +	jit->write_ubyte(jit, ia32_modrm(MOD_DISP8, 7, reg));
   9.882 +	jit->write_byte(jit, disp);
   9.883 +	jit->write_byte(jit, imm8);
   9.884  }
   9.885  
   9.886 -inline void IA32_Cmp_Eax_Imm32(jitinfo_t *jit, jit_int32_t value)
   9.887 +inline void IA32_Cmp_Eax_Imm32(JitWriter *jit, jit_int32_t value)
   9.888  {
   9.889 -	jit->wrfuncs.write_ubyte(jit, IA32_CMP_EAX_IMM32);
   9.890 -	jit->wrfuncs.write_int32(jit, value);
   9.891 +	jit->write_ubyte(jit, IA32_CMP_EAX_IMM32);
   9.892 +	jit->write_int32(jit, value);
   9.893  }
   9.894  
   9.895 -inline void IA32_SetCC_Rm8(jitinfo_t *jit, jit_uint8_t reg, jit_uint8_t cond)
   9.896 +inline void IA32_SetCC_Rm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t cond)
   9.897  {
   9.898 -	jit->wrfuncs.write_ubyte(jit, IA32_SETCC_RM8_1);
   9.899 -	jit->wrfuncs.write_ubyte(jit, IA32_SETCC_RM8_2+cond);
   9.900 -	jit->wrfuncs.write_ubyte(jit, ia32_modrm(MOD_REG, 0, reg));
   9.901 +	jit->write_ubyte(jit, IA32_SETCC_RM8_1);
   9.902 +	jit->write_ubyte(jit, IA32_SETCC_RM8_2+cond);
   9.903 +	jit->write_ubyte(jit, ia32_modrm(MOD_REG, 0, reg));
   9.904  }
   9.905  
   9.906 -inline void IA32_Rep(jitinfo_t *jit)
   9.907 +inline void IA32_Rep(JitWriter *jit)
   9.908  {
   9.909 -	jit->wrfuncs.write_ubyte(jit, IA32_REP);
   9.910 +	jit->write_ubyte(jit, IA32_REP);
   9.911  }
   9.912  
   9.913 -inline void IA32_Movsd(jitinfo_t *jit)
   9.914 +inline void IA32_Movsd(JitWriter *jit)
   9.915  {
   9.916 -	jit->wrfuncs.write_ubyte(jit, IA32_MOVSD);
   9.917 +	jit->write_ubyte(jit, IA32_MOVSD);
   9.918  }
   9.919  
   9.920 -inline void IA32_Movsb(jitinfo_t *jit)
   9.921 +inline void IA32_Movsb(JitWriter *jit)
   9.922  {
   9.923 -	jit->wrfuncs.write_ubyte(jit, IA32_MOVSB);
   9.924 +	jit->write_ubyte(jit, IA32_MOVSB);
   9.925  }
   9.926  
   9.927 -inline void IA32_Stosd(jitinfo_t *jit)
   9.928 +inline void IA32_Stosd(JitWriter *jit)
   9.929  {
   9.930 -	jit->wrfuncs.write_ubyte(jit, IA32_STOSD);
   9.931 +	jit->write_ubyte(jit, IA32_STOSD);
   9.932  }
   9.933  
   9.934 -inline void IA32_Cld(jitinfo_t *jit)
   9.935 +inline void IA32_Cld(JitWriter *jit)
   9.936  {
   9.937 -	jit->wrfuncs.write_ubyte(jit, IA32_CLD);
   9.938 +	jit->write_ubyte(jit, IA32_CLD);
   9.939  }
   9.940  
   9.941  #endif //_INCLUDE_JIT_X86_MACROS_H