Mercurial > repos > rhope
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; |