300 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
 * ================================================================
 | 
						|
 * SourcePawn (C)2004-2007 AlliedModders LLC.  All rights reserved.
 | 
						|
 * ================================================================
 | 
						|
 *
 | 
						|
 * This file is not open source and may not be copied without explicit
 | 
						|
 * written permission of AlliedModders LLC.  This file may not be redistributed 
 | 
						|
 * in whole or significant part.
 | 
						|
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
 | 
						|
 *
 | 
						|
 * Version: $Id$
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _INCLUDE_SOURCEPAWN_JIT_X86_OPCODE_INFO_H_
 | 
						|
#define _INCLUDE_SOURCEPAWN_JIT_X86_OPCODE_INFO_H_
 | 
						|
 | 
						|
#include "../jit_helpers.h"
 | 
						|
 | 
						|
/**
 | 
						|
 * This outputs the execution function for a plugin.
 | 
						|
 * It also returns the 'return' offset, which is used for 
 | 
						|
 * breaking out of the JIT during runtime.
 | 
						|
 */
 | 
						|
jitoffs_t Write_Execute_Function(JitWriter *jit);
 | 
						|
 | 
						|
/**
 | 
						|
 * Writes the Sysreq.* opcodes as a function call.
 | 
						|
 */
 | 
						|
void WriteOp_Sysreq_N_Function(JitWriter *jit);
 | 
						|
void WriteOp_Sysreq_C_Function(JitWriter *jit);
 | 
						|
 | 
						|
/**
 | 
						|
 * Write the GENARRAY intrinsic function.
 | 
						|
 */
 | 
						|
void WriteIntrinsic_GenArray(JitWriter *jit);
 | 
						|
 | 
						|
/**
 | 
						|
 * Generates code to set an error state in the VM and return.
 | 
						|
 * This is used for generating the error set points in the VM.
 | 
						|
 * GetError writes the error from the context. SetError hardcodes.
 | 
						|
 */
 | 
						|
void Write_GetError(JitWriter *jit);
 | 
						|
void Write_SetError(JitWriter *jit, int error);
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks the stacks for min and low errors.
 | 
						|
 * :TODO: Should a variation of this go in the pushN opcodes?
 | 
						|
 */
 | 
						|
void Write_CheckStack_Min(JitWriter *jit);
 | 
						|
void Write_CheckStack_Low(JitWriter *jit);
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks the heap for min and low errors.
 | 
						|
 */
 | 
						|
void Write_CheckHeap_Min(JitWriter *jit);
 | 
						|
void Write_CheckHeap_Low(JitWriter *jit);
 | 
						|
 | 
						|
/**
 | 
						|
 * Verifies an address by register.  The address must reside
 | 
						|
 * between DAT and HP and SP and STP.
 | 
						|
 */
 | 
						|
void Write_Check_VerifyAddr(JitWriter *jit, jit_uint8_t reg);
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks for division by zero.
 | 
						|
 */
 | 
						|
void Write_Check_DivZero(JitWriter *jit, jit_uint8_t reg);
 | 
						|
 | 
						|
/**
 | 
						|
 * Writes the break debug function.
 | 
						|
 */
 | 
						|
void Write_BreakDebug(JitWriter *jit);
 | 
						|
 | 
						|
/** 
 | 
						|
 * These are for writing the PushN opcodes.
 | 
						|
 */
 | 
						|
void Macro_PushN_Addr(JitWriter *jit, int i);
 | 
						|
void Macro_PushN_S(JitWriter *jit, int i);
 | 
						|
void Macro_PushN_C(JitWriter *jit, int i);
 | 
						|
void Macro_PushN(JitWriter *jit, int i);
 | 
						|
 | 
						|
/** 
 | 
						|
* Bound checking for the tracker stack,
 | 
						|
*/
 | 
						|
int JIT_VerifyLowBoundTracker(sp_context_t *ctx);
 | 
						|
int JIT_VerifyOrAllocateTracker(sp_context_t *ctx);
 | 
						|
 | 
						|
/** 
 | 
						|
* Writes the push into tracker function.
 | 
						|
*/
 | 
						|
void WriteOp_Tracker_Push_Reg(JitWriter *jit, uint8_t reg);
 | 
						|
 | 
						|
