Mercurial > repos > rhope
diff runtime/builtinworkers.c @ 177:e57c151f351e
Get bytecode engine working well enough for naive fib
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 12 Jun 2011 03:49:51 -0700 |
parents | 327bcf35e094 |
children | ba35ab624ec2 |
line wrap: on
line diff
--- a/runtime/builtinworkers.c Wed Jun 08 23:24:29 2011 -0700 +++ b/runtime/builtinworkers.c Sun Jun 12 03:49:51 2011 -0700 @@ -121,7 +121,8 @@ release_ref(cdata->params[idx++]); cdata->num_params = bytecode[0]; interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1); - lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1)); + lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1+bytecode[0])); + memcpy(lv_RunSP_Bytecode + 1, cdata->params+2, bytecode[0]*sizeof(object *)); PrepCall(bytecode[2]) @@ -173,14 +174,14 @@ accum = !accum; goto *interp_dispatch[*(++cur_instruction)&0xF]; interp_branch: - if (accum) - if (*cur_instruction & 0x8) + if (!accum) + if (*cur_instruction & 0x10) + cur_instruction -= *cur_instruction >> 5; + else cur_instruction += *cur_instruction >> 5; - else - cur_instruction -= *cur_instruction >> 5; else cur_instruction++; - goto *interp_dispatch[*cur_instruction]; + goto *interp_dispatch[*cur_instruction&0xF]; interp_saveresult: op1 = (*cur_instruction >> 4) & 0x1FFF; lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24]; @@ -193,8 +194,16 @@ op1 = (*cur_instruction >> 4) & 0x3FFF; release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]); goto *interp_dispatch[*(++cur_instruction)&0xF]; +interp_move: + op1 = (*cur_instruction >> 4) & 0x1FFF; + op2 = *cur_instruction >> 18; + if (op1) + lv_RunSP_Bytecode[op1] = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]; + else + accum = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]; + goto *interp_dispatch[*(++cur_instruction)&0xF]; interp_nop: - goto *interp_dispatch[*(++cur_instruction)&0xF]; + goto *interp_dispatch[*(++cur_instruction)&0xF]; interp_return: FreeCall release_ref(my_cdata->params[0]);