annotate runtime/builtinworkers.c @ 186:ba35ab624ec2

Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author Mike Pavone <pavone@retrodev.com>
date Fri, 07 Oct 2011 00:10:02 -0700
parents e57c151f351e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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,
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
2 NumParams 1,
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
3 NumOutputs 1)
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 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
6
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
7 lv(Build, bp) = ((t_Blueprint *)(my_params(0)))->bp;
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
8 release_ref(my_params(0));
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
10 Ret(0, new_object_bp(lv(Build, bp)))
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 EndFunc(Build)
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 Func(BlueprintSP_Of,
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
15 NumParams 1,
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
16 NumOutputs 1)
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
18 lv(BlueprintSP_Of, bp) = get_blueprint(my_params(0));
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
19 release_ref(my_params(0));
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 Ret(0, new_object(TYPE_BLUEPRINT))
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
22 ((t_Blueprint *)my_outputs(0))->bp = lv(BlueprintSP_Of, bp);
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 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
24 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
26 Func(ID, NumParams 1, NumOutputs 1)
162
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 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
29
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
30 lv(ID, id) = new_object(TYPE_UINT32);
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
31 ((t_UInt32 *)lv(ID, id))->Num = ((t_Blueprint *)my_params(0))->bp->type_id;
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
32 release_ref(my_params(0));
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
33 Ret(0, lv(ID, id))
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 EndFunc(ID)
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
37 Func(BlueprintSP_FromSP_ID, NumParams 1, NumOutputs 2)
162
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 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
40
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
41 lv(BlueprintSP_FromSP_ID, type) = ((t_UInt32 *)my_params(0))->Num;
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
42 if (lv(BlueprintSP_FromSP_ID, type) >= max_registered_type || !registered_types[lv(BlueprintSP_FromSP_ID, type)]) {
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
43 Ret(1, my_params(0))
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 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
45 } else {
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
46 release_ref(my_params(0));
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 Ret(0, new_object(TYPE_BLUEPRINT))
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
48 ((t_Blueprint *)my_outputs(0))->bp = registered_types[lv(BlueprintSP_FromSP_ID, type)];
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 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
50 }
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 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
53 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
55 #ifndef RAW_FUNC
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
56 FuncNoLocals(Pause, NumParams 1, NumOutputs 1)
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 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
58
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 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
60 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
61 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
62 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
63 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
64 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
65 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
66 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
67 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68 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
69 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
70 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
71 { 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
72 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
73 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
74 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
75 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
76 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
77 EndFuncNoLocals
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
80 FuncNoLocals(Resume, NumParams 2, NumOutputs 2)
162
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 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
82
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 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
84 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
85 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
86 {
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
87 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
88 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
89 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
90 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
91 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
92 {
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 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
94 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
95 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
96 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
97 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
98 }
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99 } else {
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 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
101 }
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
102 EndFuncNoLocals
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 DISPATCH
bac2c74801f0 Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
104
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
105 f_RunSP_Bytecode:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
106 sf_RunSP_Bytecode:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
107 Param(0, TYPE_ARRAY)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
108 Param(1, TYPE_BOXEDARRAY)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
109
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
110 if(((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id != TYPE_UINT32)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
111 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
112 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);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
113 goto _exception;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
114 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
115 my_cdata = cdata;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
116 bytecode = (uint32_t *)(((t_Array *)cdata->params[0])+1);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
117 for(idx = 2; idx < (bytecode[0]+2); ++idx)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
118 if(bytecode[idx+1])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
119 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
120 Param(idx, bytecode[idx+1])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
121 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
122 cur_instruction = bytecode+idx;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
123 while(idx < cdata->num_params)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
124 release_ref(cdata->params[idx++]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
125 cdata->num_params = bytecode[0];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
126 interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1);
177
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
127 lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1+bytecode[0]));
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
128 memcpy(lv_RunSP_Bytecode + 1, cdata->params+2, bytecode[0]*sizeof(object *));
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
129
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
130 PrepCall(bytecode[2])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
131
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
132 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
133 interp_call:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
134 *lv_RunSP_Bytecode = cur_instruction;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
135
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
136 cdata->func = RES_1_RunSP_Bytecode;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
137 cdata->num_params = *cur_instruction >> 24;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
138 cdata->vars = lv_RunSP_Bytecode;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
139 func = *cur_instruction >> 4 & 0xFFFFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
140 DISPATCH
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
141 r1_RunSP_Bytecode:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
142 my_cdata = cdata->lastframe;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
143 lv_RunSP_Bytecode = cdata->vars;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
144
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
145 interp_consts = (object **)(((t_BoxedSP_Array *)my_cdata->params[1])+1);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
146 cur_instruction = *lv_RunSP_Bytecode;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
147 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
148 interp_param:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
149 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
150 SetParam(*cur_instruction >> 24, op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
151 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
152 interp_load:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
153 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
154 accum = op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
155 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
156 interp_and:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
157 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
158 op2 = *cur_instruction >> 18;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
159 if (!op1)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
160 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
161 accum = accum && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
162 } else {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
163 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
164 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
165 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
166 interp_or:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
167 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
168 op2 = *cur_instruction >> 18;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
169 if (!op1)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
170 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
171 accum = accum || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
172 } else {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
173 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
174 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
175 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
176 interp_not:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
177 accum = !accum;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
178 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
179 interp_branch:
177
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
180 if (!accum)
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
181 if (*cur_instruction & 0x10)
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
182 cur_instruction -= *cur_instruction >> 5;
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
183 else
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
184 cur_instruction += *cur_instruction >> 5;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
185 else
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
186 cur_instruction++;
177
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
187 goto *interp_dispatch[*cur_instruction&0xF];
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
188 interp_saveresult:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
189 op1 = (*cur_instruction >> 4) & 0x1FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
190 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
191 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
192 interp_addref:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
193 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
194 add_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : (object *)lv_RunSP_Bytecode[op1]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
195 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
196 interp_release:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
197 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
198 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
199 goto *interp_dispatch[*(++cur_instruction)&0xF];
177
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
200 interp_move:
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
201 op1 = (*cur_instruction >> 4) & 0x1FFF;
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
202 op2 = *cur_instruction >> 18;
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
203 if (op1)
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
204 lv_RunSP_Bytecode[op1] = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2];
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
205 else
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
206 accum = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2];
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
207 goto *interp_dispatch[*(++cur_instruction)&0xF];
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
208 interp_nop:
177
e57c151f351e Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents: 176
diff changeset
209 goto *interp_dispatch[*(++cur_instruction)&0xF];
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
210 interp_return:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
211 FreeCall
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
212 release_ref(my_cdata->params[0]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
213 release_ref(my_cdata->params[1]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
214 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
215 op2 = *cur_instruction >> 24;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
216 for (idx = 0; idx < op2; ++idx)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
217 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
218 Ret(idx, lv_RunSP_Bytecode[op1+idx])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
219 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
220 EndFunc(RunSP_Bytecode)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
221 DISPATCH
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
222 #else
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
223 FuncNoLocals(Pause, NumParams 1, NumOutputs 0)
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
224 exit(2);
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
225 EndFuncNoLocals
176
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
226
186
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
227 FuncNoLocals(Resume, NumParams 2, NumOutputs 0)
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
228 exit(2);
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
229 EndFuncNoLocals
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
230
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
231 FuncNoLocals(RunSP_Bytecode, NumParams 2, NumOutputs 0)
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
232 exit(2);
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
233 EndFuncNoLocals
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
234 #endif //RAW_FUNC
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
235
ba35ab624ec2 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents: 177
diff changeset
236