comparison 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
comparison
equal deleted inserted replaced
176:327bcf35e094 177:e57c151f351e
119 cur_instruction = bytecode+idx; 119 cur_instruction = bytecode+idx;
120 while(idx < cdata->num_params) 120 while(idx < cdata->num_params)
121 release_ref(cdata->params[idx++]); 121 release_ref(cdata->params[idx++]);
122 cdata->num_params = bytecode[0]; 122 cdata->num_params = bytecode[0];
123 interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1); 123 interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1);
124 lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1)); 124 lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1+bytecode[0]));
125 memcpy(lv_RunSP_Bytecode + 1, cdata->params+2, bytecode[0]*sizeof(object *));
125 126
126 PrepCall(bytecode[2]) 127 PrepCall(bytecode[2])
127 128
128 goto *interp_dispatch[*(++cur_instruction)&0xF]; 129 goto *interp_dispatch[*(++cur_instruction)&0xF];
129 interp_call: 130 interp_call:
171 goto *interp_dispatch[*(++cur_instruction)&0xF]; 172 goto *interp_dispatch[*(++cur_instruction)&0xF];
172 interp_not: 173 interp_not:
173 accum = !accum; 174 accum = !accum;
174 goto *interp_dispatch[*(++cur_instruction)&0xF]; 175 goto *interp_dispatch[*(++cur_instruction)&0xF];
175 interp_branch: 176 interp_branch:
176 if (accum) 177 if (!accum)
177 if (*cur_instruction & 0x8) 178 if (*cur_instruction & 0x10)
179 cur_instruction -= *cur_instruction >> 5;
180 else
178 cur_instruction += *cur_instruction >> 5; 181 cur_instruction += *cur_instruction >> 5;
179 else
180 cur_instruction -= *cur_instruction >> 5;
181 else 182 else
182 cur_instruction++; 183 cur_instruction++;
183 goto *interp_dispatch[*cur_instruction]; 184 goto *interp_dispatch[*cur_instruction&0xF];
184 interp_saveresult: 185 interp_saveresult:
185 op1 = (*cur_instruction >> 4) & 0x1FFF; 186 op1 = (*cur_instruction >> 4) & 0x1FFF;
186 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24]; 187 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24];
187 goto *interp_dispatch[*(++cur_instruction)&0xF]; 188 goto *interp_dispatch[*(++cur_instruction)&0xF];
188 interp_addref: 189 interp_addref:
191 goto *interp_dispatch[*(++cur_instruction)&0xF]; 192 goto *interp_dispatch[*(++cur_instruction)&0xF];
192 interp_release: 193 interp_release:
193 op1 = (*cur_instruction >> 4) & 0x3FFF; 194 op1 = (*cur_instruction >> 4) & 0x3FFF;
194 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]); 195 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]);
195 goto *interp_dispatch[*(++cur_instruction)&0xF]; 196 goto *interp_dispatch[*(++cur_instruction)&0xF];
197 interp_move:
198 op1 = (*cur_instruction >> 4) & 0x1FFF;
199 op2 = *cur_instruction >> 18;
200 if (op1)
201 lv_RunSP_Bytecode[op1] = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2];
202 else
203 accum = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2];
204 goto *interp_dispatch[*(++cur_instruction)&0xF];
196 interp_nop: 205 interp_nop:
197 goto *interp_dispatch[*(++cur_instruction)&0xF]; 206 goto *interp_dispatch[*(++cur_instruction)&0xF];
198 interp_return: 207 interp_return:
199 FreeCall 208 FreeCall
200 release_ref(my_cdata->params[0]); 209 release_ref(my_cdata->params[0]);
201 release_ref(my_cdata->params[1]); 210 release_ref(my_cdata->params[1]);
202 op1 = (*cur_instruction >> 4) & 0x3FFF; 211 op1 = (*cur_instruction >> 4) & 0x3FFF;