-branch, implemented "goto"

-branch, added a new jit opcode -- 165/op.stackadjust(1), stk = frm+n

--HG--
branch : sourcemod-1.1.0
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/branches/sourcemod-1.1.0%401937
This commit is contained in:
David Anderson 2008-03-13 17:08:05 +00:00
parent a64894bbe4
commit bb85c5eda2
6 changed files with 65 additions and 35 deletions

View File

@ -0,0 +1,28 @@
#include <sourcemod>
public OnPluginStart()
{
RegServerCmd("test_goto", Test_Goto);
}
public Action:Test_Goto(args)
{
new bool:hello = false;
new String:crab[] = "space crab";
sample_label:
new String:yam[] = "yams";
PrintToServer("%s %s", crab, yam);
if (!hello)
{
new bool:what = true;
hello = what
goto sample_label;
}
return Plugin_Handled;
}

View File

@ -854,19 +854,10 @@ SC_FUNC void modstk(int delta)
/* set the stack to a hard offset from the frame */
SC_FUNC void setstk(cell value)
{
stgwrite("\tlctrl 5\n"); /* get FRM in PRI */
stgwrite("\tstackadjust ");
assert(value<=0); /* STK should always become <= FRM */
if (value<0) {
stgwrite("\tadd.c ");
outval(value, TRUE); /* add (negative) offset */
code_idx+=opcodes(1)+opargs(1);
// ??? write zeros in the space between STK and the value in PRI (the new stk)
// get value of STK in ALT
// zero PRI
// need new FILL opcode that takes a variable size
} /* if */
stgwrite("\tsctrl 4\n"); /* store in STK */
code_idx+=opcodes(2)+opargs(2);
outval(value, TRUE); /* add (negative) offset */
code_idx+=opcodes(1)+opargs(1);
}
SC_FUNC void modheap(int delta)

View File

@ -596,6 +596,7 @@ static OPCODEC opcodelist[] = {
{ 21, "sref.s.pri", sIN_CSEG, parm1 },
{ 67, "sshr", sIN_CSEG, parm0 },
{ 44, "stack", sIN_CSEG, parm1 },
{165, "stackadjust",sIN_CSEG, parm1 },
{ 0, "stksize", 0, noop },
{ 16, "stor.alt", sIN_CSEG, parm1 },
{ 23, "stor.i", sIN_CSEG, parm0 },

View File

@ -1209,6 +1209,28 @@ inline void WriteOp_Stack(JitWriter *jit)
}
}
inline void WriteOp_StackAdjust(JitWriter *jit)
{
cell_t val = jit->read_cell();
assert(val <= 0);
//lea edi, [ebx-val]
if (val < SCHAR_MAX && val > SCHAR_MIN)
{
IA32_Lea_DispRegImm8(jit, AMX_REG_STK, AMX_REG_FRM, val);
}
else
{
IA32_Lea_DispRegImm32(jit, AMX_REG_STK, AMX_REG_FRM, val);
}
/* We assume the compiler has generated good code --
* That is, we do not bother validating this amount!
*/
}
inline void WriteOp_Heap(JitWriter *jit)
{
//mov edx, [esi+hea]
@ -3009,7 +3031,7 @@ unsigned int JITX86::FunctionCount(const sp_context_t *ctx)
const char *JITX86::GetVersionString()
{
return SVN_FULL_VERSION;
return SVN_FULL_VERSION "-goto";
}
const char *JITX86::GetCPUOptimizations()

View File

@ -124,8 +124,8 @@ typedef enum
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_PRI, //VERIFIED
OP_LREF_ALT, //~VERIFIED
OP_LREF_S_PRI, //VERIFIED
OP_LREF_S_ALT, //~VERIFIED (lref.s.pri)
OP_LOAD_I, //VERIFIED
@ -138,8 +138,8 @@ typedef enum
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_PRI, //VERIFIED
OP_SREF_ALT, //~VERIFIED
OP_SREF_S_PRI, //VERIFIED
OP_SREF_S_ALT, //~VERIFIED (stor.s.alt)
OP_STOR_I, //VERIFIED
@ -286,6 +286,7 @@ typedef enum
OP_GENARRAY, //VERIFIED
OP_GENARRAY_Z, //-VERIFIED (not tested for 1D arrays)
OP_STRADJUST_PRI, //VERIFIED
OP_STACKADJUST, //:TODO: VERIFY
OP_FABS, //VERIFIED
OP_FLOAT, //VERIFIED
OP_FLOATADD, //VERIFIED
@ -301,22 +302,4 @@ typedef enum
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 to 16BYTES all stuff that is called via CALL and frequently used jump labels like what's done with PROC.
*/
#endif //_INCLUDE_SOURCEPAWN_JIT_X86_OPCODE_INFO_H_

View File

@ -748,6 +748,11 @@
WriteOp_FloatCompare(jit);
break;
}
case OP_STACKADJUST:
{
WriteOp_StackAdjust(jit);
break;
}
#if defined USE_UNGEN_OPCODES
#include "ungen_opcode_switch.inc"
#endif