changeset 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 ed322ae64738
files runtime/builtinworkers.c runtime/rhopefuncs_prolog.c
diffstat 2 files changed, 17 insertions(+), 7 deletions(-) [+]
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]);
--- 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,