Mercurial > repos > rhope
annotate runtime/builtinworkers.c @ 176:327bcf35e094
Add bytecode interpreter
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 08 Jun 2011 23:24:29 -0700 |
parents | bac2c74801f0 |
children | e57c151f351e |
rev | line source |
---|---|
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 Func(Build, |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 Param(0, TYPE_BLUEPRINT) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 lv_Build->bp = ((t_Blueprint *)(cdata->params[0]))->bp; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 release_ref(cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 Ret(0, new_object_bp(lv_Build->bp)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 EndFunc(Build) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 Func(BlueprintSP_Of, |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 lv_BlueprintSP_Of->bp = get_blueprint(cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 release_ref(cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 Ret(0, new_object(TYPE_BLUEPRINT)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 ((t_Blueprint *)cdata->params[0])->bp = lv_BlueprintSP_Of->bp; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 EndFunc(BlueprintSP_Of) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 Func(ID, NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 Param(0, TYPE_BLUEPRINT) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 lv_ID->id = new_object(TYPE_UINT32); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 ((t_UInt32 *)lv_ID->id)->Num = ((t_Blueprint *)cdata->params[0])->bp->type_id; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 release_ref(cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 Ret(0, lv_ID->id) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 EndFunc(ID) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 Func(BlueprintSP_FromSP_ID, NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 Param(0, TYPE_UINT32) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 lv_BlueprintSP_FromSP_ID->type = ((t_UInt32 *)cdata->params[0])->Num; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 if (lv_BlueprintSP_FromSP_ID->type >= max_registered_type || !registered_types[lv_BlueprintSP_FromSP_ID->type]) { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 Ret(1, cdata->params[0]) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 Ret(0, NULL) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 } else { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 release_ref(cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 Ret(0, new_object(TYPE_BLUEPRINT)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 ((t_Blueprint *)cdata->params[0])->bp = registered_types[lv_BlueprintSP_FromSP_ID->type]; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 Ret(1, NULL) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 EndFunc(BlueprintSP_FromSP_ID) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 FuncNoLocals(Pause, NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 Param(0, TYPE_WORKER) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 ct->resume_cdata = my_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 ct->resumeable = 1; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 temp_ct = ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 ct = new_context(); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 VCPrepCall(my_cdata->params[0], 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 ValCallNoLocals(my_cdata->params[0], 1, 1, Pause) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 release_ref(my_cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 ValCallNoLocalsPostlude(1, Pause) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 for(idx = 0; idx < cdata->num_params; ++idx) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 if(cdata->params[idx]) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 { release_ref(cdata->params[idx]); } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 free_context(ct); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 ct = get_cqueue(); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 if (!ct) goto NOTHING_TO_DO; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 cdata = ct->resume_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 ct->resume_cdata = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 EndFuncNoLocals |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 FuncNoLocals(Resume, NumParams 2) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 Param(0, TYPE_CONTEXT) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 temp_ct = ((t_Context *)my_cdata->params[0])->ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 release_ref(my_cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 if(temp_ct->resumeable && temp_ct->resume_cdata) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 temp_ct->resumeable = 0; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 temp_ct->resume_cdata->params[0] = add_ref(my_cdata->params[1]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 my_cdata->params[0] = my_cdata->params[1]; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 my_cdata->params[1] = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 if(!put_cqueue(temp_ct)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 ct->resume_cdata = my_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 temp_ct->runafter = ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 ct = temp_ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 cdata = ct->resume_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 ct->resume_cdata = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 } else { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 my_cdata->params[0] = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 EndFuncNoLocals |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 |
176 | 102 f_RunSP_Bytecode: |
103 sf_RunSP_Bytecode: | |
104 Param(0, TYPE_ARRAY) | |
105 Param(1, TYPE_BOXEDARRAY) | |
106 | |
107 if(((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id != TYPE_UINT32) | |
108 { | |
109 printf("Array has element type of %d, but bytecode must be an array with element type UInt32\n", ((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id); | |
110 goto _exception; | |
111 } | |
112 my_cdata = cdata; | |
113 bytecode = (uint32_t *)(((t_Array *)cdata->params[0])+1); | |
114 for(idx = 2; idx < (bytecode[0]+2); ++idx) | |
115 if(bytecode[idx+1]) | |
116 { | |
117 Param(idx, bytecode[idx+1]) | |
118 } | |
119 cur_instruction = bytecode+idx; | |
120 while(idx < cdata->num_params) | |
121 release_ref(cdata->params[idx++]); | |
122 cdata->num_params = bytecode[0]; | |
123 interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1); | |
124 lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1)); | |
125 | |
126 PrepCall(bytecode[2]) | |
127 | |
128 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
129 interp_call: | |
130 *lv_RunSP_Bytecode = cur_instruction; | |
131 | |
132 cdata->func = RES_1_RunSP_Bytecode; | |
133 cdata->num_params = *cur_instruction >> 24; | |
134 cdata->vars = lv_RunSP_Bytecode; | |
135 func = *cur_instruction >> 4 & 0xFFFFF; | |
136 DISPATCH | |
137 r1_RunSP_Bytecode: | |
138 my_cdata = cdata->lastframe; | |
139 lv_RunSP_Bytecode = cdata->vars; | |
140 | |
141 interp_consts = (object **)(((t_BoxedSP_Array *)my_cdata->params[1])+1); | |
142 cur_instruction = *lv_RunSP_Bytecode; | |
143 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
144 interp_param: | |
145 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
146 SetParam(*cur_instruction >> 24, op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) | |
147 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
148 interp_load: | |
149 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
150 accum = op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]; | |
151 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
152 interp_and: | |
153 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
154 op2 = *cur_instruction >> 18; | |
155 if (!op1) | |
156 { | |
157 accum = accum && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
158 } else { | |
159 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
160 } | |
161 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
162 interp_or: | |
163 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
164 op2 = *cur_instruction >> 18; | |
165 if (!op1) | |
166 { | |
167 accum = accum || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
168 } else { | |
169 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
170 } | |
171 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
172 interp_not: | |
173 accum = !accum; | |
174 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
175 interp_branch: | |
176 if (accum) | |
177 if (*cur_instruction & 0x8) | |
178 cur_instruction += *cur_instruction >> 5; | |
179 else | |
180 cur_instruction -= *cur_instruction >> 5; | |
181 else | |
182 cur_instruction++; | |
183 goto *interp_dispatch[*cur_instruction]; | |
184 interp_saveresult: | |
185 op1 = (*cur_instruction >> 4) & 0x1FFF; | |
186 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24]; | |
187 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
188 interp_addref: | |
189 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
190 add_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : (object *)lv_RunSP_Bytecode[op1]); | |
191 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
192 interp_release: | |
193 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
194 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]); | |
195 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
196 interp_nop: | |
197 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
198 interp_return: | |
199 FreeCall | |
200 release_ref(my_cdata->params[0]); | |
201 release_ref(my_cdata->params[1]); | |
202 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
203 op2 = *cur_instruction >> 24; | |
204 for (idx = 0; idx < op2; ++idx) | |
205 { | |
206 Ret(idx, lv_RunSP_Bytecode[op1+idx]) | |
207 } | |
208 EndFunc(RunSP_Bytecode) | |
209 DISPATCH | |
210 |