INSTR(DTOR_EOC);
INSTR(DtorReturn);
-INSTR(RegPushMe);
-INSTR(RegPushMaybe);
-
/* branching */
INSTR(BranchSwitch);
INSTR(SwitchIni);
RegPushBase3,
RegPushBase4,
RegDup,
- MemPushImm,
MemSetImm,
RegPop,
RegPushPtr,
+ RegPushMe,
+ RegPushMaybe,
FuncReturn,
Goto,
AllocWord,
#define RegPushBase3 (f_instr)RegPushBase3
#define RegPushBase4 (f_instr)RegPushBase4
#define RegDup (f_instr)RegDup
-#define MemPushImm (f_instr)MemPushImm
#define MemSetImm (f_instr)MemSetImm
#define RegPop (f_instr)RegPop
#define RegPushPtr (f_instr)RegPushPtr
+#define RegPushMe (f_instr)RegPushMe
+#define RegPushMaybe (f_instr)RegPushMaybe
#define FuncReturn (f_instr)FuncReturn
#define Goto (f_instr)Goto
#define AllocWord (f_instr)AllocWord
RegPushBase3
RegPushBase4
RegDup
-MemPushImm
MemSetImm
RegPop
RegPushPtr
+RegPushMe
+RegPushMaybe
FuncReturn
Goto
AllocWord
push_spork_code(emit, SPORK_FUNC_PREFIX, exp->self->pos);
if(GET_FLAG(exp->m_func, member))
SET_FLAG(emit->code, member);
- const Instr op = emit_add_instr(emit, MemPushImm);
- op->m_val = emit->code->stack_depth;
-const Instr p =
-
- emit_add_instr(emit, RegPushImm);
+ const Instr p = emit_add_instr(emit, RegPushImm);
p->m_val = (m_uint)exp->m_func->code;
-
CHECK_BB(emit_exp_call1(emit, exp->m_func))
const VM_Code code = finalyze(emit);
const m_uint size = exp->m_func->def->stack_depth - (GET_FLAG(exp->m_func,
shreduler_remove(shred->vm->shreduler, shred, 0);
}
-INSTR(RegPushMe) { GWDEBUG_EXE
- *(M_Object*)REG(0) = shred->me;
- PUSH_REG(shred, SZ_INT);
-}
-
-INSTR(RegPushMaybe) { GWDEBUG_EXE
- *(m_uint*)REG(0) = gw_rand(shred->vm->rand) > (UINT32_MAX / 2);
- PUSH_REG(shred, SZ_INT);
-}
-
/* branching */
INSTR(SwitchIni) {
const Vector v = (Vector)instr->m_val;
ANN static m_bool handle_instr(const Emitter emit, const M_Operator* mo) {
if(mo->func) {
const Instr instr = emit_add_instr(emit, RegPushImm);
- instr->m_val = (m_uint)mo->func;
+ instr->m_val = (m_uint)mo->func->code;
return emit_exp_call1(emit, mo->func);
}
emit_add_instr(emit, mo->instr);
&&pushnow,
&&baseint, &&basefloat, &&baseother, &&baseaddr,
&®dup,
- &&mempushimm, &&memsetimm,
- &®pop, &®pushptr,
+ &&memsetimm,
+ &®pop, &®pushptr, &®pushme, &®pushmaybe,
&&funcreturn,
&&_goto,
&&allocint, &&allocfloat, &&allocother, &&allocaddr,
*(m_uint*)reg = *(m_uint*)(reg-SZ_INT);
reg += SZ_INT;
DISPATCH()
-mempushimm:
- *(m_uint*)mem = instr->m_val;
- mem += SZ_INT;
- DISPATCH();
memsetimm:
*(m_uint*)(mem+instr->m_val) = instr->m_val2;
DISPATCH();
regpushptr:
*(m_uint*)(reg-SZ_INT) = instr->m_val;
DISPATCH()
+regpushme:
+ *(M_Object*)reg = shred->me;
+ reg += SZ_INT;
+ DISPATCH()
+regpushmaybe:
+ *(m_uint*)reg = gw_rand((uint32_t*)vm->rand) > (UINT32_MAX / 2);
+ reg += SZ_INT;
+ DISPATCH();
funcreturn:
pc = *(m_uint*)(mem-SZ_INT);
code = *(VM_Code*)(mem-SZ_INT*2);