# HG changeset patch # User Mike Pavone # Date 1307875791 25200 # Node ID e57c151f351ebab8dfa44d02507c1c485b181ba8 # Parent 327bcf35e094b7797aaa92a34d224ab5d1169e60 Get bytecode engine working well enough for naive fib diff -r 327bcf35e094 -r e57c151f351e runtime/builtinworkers.c --- 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]); diff -r 327bcf35e094 -r e57c151f351e runtime/rhopefuncs_prolog.c --- a/runtime/rhopefuncs_prolog.c Wed Jun 08 23:24:29 2011 -0700 +++ b/runtime/rhopefuncs_prolog.c Sun Jun 12 03:49:51 2011 -0700 @@ -25,6 +25,7 @@ &&interp_saveresult, &&interp_addref, &&interp_release, + &&interp_move, &&interp_return, &&interp_nop, &&interp_nop,