/**
 | 
						|
 * Legend for Statuses:
 | 
						|
 * ****** *** ********
 | 
						|
 * DONE       -> code generation is done
 | 
						|
 * !GEN       -> code generation is deliberate skipped because:
 | 
						|
 *                 (default): compiler does not generate
 | 
						|
 *                DEPRECATED: this feature no longer exists/supported
 | 
						|
 *               UNSUPPORTED: this opcode is not supported
 | 
						|
 *                      TODO: done in case needed
 | 
						|
 * VERIFIED   -> code generation is checked as run-time working.  prefixes:
 | 
						|
 *                ! errors are not checked yet.
 | 
						|
 *                - non-inline errors are not checked yet.
 | 
						|
 *                ~ assumed checked because of related variation, but not actually checked
 | 
						|
 */
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
	OP_NONE,              /* invalid opcode */
 | 
						|
	OP_LOAD_PRI,			//!VERIFIED
 | 
						|
	OP_LOAD_ALT,			//~!VERIFIED (load.pri)
 | 
						|
	OP_LOAD_S_PRI,			//VERIFIED
 | 
						|
	OP_LOAD_S_ALT,			//VERIFIED
 | 
						|
	OP_LREF_PRI,			// !GEN :TODO: we will need this for dynarrays
 | 
						|
	OP_LREF_ALT,			// !GEN :TODO: we will need this for dynarrays
 | 
						|
	OP_LREF_S_PRI,			//VERIFIED
 | 
						|
	OP_LREF_S_ALT,			//~VERIFIED (lref.s.pri)
 | 
						|
	OP_LOAD_I,				//VERIFIED
 | 
						|
	OP_LODB_I,				//VERIFIED
 | 
						|
	OP_CONST_PRI,			//VERIFIED
 | 
						|
	OP_CONST_ALT,			//~VERIFIED (const.pri)
 | 
						|
	OP_ADDR_PRI,			//VERIFIED
 | 
						|
	OP_ADDR_ALT,			//VERIFIED
 | 
						|
	OP_STOR_PRI,			//VERIFIED
 | 
						|
	OP_STOR_ALT,			//~VERIFIED (stor.pri)
 | 
						|
	OP_STOR_S_PRI,			//VERIFIED
 | 
						|
	OP_STOR_S_ALT,			//~VERIFIED (stor.s.pri)
 | 
						|
	OP_SREF_PRI,			// !GEN :TODO: we will need this for dynarrays
 | 
						|
	OP_SREF_ALT,			// !GEN :TODO: we will need this for dynarrays
 | 
						|
	OP_SREF_S_PRI,			//VERIFIED
 | 
						|
	OP_SREF_S_ALT,			//~VERIFIED (stor.s.alt)
 | 
						|
	OP_STOR_I,				//VERIFIED
 | 
						|
	OP_STRB_I,				//VERIFIED
 | 
						|
	OP_LIDX,				//VERIFIED
 | 
						|
	OP_LIDX_B,				//DONE
 | 
						|
	OP_IDXADDR,				//VERIFIED
 | 
						|
	OP_IDXADDR_B,			//DONE
 | 
						|
	OP_ALIGN_PRI,			// !GEN :TODO: - only used for pack access, drop support in compiler first
 | 
						|
	OP_ALIGN_ALT,			// !GEN :TODO: - only used for pack access, drop support in compiler first
 | 
						|
	OP_LCTRL,				// !GEN
 | 
						|
	OP_SCTRL,				// !GEN
 | 
						|
	OP_MOVE_PRI,			//~VERIFIED (move.alt)
 | 
						|
	OP_MOVE_ALT,			//VERIFIED
 | 
						|
	OP_XCHG,				//DONE
 | 
						|
	OP_PUSH_PRI,			//DONE
 | 
						|
	OP_PUSH_ALT,			//DONE
 | 
						|
	OP_PUSH_R,				// !GEN DEPRECATED
 | 
						|
	OP_PUSH_C,				//VERIFIED
 | 
						|
	OP_PUSH,				//DONE
 | 
						|
	OP_PUSH_S,				//VERIFIED
 | 
						|
	OP_POP_PRI,				//VERIFIED
 | 
						|
	OP_POP_ALT,				//VERIFIED
 | 
						|
	OP_STACK,				//VERIFIED
 | 
						|
	OP_HEAP,				//VERIFIED
 | 
						|
	OP_PROC,				//VERIFIED
 | 
						|
	OP_RET,					// !GEN
 | 
						|
	OP_RETN,				//VERIFIED
 | 
						|
	OP_CALL,				//VERIFIED
 | 
						|
	OP_CALL_PRI,			// !GEN
 | 
						|
	OP_JUMP,				//VERIFIED
 | 
						|
	OP_JREL,				// !GEN
 | 
						|
	OP_JZER,				//VERIFIED
 | 
						|
	OP_JNZ,					//DONE
 | 
						|
	OP_JEQ,					//VERIFIED
 | 
						|
	OP_JNEQ,				//VERIFIED
 | 
						|
	OP_JLESS,				// !GEN
 | 
						|
	OP_JLEQ,				// !GEN
 | 
						|
	OP_JGRTR,				// !GEN
 | 
						|
	OP_JGEQ,				// !GEN
 | 
						|
	OP_JSLESS,				//VERIFIED
 | 
						|
	OP_JSLEQ,				//VERIFIED
 | 
						|
	OP_JSGRTR,				//VERIFIED
 | 
						|
	OP_JSGEQ,				//VERIFIED
 | 
						|
	OP_SHL,					//VERIFIED
 | 
						|
	OP_SHR,					//VERIFIED (Note: operator >>>)
 | 
						|
	OP_SSHR,				//VERIFIED (Note: operator >>)
 | 
						|
	OP_SHL_C_PRI,			//DONE
 | 
						|
	OP_SHL_C_ALT,			//DONE
 | 
						|
	OP_SHR_C_PRI,			//DONE
 | 
						|
	OP_SHR_C_ALT,			//DONE
 | 
						|
	OP_SMUL,				//VERIFIED
 | 
						|
	OP_SDIV,				//DONE
 | 
						|
	OP_SDIV_ALT,			//VERIFIED
 | 
						|
	OP_UMUL,				// !GEN
 | 
						|
	OP_UDIV,				// !GEN
 | 
						|
	OP_UDIV_ALT,			// !GEN
 | 
						|
	OP_ADD,					//VERIFIED
 | 
						|
	OP_SUB,					//DONE
 | 
						|
	OP_SUB_ALT,				//VERIFIED
 | 
						|
	OP_AND,					//VERIFIED
 | 
						|
	OP_OR,					//VERIFIED
 | 
						|
	OP_XOR,					//VERIFIED
 | 
						|
	OP_NOT,					//VERIFIED
 | 
						|
	OP_NEG,					//VERIFIED
 | 
						|
	OP_INVERT,				//VERIFIED
 | 
						|
	OP_ADD_C,				//VERIFIED
 | 
						|
	OP_SMUL_C,				//VERIFIED
 | 
						|
	OP_ZERO_PRI,			//VERIFIED
 | 
						|
	OP_ZERO_ALT,			//~VERIFIED
 | 
						|
	OP_ZERO,				//VERIFIED
 | 
						|
	OP_ZERO_S,				//VERIFIED
 | 
						|
	OP_SIGN_PRI,			//DONE
 | 
						|
	OP_SIGN_ALT,			//DONE
 | 
						|
	OP_EQ,					//VERIFIED
 | 
						|
	OP_NEQ,					//VERIFIED
 | 
						|
	OP_LESS,				// !GEN
 | 
						|
	OP_LEQ,					// !GEN
 | 
						|
	OP_GRTR,				// !GEN
 | 
						|
	OP_GEQ,					// !GEN
 | 
						|
	OP_SLESS,				//VERIFIED
 | 
						|
	OP_SLEQ,				//VERIFIED
 | 
						|
	OP_SGRTR,				//VERIFIED
 | 
						|
	OP_SGEQ,				//VERIFIED
 | 
						|
	OP_EQ_C_PRI,			//DONE
 | 
						|
	OP_EQ_C_ALT,			//DONE
 | 
						|
	OP_INC_PRI,				//VERIFIED
 | 
						|
	OP_INC_ALT,				//~VERIFIED (inc.pri)
 | 
						|
	OP_INC,					//VERIFIED
 | 
						|
	OP_INC_S,				//VERIFIED
 | 
						|
	OP_INC_I,				//VERIFIED
 | 
						|
	OP_DEC_PRI,				//VERIFIED
 | 
						|
	OP_DEC_ALT,				//~VERIFIED (dec.pri)
 | 
						|
	OP_DEC,					//VERIFIED
 | 
						|
	OP_DEC_S,				//VERIFIED
 | 
						|
	OP_DEC_I,				//VERIFIED
 | 
						|
	OP_MOVS,				//VERIFIED
 | 
						|
	OP_CMPS,				// !GEN
 | 
						|
	OP_FILL,				//VERIFIED
 | 
						|
	OP_HALT,				//DONE
 | 
						|
	OP_BOUNDS,				//VERIFIED
 | 
						|
	OP_SYSREQ_PRI,			// !GEN
 | 
						|
	OP_SYSREQ_C,			//VERIFIED
 | 
						|
	OP_FILE,				// !GEN DEPRECATED
 | 
						|
	OP_LINE,				// !GEN DEPRECATED
 | 
						|
	OP_SYMBOL,				// !GEN DEPRECATED
 | 
						|
	OP_SRANGE,				// !GEN DEPRECATED
 | 
						|
	OP_JUMP_PRI,			// !GEN
 | 
						|
	OP_SWITCH,				//VERIFIED
 | 
						|
	OP_CASETBL,				//VERIFIED
 | 
						|
	OP_SWAP_PRI,			//VERIFIED
 | 
						|
	OP_SWAP_ALT,			//~VERIFIED (swap.alt)
 | 
						|
	OP_PUSH_ADR,			//VERIFIED
 | 
						|
	OP_NOP,					//VERIFIED (lol)
 | 
						|
	OP_SYSREQ_N,			//VERIFIED
 | 
						|
	OP_SYMTAG,				// !GEN DEPRECATED
 | 
						|
	OP_BREAK,				//DONE
 | 
						|
	OP_PUSH2_C,				//~VERIFIED (push3.c)
 | 
						|
	OP_PUSH2,				//VERIFIED
 | 
						|
	OP_PUSH2_S,				//VERIFIED
 | 
						|
	OP_PUSH2_ADR,			//VERIFIED
 | 
						|
	OP_PUSH3_C,				//VERIFIED
 | 
						|
	OP_PUSH3,				//~VERIFIED (push2)
 | 
						|
	OP_PUSH3_S,				//~VERIFIED (push2.s)
 | 
						|
	OP_PUSH3_ADR,			//~VERIFIED (push2.adr)
 | 
						|
	OP_PUSH4_C,				//~VERIFIED (push3.c)
 | 
						|
	OP_PUSH4,				//~VERIFIED (push2)
 | 
						|
	OP_PUSH4_S,				//~VERIFIED (push2.s)
 | 
						|
	OP_PUSH4_ADR,			//~VERIFIED (push2.adr)
 | 
						|
	OP_PUSH5_C,				//~VERIFIED (push3.c)
 | 
						|
	OP_PUSH5,				//~VERIFIED (push2)
 | 
						|
	OP_PUSH5_S,				//~VERIFIED (push2.s)
 | 
						|
	OP_PUSH5_ADR,			//~VERIFIED (push2.adr)
 | 
						|
	OP_LOAD_BOTH,			//VERIFIED
 | 
						|
	OP_LOAD_S_BOTH,			//VERIFIED
 | 
						|
	OP_CONST,				//VERIFIED
 | 
						|
	OP_CONST_S,				//DONE
 | 
						|
	/* ----- */
 | 
						|
	OP_SYSREQ_D,			// !GEN UNSUPPORT
 | 
						|
	OP_SYSREQ_ND,			// !GEN UNSUPPORT
 | 
						|
	/* ----- */
 | 
						|
	OP_TRACKER_PUSH_C,		//DONE
 | 
						|
	OP_TRACKER_POP_SETHEAP,	//VERIFIED
 | 
						|
	OP_GENARRAY,			//VERIFIED
 | 
						|
	OP_GENARRAY_Z,			//-VERIFIED (not tested for 1D arrays)
 | 
						|
	OP_STRADJUST_PRI,		//VERIFIED
 | 
						|
	/* ----- */
 | 
						|
	OP_NUM_OPCODES
 | 
						|
} OPCODE;
 | 
						|
 | 
						|
/*
 | 
						|
* :TODO: List of ASM Opts
 | 
						|
*	from jit_x86.cpp 
 | 
						|
*       DONE: Rest of opcodes including the SYSREQ.N inlined version (rev2)
 | 
						|
*			  Including genarray and the 2 tracker ones
 | 
						|
*       DONE: ALL ungen opcodes (rev1)
 | 
						|
*	from opcode_helpers.cpp
 | 
						|
*       DONE: SYSREQ.N .C (rev2)
 | 
						|
*			  MACRO OPCODES (rev2)
 | 
						|
*             ERROR CHECKS\{VERIFY ADDR} (rev2)
 | 
						|
*			  ARRAY STUFF
 | 
						|
*		TODO: BrkDebug
 | 
						|
*			  EXEC FUNCTION
 | 
						|
*			  VERIFY ADDR
 | 
						|
*
 | 
						|
*	Oh and ALIGN all stuff that is called via CALL like what's done with PROC.
 | 
						|
*/
 | 
						|
 | 
						|
#endif //_INCLUDE_SOURCEPAWN_JIT_X86_OPCODE_INFO_H_
 |