renamed jump_xxxward_if_xxx to jumpop_xxxward_if_xxx because it does pop the stack top.

added jump_forward_if_true, jump_forward_if_fase, jump2_forward_if_true, jump2_forward_if_false to use with the and and or logical operation keywords
This commit is contained in:
hyunghwan.chung
2018-05-30 15:32:09 +00:00
parent 8965720926
commit e074607a00
11 changed files with 252 additions and 201 deletions

View File

@ -2250,8 +2250,8 @@ static int emit_single_param_instruction (moo_t* moo, int cmd, moo_oow_t param_1
case BCODE_JUMP_FORWARD_0:
case BCODE_JUMP_BACKWARD_0:
case BCODE_JUMP_BACKWARD_IF_FALSE_0:
case BCODE_JUMP_BACKWARD_IF_TRUE_0:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_0:
case BCODE_JUMPOP_BACKWARD_IF_TRUE_0:
if (param_1 < 4)
{
/* low 2 bits to hold the parameter */
@ -2271,11 +2271,13 @@ static int emit_single_param_instruction (moo_t* moo, int cmd, moo_oow_t param_1
}
case BCODE_JUMP_BACKWARD_X:
case BCODE_JUMP_BACKWARD_IF_FALSE_X:
case BCODE_JUMP_BACKWARD_IF_TRUE_X:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_X:
case BCODE_JUMPOP_BACKWARD_IF_TRUE_X:
case BCODE_JUMP_FORWARD_X:
case BCODE_JUMP_FORWARD_IF_FALSE:
case BCODE_JUMP_FORWARD_IF_TRUE:
case BCODE_JUMP_FORWARD_IF_FALSE:
case BCODE_JUMPOP_FORWARD_IF_FALSE:
case BCODE_JUMPOP_FORWARD_IF_TRUE:
if (param_1 > MAX_CODE_JUMP)
{
cmd = cmd + 1; /* convert to a JUMP2 instruction */
@ -2283,11 +2285,13 @@ static int emit_single_param_instruction (moo_t* moo, int cmd, moo_oow_t param_1
}
/* fall thru */
case BCODE_JUMP2_FORWARD:
case BCODE_JUMP2_BACKWARD:
case BCODE_JUMP2_BACKWARD_IF_FALSE:
case BCODE_JUMP2_BACKWARD_IF_TRUE:
case BCODE_JUMP2_FORWARD_IF_FALSE:
case BCODE_JUMP2_FORWARD_IF_TRUE:
case BCODE_JUMP2_FORWARD_IF_FALSE:
case BCODE_JUMP2_BACKWARD:
case BCODE_JUMPOP2_BACKWARD_IF_FALSE:
case BCODE_JUMPOP2_BACKWARD_IF_TRUE:
case BCODE_JUMPOP2_FORWARD_IF_FALSE:
case BCODE_JUMPOP2_FORWARD_IF_TRUE:
case BCODE_PUSH_INTLIT:
case BCODE_PUSH_NEGINTLIT:
case BCODE_PUSH_CHARLIT:
@ -2441,8 +2445,8 @@ static MOO_INLINE int emit_backward_jump_instruction (moo_t* moo, int cmd, moo_o
moo_oow_t adj;
MOO_ASSERT (moo, cmd == BCODE_JUMP_BACKWARD_0 ||
cmd == BCODE_JUMP_BACKWARD_IF_FALSE_0 ||
cmd == BCODE_JUMP_BACKWARD_IF_TRUE_0);
cmd == BCODE_JUMPOP_BACKWARD_IF_FALSE_0 ||
cmd == BCODE_JUMPOP_BACKWARD_IF_TRUE_0);
/* the short BCODE_JUMP_BACKWARD instructions use low 2 bits to encode
* the jump offset. so it can encode 0, 1, 2, 3. the instruction itself
@ -2475,7 +2479,9 @@ static int patch_long_forward_jump_instruction (moo_t* moo, moo_oow_t jip, moo_o
MOO_ASSERT (moo, moo->c->mth.code.ptr[jip] == BCODE_JUMP_FORWARD_X ||
moo->c->mth.code.ptr[jip] == BCODE_JUMP_FORWARD_IF_FALSE ||
moo->c->mth.code.ptr[jip] == BCODE_JUMP_FORWARD_IF_TRUE);
moo->c->mth.code.ptr[jip] == BCODE_JUMP_FORWARD_IF_TRUE ||
moo->c->mth.code.ptr[jip] == BCODE_JUMPOP_FORWARD_IF_FALSE ||
moo->c->mth.code.ptr[jip] == BCODE_JUMPOP_FORWARD_IF_TRUE);
if (code_size > MAX_CODE_JUMP)
{
@ -5534,23 +5540,16 @@ start_over:
}
#endif
if (TOKEN_TYPE(moo) == MOO_IOTOK_AND)
if (TOKEN_TYPE(moo) == MOO_IOTOK_AND || TOKEN_TYPE(moo) == MOO_IOTOK_OR)
{
int bcode;
bcode = (TOKEN_TYPE(moo) == MOO_IOTOK_AND)? BCODE_JUMP_FORWARD_IF_FALSE: BCODE_JUMP_FORWARD_IF_TRUE;
/* TODO: optimization if the expression is a known constant that can be determined to be boolean */
if (add_to_oow_pool(moo, &jumptoend, moo->c->mth.code.len) <= -1 ||
emit_single_param_instruction(moo, BCODE_JUMP_FORWARD_IF_FALSE, MAX_CODE_JUMP) <= -1 ||
emit_byte_instruction(moo, BCODE_POP_STACKTOP) <= -1) goto oops;
emit_single_param_instruction(moo, bcode, MAX_CODE_JUMP) <= -1) goto oops;
GET_TOKEN (moo);
goto start_over;
}
else if (TOKEN_TYPE(moo) == MOO_IOTOK_OR)
{
if (add_to_oow_pool(moo, &jumptoend, moo->c->mth.code.len) <= -1 ||
emit_single_param_instruction(moo, BCODE_JUMP_FORWARD_IF_TRUE, MAX_CODE_JUMP) <= -1 ||
emit_byte_instruction(moo, BCODE_POP_STACKTOP) <= -1) goto oops;
GET_TOKEN (moo);
goto start_over;
}
/* patch instructions that jumps to the end of if expression */
for (jumptoend_chunk = jumptoend.head, i = 0; jumptoend_chunk; jumptoend_chunk = jumptoend_chunk->next)
@ -5694,11 +5693,11 @@ static int compile_if_expression (moo_t* moo)
}
else
{
/* remember position of the jump_forward_if_false instruction to be generated */
/* remember position of the jumpop_forward_if_false instruction to be generated */
jumptonext = moo->c->mth.code.len;
/* BCODE_JUMP_FORWARD_IF_FALSE is always a long jump instruction.
/* BCODE_JUMPOP_FORWARD_IF_FALSE is always a long jump instruction.
* just specify MAX_CODE_JUMP for consistency with short jump variants */
if (emit_single_param_instruction (moo, BCODE_JUMP_FORWARD_IF_FALSE, MAX_CODE_JUMP) <= -1) goto oops;
if (emit_single_param_instruction (moo, BCODE_JUMPOP_FORWARD_IF_FALSE, MAX_CODE_JUMP) <= -1) goto oops;
}
GET_TOKEN (moo); /* get { */
@ -5827,9 +5826,9 @@ static int compile_while_expression (moo_t* moo) /* or compile_until_expression
if (cond_style != 1)
{
/* BCODE_JUMP_FORWARD_IF_FALSE is always a long jump instruction.
/* BCODE_JUMPOP_FORWARD_IF_FALSE is always a long jump instruction.
* just specify MAX_CODE_JUMP for consistency with short jump variants */
if (emit_single_param_instruction (moo, (is_until_loop? BCODE_JUMP_FORWARD_IF_TRUE: BCODE_JUMP_FORWARD_IF_FALSE), MAX_CODE_JUMP) <= -1) goto oops;
if (emit_single_param_instruction (moo, (is_until_loop? BCODE_JUMPOP_FORWARD_IF_TRUE: BCODE_JUMPOP_FORWARD_IF_FALSE), MAX_CODE_JUMP) <= -1) goto oops;
}
/* remember information about this while loop. */
@ -5954,7 +5953,7 @@ static int compile_do_while_expression (moo_t* moo)
if (compile_conditional (moo) <= -1) goto oops;
postcondpos = moo->c->mth.code.len;
jbinst = (is_until_loop? BCODE_JUMP_BACKWARD_IF_FALSE_0: BCODE_JUMP_BACKWARD_IF_TRUE_0);
jbinst = (is_until_loop? BCODE_JUMPOP_BACKWARD_IF_FALSE_0: BCODE_JUMPOP_BACKWARD_IF_TRUE_0);
if (precondpos + 1 == postcondpos)
{
/* simple optimization -

View File

@ -264,41 +264,6 @@ int moo_decode (moo_t* moo, moo_oop_method_t mth, const moo_oocs_t* classfqn)
LOG_INST_1 (moo, "jump_backward %zu", (moo_oow_t)(bcode & 0x3)); /* low 2 bits */
break;
case BCODE_JUMP_BACKWARD_IF_FALSE_X:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump_backward_if_false %zu", b1);
break;
case BCODE_JUMP_BACKWARD_IF_FALSE_0:
case BCODE_JUMP_BACKWARD_IF_FALSE_1:
case BCODE_JUMP_BACKWARD_IF_FALSE_2:
case BCODE_JUMP_BACKWARD_IF_FALSE_3:
LOG_INST_1 (moo, "jump_backward_if_false %zu", (moo_oow_t)(bcode & 0x3)); /* low 2 bits */
break;
case BCODE_JUMP_BACKWARD_IF_TRUE_X:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump_backward_if_true %zu", b1);
break;
case BCODE_JUMP_BACKWARD_IF_TRUE_0:
case BCODE_JUMP_BACKWARD_IF_TRUE_1:
case BCODE_JUMP_BACKWARD_IF_TRUE_2:
case BCODE_JUMP_BACKWARD_IF_TRUE_3:
LOG_INST_1 (moo, "jump_backward_if_true %zu", (moo_oow_t)(bcode & 0x3)); /* low 2 bits */
break;
case BCODE_JUMP_FORWARD_IF_FALSE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump_forward_if_false %zu", b1);
break;
case BCODE_JUMP_FORWARD_IF_TRUE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump_forward_if_true %zu", b1);
break;
case BCODE_JUMP2_FORWARD:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump2_forward %zu", b1);
@ -309,19 +274,73 @@ int moo_decode (moo_t* moo, moo_oop_method_t mth, const moo_oocs_t* classfqn)
LOG_INST_1 (moo, "jump2_backward %zu", b1);
break;
case BCODE_JUMP_FORWARD_IF_TRUE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump_forward_if_true %zu", b1);
break;
case BCODE_JUMP_FORWARD_IF_FALSE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump_forward_if_false %zu", b1);
break;
case BCODE_JUMP2_FORWARD_IF_TRUE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump2_forward_if_true %zu", b1);
break;
case BCODE_JUMP2_FORWARD_IF_FALSE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump2_forward_if_false %zu", b1);
break;
case BCODE_JUMP2_BACKWARD_IF_FALSE:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_X:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump2_backward_if_false %zu", b1);
LOG_INST_1 (moo, "jumpop_backward_if_false %zu", b1);
break;
case BCODE_JUMP2_BACKWARD_IF_TRUE:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_0:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_1:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_2:
case BCODE_JUMPOP_BACKWARD_IF_FALSE_3:
LOG_INST_1 (moo, "jumpop_backward_if_false %zu", (moo_oow_t)(bcode & 0x3)); /* low 2 bits */
break;
case BCODE_JUMPOP_BACKWARD_IF_TRUE_X:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jump2_backward_if_true %zu", b1);
LOG_INST_1 (moo, "jumpop_backward_if_true %zu", b1);
break;
case BCODE_JUMPOP_BACKWARD_IF_TRUE_0:
case BCODE_JUMPOP_BACKWARD_IF_TRUE_1:
case BCODE_JUMPOP_BACKWARD_IF_TRUE_2:
case BCODE_JUMPOP_BACKWARD_IF_TRUE_3:
LOG_INST_1 (moo, "jumpop_backward_if_true %zu", (moo_oow_t)(bcode & 0x3)); /* low 2 bits */
break;
case BCODE_JUMPOP_FORWARD_IF_FALSE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jumpop_forward_if_false %zu", b1);
break;
case BCODE_JUMPOP_FORWARD_IF_TRUE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jumpop_forward_if_true %zu", b1);
break;
case BCODE_JUMPOP2_FORWARD_IF_FALSE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jumpop2_forward_if_false %zu", b1);
break;
case BCODE_JUMPOP2_BACKWARD_IF_FALSE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jumpop2_backward_if_false %zu", b1);
break;
case BCODE_JUMPOP2_BACKWARD_IF_TRUE:
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST_1 (moo, "jumpop2_backward_if_true %zu", b1);
break;
/* -------------------------------------------------------- */

View File

@ -4939,55 +4939,6 @@ static int __execute (moo_t* moo)
moo->ip -= (bcode & 0x3); /* low 2 bits */
NEXT_INST();
ON_INST(BCODE_JUMP_BACKWARD_IF_FALSE_X)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump_backward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip -= b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP_BACKWARD_IF_FALSE_0)
ON_INST(BCODE_JUMP_BACKWARD_IF_FALSE_1)
ON_INST(BCODE_JUMP_BACKWARD_IF_FALSE_2)
ON_INST(BCODE_JUMP_BACKWARD_IF_FALSE_3)
LOG_INST1 (moo, "jump_backward_if_false %zu", (moo_oow_t)(bcode & 0x3));
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip -= (bcode & 0x3); /* low 2 bits */
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP_BACKWARD_IF_TRUE_X)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump_backward_if_true %zu", b1);
/*if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip -= b1;*/
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip -= b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP_BACKWARD_IF_TRUE_0)
ON_INST(BCODE_JUMP_BACKWARD_IF_TRUE_1)
ON_INST(BCODE_JUMP_BACKWARD_IF_TRUE_2)
ON_INST(BCODE_JUMP_BACKWARD_IF_TRUE_3)
LOG_INST1 (moo, "jump_backward_if_true %zu", (moo_oow_t)(bcode & 0x3));
/*if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip -= (bcode & 0x3);*/ /* low 2 bits */
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip -= (bcode & 0x3);
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP_FORWARD_IF_FALSE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump_forward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip += b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP_FORWARD_IF_TRUE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump_forward_if_true %zu", b1);
/*if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip += b1;*/
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip += b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP2_FORWARD)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump2_forward %zu", b1);
@ -5000,31 +4951,103 @@ static int __execute (moo_t* moo)
moo->ip -= MAX_CODE_JUMP + b1;
NEXT_INST();
ON_INST(BCODE_JUMP2_FORWARD_IF_FALSE)
ON_INST(BCODE_JUMP_FORWARD_IF_TRUE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump2_forward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip += MAX_CODE_JUMP + b1;
MOO_STACK_POP (moo);
LOG_INST1 (moo, "jump_forward_if_true %zu", b1);
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip += b1;
NEXT_INST();
ON_INST(BCODE_JUMP_FORWARD_IF_FALSE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump_forward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip += b1;
NEXT_INST();
ON_INST(BCODE_JUMP2_FORWARD_IF_TRUE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump2_forward_if_true %zu", b1);
/*if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip += MAX_CODE_JUMP + b1;*/
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip += MAX_CODE_JUMP + b1;
NEXT_INST();
ON_INST(BCODE_JUMP2_FORWARD_IF_FALSE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump2_forward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip += MAX_CODE_JUMP + b1;
NEXT_INST();
ON_INST(BCODE_JUMPOP_BACKWARD_IF_FALSE_X)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jumpop_backward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip -= b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP_BACKWARD_IF_FALSE_0)
ON_INST(BCODE_JUMPOP_BACKWARD_IF_FALSE_1)
ON_INST(BCODE_JUMPOP_BACKWARD_IF_FALSE_2)
ON_INST(BCODE_JUMPOP_BACKWARD_IF_FALSE_3)
LOG_INST1 (moo, "jumpop_backward_if_false %zu", (moo_oow_t)(bcode & 0x3));
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip -= (bcode & 0x3); /* low 2 bits */
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP_BACKWARD_IF_TRUE_X)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jumpop_backward_if_true %zu", b1);
/*if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip -= b1;*/
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip -= b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP_BACKWARD_IF_TRUE_0)
ON_INST(BCODE_JUMPOP_BACKWARD_IF_TRUE_1)
ON_INST(BCODE_JUMPOP_BACKWARD_IF_TRUE_2)
ON_INST(BCODE_JUMPOP_BACKWARD_IF_TRUE_3)
LOG_INST1 (moo, "jumpop_backward_if_true %zu", (moo_oow_t)(bcode & 0x3));
/*if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip -= (bcode & 0x3);*/ /* low 2 bits */
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip -= (bcode & 0x3);
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP_FORWARD_IF_FALSE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jumpop_forward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip += b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP_FORWARD_IF_TRUE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jumpop_forward_if_true %zu", b1);
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip += b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP2_FORWARD_IF_FALSE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jumpop2_forward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip += MAX_CODE_JUMP + b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMPOP2_FORWARD_IF_TRUE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jumpop2_forward_if_true %zu", b1);
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip += MAX_CODE_JUMP + b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP2_BACKWARD_IF_FALSE)
ON_INST(BCODE_JUMPOP2_BACKWARD_IF_FALSE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump2_backward_if_false %zu", b1);
LOG_INST1 (moo, "jumpop2_backward_if_false %zu", b1);
if (MOO_STACK_GETTOP(moo) == moo->_false) moo->ip -= MAX_CODE_JUMP + b1;
MOO_STACK_POP (moo);
NEXT_INST();
ON_INST(BCODE_JUMP2_BACKWARD_IF_TRUE)
ON_INST(BCODE_JUMPOP2_BACKWARD_IF_TRUE)
FETCH_PARAM_CODE_TO (moo, b1);
LOG_INST1 (moo, "jump2_backward_if_true %zu", b1);
LOG_INST1 (moo, "jumpop2_backward_if_true %zu", b1);
/* if (MOO_STACK_GETTOP(moo) == moo->_true) moo->ip -= MAX_CODE_JUMP + b1; */
if (MOO_STACK_GETTOP(moo) != moo->_false) moo->ip -= MAX_CODE_JUMP + b1;
MOO_STACK_POP (moo);

View File

@ -76,14 +76,14 @@
/* 73 */ &&case_BCODE_JUMP_BACKWARD_1,
/* 74 */ &&case_BCODE_JUMP_BACKWARD_2,
/* 75 */ &&case_BCODE_JUMP_BACKWARD_3,
/* 76 */ &&case_BCODE_JUMP_BACKWARD_IF_FALSE_0,
/* 77 */ &&case_BCODE_JUMP_BACKWARD_IF_FALSE_1,
/* 78 */ &&case_BCODE_JUMP_BACKWARD_IF_FALSE_2,
/* 79 */ &&case_BCODE_JUMP_BACKWARD_IF_FALSE_3,
/* 80 */ &&case_BCODE_JUMP_BACKWARD_IF_TRUE_0,
/* 81 */ &&case_BCODE_JUMP_BACKWARD_IF_TRUE_1,
/* 82 */ &&case_BCODE_JUMP_BACKWARD_IF_TRUE_2,
/* 83 */ &&case_BCODE_JUMP_BACKWARD_IF_TRUE_3,
/* 76 */ &&case_BCODE_JUMPOP_BACKWARD_IF_FALSE_0,
/* 77 */ &&case_BCODE_JUMPOP_BACKWARD_IF_FALSE_1,
/* 78 */ &&case_BCODE_JUMPOP_BACKWARD_IF_FALSE_2,
/* 79 */ &&case_BCODE_JUMPOP_BACKWARD_IF_FALSE_3,
/* 80 */ &&case_BCODE_JUMPOP_BACKWARD_IF_TRUE_0,
/* 81 */ &&case_BCODE_JUMPOP_BACKWARD_IF_TRUE_1,
/* 82 */ &&case_BCODE_JUMPOP_BACKWARD_IF_TRUE_2,
/* 83 */ &&case_BCODE_JUMPOP_BACKWARD_IF_TRUE_3,
/* 84 */ &&case_DEFAULT,
/* 85 */ &&case_DEFAULT,
/* 86 */ &&case_DEFAULT,
@ -198,24 +198,24 @@
/* 195 */ &&case_DEFAULT,
/* 196 */ &&case_BCODE_JUMP_FORWARD_X,
/* 197 */ &&case_BCODE_JUMP2_FORWARD,
/* 198 */ &&case_DEFAULT,
/* 199 */ &&case_DEFAULT,
/* 198 */ &&case_BCODE_JUMP_FORWARD_IF_TRUE,
/* 199 */ &&case_BCODE_JUMP2_FORWARD_IF_TRUE,
/* 200 */ &&case_BCODE_JUMP_BACKWARD_X,
/* 201 */ &&case_BCODE_JUMP2_BACKWARD,
/* 202 */ &&case_DEFAULT,
/* 203 */ &&case_DEFAULT,
/* 204 */ &&case_BCODE_JUMP_BACKWARD_IF_FALSE_X,
/* 205 */ &&case_BCODE_JUMP2_BACKWARD_IF_FALSE,
/* 204 */ &&case_BCODE_JUMPOP_BACKWARD_IF_FALSE_X,
/* 205 */ &&case_BCODE_JUMPOP2_BACKWARD_IF_FALSE,
/* 206 */ &&case_DEFAULT,
/* 207 */ &&case_DEFAULT,
/* 208 */ &&case_BCODE_JUMP_BACKWARD_IF_TRUE_X,
/* 209 */ &&case_BCODE_JUMP2_BACKWARD_IF_TRUE,
/* 210 */ &&case_DEFAULT,
/* 211 */ &&case_DEFAULT,
/* 212 */ &&case_BCODE_JUMP_FORWARD_IF_FALSE,
/* 213 */ &&case_BCODE_JUMP2_FORWARD_IF_FALSE,
/* 214 */ &&case_BCODE_JUMP_FORWARD_IF_TRUE,
/* 215 */ &&case_BCODE_JUMP2_FORWARD_IF_TRUE,
/* 208 */ &&case_BCODE_JUMPOP_BACKWARD_IF_TRUE_X,
/* 209 */ &&case_BCODE_JUMPOP2_BACKWARD_IF_TRUE,
/* 210 */ &&case_BCODE_JUMP_FORWARD_IF_FALSE,
/* 211 */ &&case_BCODE_JUMP2_FORWARD_IF_FALSE,
/* 212 */ &&case_BCODE_JUMPOP_FORWARD_IF_FALSE,
/* 213 */ &&case_BCODE_JUMPOP2_FORWARD_IF_FALSE,
/* 214 */ &&case_BCODE_JUMPOP_FORWARD_IF_TRUE,
/* 215 */ &&case_BCODE_JUMPOP2_FORWARD_IF_TRUE,
/* 216 */ &&case_BCODE_STORE_INTO_CTXTEMPVAR_X,
/* 217 */ &&case_DEFAULT,
/* 218 */ &&case_DEFAULT,

View File

@ -54,13 +54,11 @@
/*#define MOO_DEBUG_LEXER 1*/
#define MOO_DEBUG_COMPILER 1
#define MOO_DEBUG_VM_PROCESSOR 1
#define MOO_DEBUG_VM_EXEC
/*#define MOO_DEBUG_VM_EXEC*/
#define MOO_PROFILE_VM 1
#endif
/* allow the caller to drive process switching by calling
* moo_switchprocess(). */
#define MOO_EXTERNAL_PROCESS_SWITCH
@ -714,17 +712,21 @@ SHORT INSTRUCTION CODE LONG INSTRUCTION C
68-71 0100 01XX JUMP_FORWARD 196 1100 0100 XXXXXXXX JUMP_FORWARD_X
197 1000 0101 XXXXXXXX JUMP2_FORWARD
197 1100 0101 XXXXXXXX JUMP2_FORWARD
198 1100 0110 XXXXXXXX JUMP_FORWARD_IF_TRUE
199 1100 0111 XXXXXXXX JUMP2_FORWARD_IF_TRUE
72-75 0100 10XX JUMP_BACKWARD 200 1100 1000 XXXXXXXX JUMP_BACKWARD_X
201 1101 1001 XXXXXXXX JUMP2_BACKWARD
76-79 0100 11XX JUMP_BACKWARD_IF_FALSE 204 1100 1100 XXXXXXXX JUMP_BACKWARD_IF_FALSE_X
205 1101 1101 XXXXXXXX JUMP2_BACKWARD_IF_FALSE
80-83 0101 00XX JUMP_BACKWARD_IF_TRUE 208 1101 0000 XXXXXXXX JUMP_BACKWARD_IF_TRUE_X
209 1101 0001 XXXXXXXX JUMP2_FORWARD_IF_TRUE
84-87 0101 01XX UNUSED 212 1101 0100 XXXXXXXX JUMP_FORWARD_IF_FALSE
213 1101 0101 XXXXXXXX JUMP2_FORWARD_IF_FALSE
214 1101 0110 XXXXXXXX JUMP_FORWARD_IF_TRUE
215 1101 0111 XXXXXXXX JUMP2_FORWARD_IF_TRUE
76-79 0100 11XX JUMPOP_BACKWARD_IF_FALSE 204 1100 1100 XXXXXXXX JUMPOP_BACKWARD_IF_FALSE_X
205 1101 1101 XXXXXXXX JUMPOP2_BACKWARD_IF_FALSE
80-83 0101 00XX JUMPOP_BACKWARD_IF_TRUE 208 1101 0000 XXXXXXXX JUMPOP_BACKWARD_IF_TRUE_X
209 1101 0001 XXXXXXXX JUMPOP2_FORWARD_IF_TRUE
84-87 0101 01XX UNUSED 210 1101 0010 XXXXXXXX JUMP_FORWARD_IF_FALSE
211 1101 0011 XXXXXXXX JUMP2_FORWARD_IF_FALSE
212 1101 0100 XXXXXXXX JUMPOP_FORWARD_IF_FALSE
213 1101 0101 XXXXXXXX JUMPOP2_FORWARD_IF_FALSE
214 1101 0110 XXXXXXXX JUMPOP_FORWARD_IF_TRUE
215 1101 0111 XXXXXXXX JUMPOP2_FORWARD_IF_TRUE
vv
88-91 0101 10XX YYYYYYYY STORE_INTO_CTXTEMPVAR 216 1101 1000 XXXXXXXX YYYYYYYY STORE_INTO_CTXTEMPVAR_X (bit 3 on, bit 2 off)
@ -850,15 +852,15 @@ enum moo_bcode_t
BCODE_JUMP_BACKWARD_2 = 0x4A, /* 74 */
BCODE_JUMP_BACKWARD_3 = 0x4B, /* 75 */
BCODE_JUMP_BACKWARD_IF_FALSE_0 = 0x4C, /* 76 */
BCODE_JUMP_BACKWARD_IF_FALSE_1 = 0x4D, /* 77 */
BCODE_JUMP_BACKWARD_IF_FALSE_2 = 0x4E, /* 78 */
BCODE_JUMP_BACKWARD_IF_FALSE_3 = 0x4F, /* 79 */
BCODE_JUMPOP_BACKWARD_IF_FALSE_0 = 0x4C, /* 76 */
BCODE_JUMPOP_BACKWARD_IF_FALSE_1 = 0x4D, /* 77 */
BCODE_JUMPOP_BACKWARD_IF_FALSE_2 = 0x4E, /* 78 */
BCODE_JUMPOP_BACKWARD_IF_FALSE_3 = 0x4F, /* 79 */
BCODE_JUMP_BACKWARD_IF_TRUE_0 = 0x50, /* 80 */
BCODE_JUMP_BACKWARD_IF_TRUE_1 = 0x51, /* 81 */
BCODE_JUMP_BACKWARD_IF_TRUE_2 = 0x52, /* 82 */
BCODE_JUMP_BACKWARD_IF_TRUE_3 = 0x53, /* 83 */
BCODE_JUMPOP_BACKWARD_IF_TRUE_0 = 0x50, /* 80 */
BCODE_JUMPOP_BACKWARD_IF_TRUE_1 = 0x51, /* 81 */
BCODE_JUMPOP_BACKWARD_IF_TRUE_2 = 0x52, /* 82 */
BCODE_JUMPOP_BACKWARD_IF_TRUE_3 = 0x53, /* 83 */
/* UNUSED 0x54 - 0x57 */
@ -938,18 +940,22 @@ enum moo_bcode_t
BCODE_JUMP_FORWARD_X = 0xC4, /* 196 ## */
BCODE_JUMP2_FORWARD = 0xC5, /* 197 */
BCODE_JUMP_FORWARD_IF_TRUE = 0xC6, /* 198 ## */
BCODE_JUMP2_FORWARD_IF_TRUE = 0xC7, /* 199 */
BCODE_JUMP_BACKWARD_X = 0xC8, /* 200 ## */
BCODE_JUMP2_BACKWARD = 0xC9, /* 201 */
BCODE_JUMP_BACKWARD_IF_FALSE_X = 0xCC, /* 204 ## */
BCODE_JUMP2_BACKWARD_IF_FALSE = 0xCD, /* 205 */
BCODE_JUMP_BACKWARD_IF_TRUE_X = 0xD0, /* 208 ## */
BCODE_JUMP2_BACKWARD_IF_TRUE = 0xD1, /* 209 */
BCODE_JUMPOP_BACKWARD_IF_FALSE_X = 0xCC, /* 204 ## */
BCODE_JUMPOP2_BACKWARD_IF_FALSE = 0xCD, /* 205 */
BCODE_JUMPOP_BACKWARD_IF_TRUE_X = 0xD0, /* 208 ## */
BCODE_JUMPOP2_BACKWARD_IF_TRUE = 0xD1, /* 209 */
BCODE_JUMP_FORWARD_IF_FALSE = 0xD4, /* 212 ## */
BCODE_JUMP2_FORWARD_IF_FALSE = 0xD5, /* 213 */
BCODE_JUMP_FORWARD_IF_TRUE = 0xD6, /* 214 ## */
BCODE_JUMP2_FORWARD_IF_TRUE = 0xD7, /* 215 */
BCODE_JUMP_FORWARD_IF_FALSE = 0xD2, /* 210 ## */
BCODE_JUMP2_FORWARD_IF_FALSE = 0xD3, /* 211 */
BCODE_JUMPOP_FORWARD_IF_FALSE = 0xD4, /* 212 ## */
BCODE_JUMPOP2_FORWARD_IF_FALSE = 0xD5, /* 213 */
BCODE_JUMPOP_FORWARD_IF_TRUE = 0xD6, /* 214 ## */
BCODE_JUMPOP2_FORWARD_IF_TRUE = 0xD7, /* 215 */
BCODE_STORE_INTO_CTXTEMPVAR_X = 0xD8, /* 216 ## */
BCODE_POP_INTO_CTXTEMPVAR_X = 0xDC, /* 220 ## */