Blame


1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <ctype.h>
5 564ca709 2004-04-19 devnull #include <mach.h>
6 564ca709 2004-04-19 devnull #define Extern extern
7 564ca709 2004-04-19 devnull #include "acid.h"
8 564ca709 2004-04-19 devnull
9 e637c944 2004-04-20 devnull static int fsize[256];
10 e637c944 2004-04-20 devnull
11 e637c944 2004-04-20 devnull static void
12 e637c944 2004-04-20 devnull initfsize(void)
13 564ca709 2004-04-19 devnull {
14 e637c944 2004-04-20 devnull fsize['A'] = 4;
15 e637c944 2004-04-20 devnull fsize['B'] = 4;
16 e637c944 2004-04-20 devnull fsize['C'] = 1;
17 e637c944 2004-04-20 devnull fsize['D'] = 4;
18 e637c944 2004-04-20 devnull fsize['F'] = 8;
19 e637c944 2004-04-20 devnull fsize['G'] = 8;
20 e637c944 2004-04-20 devnull fsize['O'] = 4;
21 e637c944 2004-04-20 devnull fsize['Q'] = 4;
22 e637c944 2004-04-20 devnull fsize['R'] = 4;
23 e637c944 2004-04-20 devnull fsize['S'] = 4;
24 e637c944 2004-04-20 devnull fsize['U'] = 4;
25 e637c944 2004-04-20 devnull fsize['V'] = 8;
26 e637c944 2004-04-20 devnull fsize['X'] = 4;
27 e637c944 2004-04-20 devnull fsize['Y'] = 8;
28 e637c944 2004-04-20 devnull fsize['W'] = 8;
29 e637c944 2004-04-20 devnull fsize['Z'] = 8;
30 e637c944 2004-04-20 devnull fsize['a'] = 4;
31 e637c944 2004-04-20 devnull fsize['b'] = 1;
32 e637c944 2004-04-20 devnull fsize['c'] = 1;
33 e637c944 2004-04-20 devnull fsize['d'] = 2;
34 e637c944 2004-04-20 devnull fsize['f'] = 4;
35 e637c944 2004-04-20 devnull fsize['g'] = 4;
36 e637c944 2004-04-20 devnull fsize['o'] = 2;
37 e637c944 2004-04-20 devnull fsize['q'] = 2;
38 e637c944 2004-04-20 devnull fsize['r'] = 2;
39 e637c944 2004-04-20 devnull fsize['s'] = 4;
40 e637c944 2004-04-20 devnull fsize['u'] = 2;
41 e637c944 2004-04-20 devnull fsize['x'] = 2;
42 a0f1e21f 2004-04-20 devnull }
43 564ca709 2004-04-19 devnull
44 564ca709 2004-04-19 devnull int
45 564ca709 2004-04-19 devnull fmtsize(Value *v)
46 564ca709 2004-04-19 devnull {
47 564ca709 2004-04-19 devnull int ret;
48 564ca709 2004-04-19 devnull
49 564ca709 2004-04-19 devnull switch(v->store.fmt) {
50 564ca709 2004-04-19 devnull default:
51 564ca709 2004-04-19 devnull return fsize[(unsigned char)v->store.fmt];
52 564ca709 2004-04-19 devnull case 'i':
53 564ca709 2004-04-19 devnull case 'I':
54 564ca709 2004-04-19 devnull if(v->type != TINT || mach == 0)
55 564ca709 2004-04-19 devnull error("no size for i fmt pointer ++/--");
56 564ca709 2004-04-19 devnull ret = (*mach->instsize)(symmap, v->store.u.ival);
57 564ca709 2004-04-19 devnull if(ret < 0) {
58 564ca709 2004-04-19 devnull ret = (*mach->instsize)(symmap, v->store.u.ival);
59 564ca709 2004-04-19 devnull if(ret < 0)
60 564ca709 2004-04-19 devnull error("%r");
61 564ca709 2004-04-19 devnull }
62 564ca709 2004-04-19 devnull return ret;
63 564ca709 2004-04-19 devnull }
64 564ca709 2004-04-19 devnull }
65 564ca709 2004-04-19 devnull
66 4f2ac1b7 2005-01-23 devnull Lsym*
67 564ca709 2004-04-19 devnull chklval(Node *lp)
68 564ca709 2004-04-19 devnull {
69 4f2ac1b7 2005-01-23 devnull Node res;
70 4f2ac1b7 2005-01-23 devnull Lsym *s;
71 4f2ac1b7 2005-01-23 devnull
72 4f2ac1b7 2005-01-23 devnull if(lp->op == ONAME)
73 4f2ac1b7 2005-01-23 devnull return lp->sym;
74 4f2ac1b7 2005-01-23 devnull
75 4f2ac1b7 2005-01-23 devnull if(lp->op == OCALL){
76 4f2ac1b7 2005-01-23 devnull s = chklval(lp->left);
77 fa325e9b 2020-01-10 cross if(strcmp(s->name, "var") == 0
78 4f2ac1b7 2005-01-23 devnull && (lp->builtin || s->proc == 0)){
79 4f2ac1b7 2005-01-23 devnull if(lp->right == 0)
80 4f2ac1b7 2005-01-23 devnull error("var(string): arg count");
81 4f2ac1b7 2005-01-23 devnull expr(lp->right, &res);
82 4f2ac1b7 2005-01-23 devnull if(res.type != TSTRING)
83 4f2ac1b7 2005-01-23 devnull error("var(string): arg type");
84 4f2ac1b7 2005-01-23 devnull return mkvar(res.store.u.string->string);
85 4f2ac1b7 2005-01-23 devnull }
86 4f2ac1b7 2005-01-23 devnull }
87 4f2ac1b7 2005-01-23 devnull error("need l-value");
88 fa325e9b 2020-01-10 cross return nil;
89 564ca709 2004-04-19 devnull }
90 564ca709 2004-04-19 devnull
91 564ca709 2004-04-19 devnull void
92 564ca709 2004-04-19 devnull olist(Node *n, Node *res)
93 564ca709 2004-04-19 devnull {
94 564ca709 2004-04-19 devnull expr(n->left, res);
95 564ca709 2004-04-19 devnull expr(n->right, res);
96 564ca709 2004-04-19 devnull }
97 564ca709 2004-04-19 devnull
98 564ca709 2004-04-19 devnull void
99 564ca709 2004-04-19 devnull oeval(Node *n, Node *res)
100 564ca709 2004-04-19 devnull {
101 564ca709 2004-04-19 devnull expr(n->left, res);
102 564ca709 2004-04-19 devnull if(res->type != TCODE)
103 564ca709 2004-04-19 devnull error("bad type for eval");
104 564ca709 2004-04-19 devnull expr(res->store.u.cc, res);
105 564ca709 2004-04-19 devnull }
106 564ca709 2004-04-19 devnull
107 564ca709 2004-04-19 devnull void
108 564ca709 2004-04-19 devnull ocast(Node *n, Node *res)
109 564ca709 2004-04-19 devnull {
110 564ca709 2004-04-19 devnull if(n->sym->lt == 0)
111 564ca709 2004-04-19 devnull error("%s is not a complex type", n->sym->name);
112 564ca709 2004-04-19 devnull
113 564ca709 2004-04-19 devnull expr(n->left, res);
114 564ca709 2004-04-19 devnull res->store.comt = n->sym->lt;
115 564ca709 2004-04-19 devnull res->store.fmt = 'a';
116 564ca709 2004-04-19 devnull }
117 564ca709 2004-04-19 devnull
118 564ca709 2004-04-19 devnull void
119 564ca709 2004-04-19 devnull oindm(Node *n, Node *res)
120 564ca709 2004-04-19 devnull {
121 564ca709 2004-04-19 devnull Map *m;
122 564ca709 2004-04-19 devnull Node l;
123 564ca709 2004-04-19 devnull
124 564ca709 2004-04-19 devnull m = cormap;
125 564ca709 2004-04-19 devnull if(m == 0)
126 564ca709 2004-04-19 devnull m = symmap;
127 564ca709 2004-04-19 devnull expr(n->left, &l);
128 4f2ac1b7 2005-01-23 devnull switch(l.type){
129 4f2ac1b7 2005-01-23 devnull default:
130 564ca709 2004-04-19 devnull error("bad type for *");
131 4f2ac1b7 2005-01-23 devnull case TINT:
132 4f2ac1b7 2005-01-23 devnull if(m == 0)
133 4f2ac1b7 2005-01-23 devnull error("no map for *");
134 4f2ac1b7 2005-01-23 devnull indir(m, l.store.u.ival, l.store.fmt, res);
135 4f2ac1b7 2005-01-23 devnull res->store.comt = l.store.comt;
136 4f2ac1b7 2005-01-23 devnull break;
137 4f2ac1b7 2005-01-23 devnull case TREG:
138 7b8a3f12 2005-02-11 devnull indirreg(correg, l.store.u.reg.name, l.store.fmt, res);
139 4f2ac1b7 2005-01-23 devnull res->store.comt = l.store.comt;
140 4f2ac1b7 2005-01-23 devnull break;
141 4f2ac1b7 2005-01-23 devnull case TCON:
142 4f2ac1b7 2005-01-23 devnull *res = *l.store.u.con;
143 4f2ac1b7 2005-01-23 devnull res->store.comt = l.store.comt;
144 4f2ac1b7 2005-01-23 devnull break;
145 4f2ac1b7 2005-01-23 devnull }
146 564ca709 2004-04-19 devnull }
147 564ca709 2004-04-19 devnull
148 564ca709 2004-04-19 devnull void
149 564ca709 2004-04-19 devnull oindc(Node *n, Node *res)
150 564ca709 2004-04-19 devnull {
151 564ca709 2004-04-19 devnull Map *m;
152 564ca709 2004-04-19 devnull Node l;
153 564ca709 2004-04-19 devnull
154 564ca709 2004-04-19 devnull m = symmap;
155 564ca709 2004-04-19 devnull if(m == 0)
156 564ca709 2004-04-19 devnull m = cormap;
157 564ca709 2004-04-19 devnull expr(n->left, &l);
158 564ca709 2004-04-19 devnull if(l.type != TINT)
159 564ca709 2004-04-19 devnull error("bad type for @");
160 564ca709 2004-04-19 devnull if(m == 0)
161 564ca709 2004-04-19 devnull error("no map for @");
162 564ca709 2004-04-19 devnull indir(m, l.store.u.ival, l.store.fmt, res);
163 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
164 564ca709 2004-04-19 devnull }
165 564ca709 2004-04-19 devnull
166 564ca709 2004-04-19 devnull void
167 564ca709 2004-04-19 devnull oframe(Node *n, Node *res)
168 564ca709 2004-04-19 devnull {
169 564ca709 2004-04-19 devnull char *p;
170 564ca709 2004-04-19 devnull Node *lp;
171 443d6288 2012-02-19 rsc u64int ival;
172 564ca709 2004-04-19 devnull Frtype *f;
173 564ca709 2004-04-19 devnull
174 564ca709 2004-04-19 devnull p = n->sym->name;
175 564ca709 2004-04-19 devnull while(*p && *p == '$')
176 564ca709 2004-04-19 devnull p++;
177 564ca709 2004-04-19 devnull lp = n->left;
178 4f2ac1b7 2005-01-23 devnull if(localaddr(cormap, acidregs, p, lp->sym->name, &ival) < 0)
179 564ca709 2004-04-19 devnull error("colon: %r");
180 fa325e9b 2020-01-10 cross
181 564ca709 2004-04-19 devnull res->store.u.ival = ival;
182 564ca709 2004-04-19 devnull res->op = OCONST;
183 564ca709 2004-04-19 devnull res->store.fmt = 'X';
184 564ca709 2004-04-19 devnull res->type = TINT;
185 564ca709 2004-04-19 devnull
186 564ca709 2004-04-19 devnull /* Try and set comt */
187 564ca709 2004-04-19 devnull for(f = n->sym->local; f; f = f->next) {
188 564ca709 2004-04-19 devnull if(f->var == lp->sym) {
189 564ca709 2004-04-19 devnull res->store.comt = f->type;
190 564ca709 2004-04-19 devnull res->store.fmt = 'a';
191 564ca709 2004-04-19 devnull break;
192 564ca709 2004-04-19 devnull }
193 564ca709 2004-04-19 devnull }
194 564ca709 2004-04-19 devnull }
195 564ca709 2004-04-19 devnull
196 564ca709 2004-04-19 devnull void
197 564ca709 2004-04-19 devnull oindex(Node *n, Node *res)
198 564ca709 2004-04-19 devnull {
199 564ca709 2004-04-19 devnull Node l, r;
200 564ca709 2004-04-19 devnull
201 564ca709 2004-04-19 devnull expr(n->left, &l);
202 564ca709 2004-04-19 devnull expr(n->right, &r);
203 564ca709 2004-04-19 devnull
204 564ca709 2004-04-19 devnull if(r.type != TINT)
205 564ca709 2004-04-19 devnull error("bad type for []");
206 564ca709 2004-04-19 devnull
207 564ca709 2004-04-19 devnull switch(l.type) {
208 564ca709 2004-04-19 devnull default:
209 564ca709 2004-04-19 devnull error("lhs[] has bad type");
210 564ca709 2004-04-19 devnull case TINT:
211 564ca709 2004-04-19 devnull indir(cormap, l.store.u.ival+(r.store.u.ival*fsize[(unsigned char)l.store.fmt]), l.store.fmt, res);
212 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
213 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
214 564ca709 2004-04-19 devnull break;
215 564ca709 2004-04-19 devnull case TLIST:
216 564ca709 2004-04-19 devnull nthelem(l.store.u.l, r.store.u.ival, res);
217 564ca709 2004-04-19 devnull break;
218 564ca709 2004-04-19 devnull case TSTRING:
219 564ca709 2004-04-19 devnull res->store.u.ival = 0;
220 564ca709 2004-04-19 devnull if(r.store.u.ival >= 0 && r.store.u.ival < l.store.u.string->len) {
221 564ca709 2004-04-19 devnull int xx8; /* to get around bug in vc */
222 564ca709 2004-04-19 devnull xx8 = r.store.u.ival;
223 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.string->string[xx8];
224 564ca709 2004-04-19 devnull }
225 564ca709 2004-04-19 devnull res->op = OCONST;
226 564ca709 2004-04-19 devnull res->type = TINT;
227 564ca709 2004-04-19 devnull res->store.fmt = 'c';
228 564ca709 2004-04-19 devnull break;
229 564ca709 2004-04-19 devnull }
230 564ca709 2004-04-19 devnull }
231 564ca709 2004-04-19 devnull
232 564ca709 2004-04-19 devnull void
233 564ca709 2004-04-19 devnull oappend(Node *n, Node *res)
234 564ca709 2004-04-19 devnull {
235 564ca709 2004-04-19 devnull Node r, l;
236 564ca709 2004-04-19 devnull
237 564ca709 2004-04-19 devnull expr(n->left, &l);
238 564ca709 2004-04-19 devnull expr(n->right, &r);
239 564ca709 2004-04-19 devnull if(l.type != TLIST)
240 564ca709 2004-04-19 devnull error("must append to list");
241 564ca709 2004-04-19 devnull append(res, &l, &r);
242 564ca709 2004-04-19 devnull }
243 564ca709 2004-04-19 devnull
244 564ca709 2004-04-19 devnull void
245 564ca709 2004-04-19 devnull odelete(Node *n, Node *res)
246 564ca709 2004-04-19 devnull {
247 564ca709 2004-04-19 devnull Node l, r;
248 564ca709 2004-04-19 devnull
249 564ca709 2004-04-19 devnull expr(n->left, &l);
250 564ca709 2004-04-19 devnull expr(n->right, &r);
251 564ca709 2004-04-19 devnull if(l.type != TLIST)
252 564ca709 2004-04-19 devnull error("must delete from list");
253 564ca709 2004-04-19 devnull if(r.type != TINT)
254 564ca709 2004-04-19 devnull error("delete index must be integer");
255 564ca709 2004-04-19 devnull
256 564ca709 2004-04-19 devnull delete(l.store.u.l, r.store.u.ival, res);
257 564ca709 2004-04-19 devnull }
258 564ca709 2004-04-19 devnull
259 564ca709 2004-04-19 devnull void
260 564ca709 2004-04-19 devnull ohead(Node *n, Node *res)
261 564ca709 2004-04-19 devnull {
262 564ca709 2004-04-19 devnull Node l;
263 564ca709 2004-04-19 devnull
264 564ca709 2004-04-19 devnull expr(n->left, &l);
265 564ca709 2004-04-19 devnull if(l.type != TLIST)
266 564ca709 2004-04-19 devnull error("head needs list");
267 564ca709 2004-04-19 devnull res->op = OCONST;
268 564ca709 2004-04-19 devnull if(l.store.u.l) {
269 564ca709 2004-04-19 devnull res->type = l.store.u.l->type;
270 564ca709 2004-04-19 devnull res->store = l.store.u.l->store;
271 564ca709 2004-04-19 devnull }
272 564ca709 2004-04-19 devnull else {
273 564ca709 2004-04-19 devnull res->type = TLIST;
274 564ca709 2004-04-19 devnull res->store.u.l = 0;
275 564ca709 2004-04-19 devnull }
276 564ca709 2004-04-19 devnull }
277 564ca709 2004-04-19 devnull
278 564ca709 2004-04-19 devnull void
279 564ca709 2004-04-19 devnull otail(Node *n, Node *res)
280 564ca709 2004-04-19 devnull {
281 564ca709 2004-04-19 devnull Node l;
282 564ca709 2004-04-19 devnull
283 564ca709 2004-04-19 devnull expr(n->left, &l);
284 564ca709 2004-04-19 devnull if(l.type != TLIST)
285 564ca709 2004-04-19 devnull error("tail needs list");
286 564ca709 2004-04-19 devnull res->op = OCONST;
287 564ca709 2004-04-19 devnull res->type = TLIST;
288 564ca709 2004-04-19 devnull if(l.store.u.l)
289 564ca709 2004-04-19 devnull res->store.u.l = l.store.u.l->next;
290 564ca709 2004-04-19 devnull else
291 564ca709 2004-04-19 devnull res->store.u.l = 0;
292 564ca709 2004-04-19 devnull }
293 564ca709 2004-04-19 devnull
294 564ca709 2004-04-19 devnull void
295 564ca709 2004-04-19 devnull oconst(Node *n, Node *res)
296 564ca709 2004-04-19 devnull {
297 564ca709 2004-04-19 devnull res->op = OCONST;
298 564ca709 2004-04-19 devnull res->type = n->type;
299 564ca709 2004-04-19 devnull res->store = n->store;
300 564ca709 2004-04-19 devnull res->store.comt = n->store.comt;
301 564ca709 2004-04-19 devnull }
302 564ca709 2004-04-19 devnull
303 564ca709 2004-04-19 devnull void
304 564ca709 2004-04-19 devnull oname(Node *n, Node *res)
305 564ca709 2004-04-19 devnull {
306 564ca709 2004-04-19 devnull Value *v;
307 564ca709 2004-04-19 devnull
308 564ca709 2004-04-19 devnull v = n->sym->v;
309 564ca709 2004-04-19 devnull if(v->set == 0)
310 564ca709 2004-04-19 devnull error("%s used but not set", n->sym->name);
311 564ca709 2004-04-19 devnull res->op = OCONST;
312 564ca709 2004-04-19 devnull res->type = v->type;
313 564ca709 2004-04-19 devnull res->store = v->store;
314 564ca709 2004-04-19 devnull res->store.comt = v->store.comt;
315 564ca709 2004-04-19 devnull }
316 564ca709 2004-04-19 devnull
317 564ca709 2004-04-19 devnull void
318 564ca709 2004-04-19 devnull octruct(Node *n, Node *res)
319 564ca709 2004-04-19 devnull {
320 564ca709 2004-04-19 devnull res->op = OCONST;
321 564ca709 2004-04-19 devnull res->type = TLIST;
322 564ca709 2004-04-19 devnull res->store.u.l = construct(n->left);
323 564ca709 2004-04-19 devnull }
324 564ca709 2004-04-19 devnull
325 564ca709 2004-04-19 devnull void
326 564ca709 2004-04-19 devnull oasgn(Node *n, Node *res)
327 564ca709 2004-04-19 devnull {
328 564ca709 2004-04-19 devnull Node *lp, r;
329 4f2ac1b7 2005-01-23 devnull Node aes;
330 564ca709 2004-04-19 devnull Value *v;
331 564ca709 2004-04-19 devnull
332 564ca709 2004-04-19 devnull lp = n->left;
333 564ca709 2004-04-19 devnull switch(lp->op) {
334 564ca709 2004-04-19 devnull case OINDM:
335 4f2ac1b7 2005-01-23 devnull expr(lp->left, &aes);
336 4f2ac1b7 2005-01-23 devnull if(aes.type == TREG)
337 7b8a3f12 2005-02-11 devnull windirreg(correg, aes.store.u.reg.name, n->right, res);
338 4f2ac1b7 2005-01-23 devnull else
339 4f2ac1b7 2005-01-23 devnull windir(cormap, aes, n->right, res);
340 564ca709 2004-04-19 devnull break;
341 564ca709 2004-04-19 devnull case OINDC:
342 4f2ac1b7 2005-01-23 devnull expr(lp->left, &aes);
343 4f2ac1b7 2005-01-23 devnull windir(symmap, aes, n->right, res);
344 564ca709 2004-04-19 devnull break;
345 564ca709 2004-04-19 devnull default:
346 4f2ac1b7 2005-01-23 devnull v = chklval(lp)->v;
347 564ca709 2004-04-19 devnull expr(n->right, &r);
348 564ca709 2004-04-19 devnull v->set = 1;
349 564ca709 2004-04-19 devnull v->type = r.type;
350 564ca709 2004-04-19 devnull v->store = r.store;
351 564ca709 2004-04-19 devnull res->op = OCONST;
352 564ca709 2004-04-19 devnull res->type = v->type;
353 564ca709 2004-04-19 devnull res->store = v->store;
354 564ca709 2004-04-19 devnull res->store.comt = v->store.comt;
355 564ca709 2004-04-19 devnull }
356 564ca709 2004-04-19 devnull }
357 564ca709 2004-04-19 devnull
358 564ca709 2004-04-19 devnull void
359 564ca709 2004-04-19 devnull oadd(Node *n, Node *res)
360 564ca709 2004-04-19 devnull {
361 564ca709 2004-04-19 devnull Node l, r;
362 564ca709 2004-04-19 devnull
363 564ca709 2004-04-19 devnull expr(n->left, &l);
364 564ca709 2004-04-19 devnull expr(n->right, &r);
365 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
366 564ca709 2004-04-19 devnull res->op = OCONST;
367 564ca709 2004-04-19 devnull res->type = TFLOAT;
368 564ca709 2004-04-19 devnull switch(l.type) {
369 564ca709 2004-04-19 devnull default:
370 564ca709 2004-04-19 devnull error("bad lhs type +");
371 564ca709 2004-04-19 devnull case TINT:
372 564ca709 2004-04-19 devnull switch(r.type) {
373 564ca709 2004-04-19 devnull case TINT:
374 564ca709 2004-04-19 devnull res->type = TINT;
375 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival+r.store.u.ival;
376 564ca709 2004-04-19 devnull break;
377 564ca709 2004-04-19 devnull case TFLOAT:
378 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival+r.store.u.fval;
379 564ca709 2004-04-19 devnull break;
380 564ca709 2004-04-19 devnull default:
381 564ca709 2004-04-19 devnull error("bad rhs type +");
382 564ca709 2004-04-19 devnull }
383 564ca709 2004-04-19 devnull break;
384 564ca709 2004-04-19 devnull case TFLOAT:
385 564ca709 2004-04-19 devnull switch(r.type) {
386 564ca709 2004-04-19 devnull case TINT:
387 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval+r.store.u.ival;
388 564ca709 2004-04-19 devnull break;
389 564ca709 2004-04-19 devnull case TFLOAT:
390 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval+r.store.u.fval;
391 564ca709 2004-04-19 devnull break;
392 564ca709 2004-04-19 devnull default:
393 564ca709 2004-04-19 devnull error("bad rhs type +");
394 564ca709 2004-04-19 devnull }
395 564ca709 2004-04-19 devnull break;
396 564ca709 2004-04-19 devnull case TSTRING:
397 564ca709 2004-04-19 devnull if(r.type == TSTRING) {
398 564ca709 2004-04-19 devnull res->type = TSTRING;
399 564ca709 2004-04-19 devnull res->store.fmt = 's';
400 fa325e9b 2020-01-10 cross res->store.u.string = stradd(l.store.u.string, r.store.u.string);
401 564ca709 2004-04-19 devnull break;
402 564ca709 2004-04-19 devnull }
403 564ca709 2004-04-19 devnull error("bad rhs for +");
404 564ca709 2004-04-19 devnull case TLIST:
405 564ca709 2004-04-19 devnull res->type = TLIST;
406 564ca709 2004-04-19 devnull switch(r.type) {
407 564ca709 2004-04-19 devnull case TLIST:
408 564ca709 2004-04-19 devnull res->store.u.l = addlist(l.store.u.l, r.store.u.l);
409 564ca709 2004-04-19 devnull break;
410 564ca709 2004-04-19 devnull default:
411 564ca709 2004-04-19 devnull r.left = 0;
412 564ca709 2004-04-19 devnull r.right = 0;
413 564ca709 2004-04-19 devnull res->store.u.l = addlist(l.store.u.l, construct(&r));
414 564ca709 2004-04-19 devnull break;
415 564ca709 2004-04-19 devnull }
416 564ca709 2004-04-19 devnull }
417 564ca709 2004-04-19 devnull }
418 564ca709 2004-04-19 devnull
419 564ca709 2004-04-19 devnull void
420 564ca709 2004-04-19 devnull osub(Node *n, Node *res)
421 564ca709 2004-04-19 devnull {
422 564ca709 2004-04-19 devnull Node l, r;
423 564ca709 2004-04-19 devnull
424 564ca709 2004-04-19 devnull expr(n->left, &l);
425 564ca709 2004-04-19 devnull expr(n->right, &r);
426 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
427 564ca709 2004-04-19 devnull res->op = OCONST;
428 564ca709 2004-04-19 devnull res->type = TFLOAT;
429 564ca709 2004-04-19 devnull switch(l.type) {
430 564ca709 2004-04-19 devnull default:
431 564ca709 2004-04-19 devnull error("bad lhs type -");
432 564ca709 2004-04-19 devnull case TINT:
433 564ca709 2004-04-19 devnull switch(r.type) {
434 564ca709 2004-04-19 devnull case TINT:
435 564ca709 2004-04-19 devnull res->type = TINT;
436 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival-r.store.u.ival;
437 564ca709 2004-04-19 devnull break;
438 564ca709 2004-04-19 devnull case TFLOAT:
439 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival-r.store.u.fval;
440 564ca709 2004-04-19 devnull break;
441 564ca709 2004-04-19 devnull default:
442 564ca709 2004-04-19 devnull error("bad rhs type -");
443 564ca709 2004-04-19 devnull }
444 564ca709 2004-04-19 devnull break;
445 564ca709 2004-04-19 devnull case TFLOAT:
446 564ca709 2004-04-19 devnull switch(r.type) {
447 564ca709 2004-04-19 devnull case TINT:
448 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval-r.store.u.ival;
449 564ca709 2004-04-19 devnull break;
450 564ca709 2004-04-19 devnull case TFLOAT:
451 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval-r.store.u.fval;
452 564ca709 2004-04-19 devnull break;
453 564ca709 2004-04-19 devnull default:
454 564ca709 2004-04-19 devnull error("bad rhs type -");
455 564ca709 2004-04-19 devnull }
456 564ca709 2004-04-19 devnull break;
457 564ca709 2004-04-19 devnull }
458 564ca709 2004-04-19 devnull }
459 564ca709 2004-04-19 devnull
460 564ca709 2004-04-19 devnull void
461 564ca709 2004-04-19 devnull omul(Node *n, Node *res)
462 564ca709 2004-04-19 devnull {
463 564ca709 2004-04-19 devnull Node l, r;
464 564ca709 2004-04-19 devnull
465 564ca709 2004-04-19 devnull expr(n->left, &l);
466 564ca709 2004-04-19 devnull expr(n->right, &r);
467 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
468 564ca709 2004-04-19 devnull res->op = OCONST;
469 564ca709 2004-04-19 devnull res->type = TFLOAT;
470 564ca709 2004-04-19 devnull switch(l.type) {
471 564ca709 2004-04-19 devnull default:
472 564ca709 2004-04-19 devnull error("bad lhs type *");
473 564ca709 2004-04-19 devnull case TINT:
474 564ca709 2004-04-19 devnull switch(r.type) {
475 564ca709 2004-04-19 devnull case TINT:
476 564ca709 2004-04-19 devnull res->type = TINT;
477 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival*r.store.u.ival;
478 564ca709 2004-04-19 devnull break;
479 564ca709 2004-04-19 devnull case TFLOAT:
480 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival*r.store.u.fval;
481 564ca709 2004-04-19 devnull break;
482 564ca709 2004-04-19 devnull default:
483 564ca709 2004-04-19 devnull error("bad rhs type *");
484 564ca709 2004-04-19 devnull }
485 564ca709 2004-04-19 devnull break;
486 564ca709 2004-04-19 devnull case TFLOAT:
487 564ca709 2004-04-19 devnull switch(r.type) {
488 564ca709 2004-04-19 devnull case TINT:
489 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval*r.store.u.ival;
490 564ca709 2004-04-19 devnull break;
491 564ca709 2004-04-19 devnull case TFLOAT:
492 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval*r.store.u.fval;
493 564ca709 2004-04-19 devnull break;
494 564ca709 2004-04-19 devnull default:
495 564ca709 2004-04-19 devnull error("bad rhs type *");
496 564ca709 2004-04-19 devnull }
497 564ca709 2004-04-19 devnull break;
498 564ca709 2004-04-19 devnull }
499 564ca709 2004-04-19 devnull }
500 564ca709 2004-04-19 devnull
501 564ca709 2004-04-19 devnull void
502 564ca709 2004-04-19 devnull odiv(Node *n, Node *res)
503 564ca709 2004-04-19 devnull {
504 564ca709 2004-04-19 devnull Node l, r;
505 564ca709 2004-04-19 devnull
506 564ca709 2004-04-19 devnull expr(n->left, &l);
507 564ca709 2004-04-19 devnull expr(n->right, &r);
508 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
509 564ca709 2004-04-19 devnull res->op = OCONST;
510 564ca709 2004-04-19 devnull res->type = TFLOAT;
511 564ca709 2004-04-19 devnull switch(l.type) {
512 564ca709 2004-04-19 devnull default:
513 564ca709 2004-04-19 devnull error("bad lhs type /");
514 564ca709 2004-04-19 devnull case TINT:
515 564ca709 2004-04-19 devnull switch(r.type) {
516 564ca709 2004-04-19 devnull case TINT:
517 564ca709 2004-04-19 devnull res->type = TINT;
518 564ca709 2004-04-19 devnull if(r.store.u.ival == 0)
519 564ca709 2004-04-19 devnull error("zero divide");
520 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival/r.store.u.ival;
521 564ca709 2004-04-19 devnull break;
522 564ca709 2004-04-19 devnull case TFLOAT:
523 564ca709 2004-04-19 devnull if(r.store.u.fval == 0)
524 564ca709 2004-04-19 devnull error("zero divide");
525 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival/r.store.u.fval;
526 564ca709 2004-04-19 devnull break;
527 564ca709 2004-04-19 devnull default:
528 564ca709 2004-04-19 devnull error("bad rhs type /");
529 564ca709 2004-04-19 devnull }
530 564ca709 2004-04-19 devnull break;
531 564ca709 2004-04-19 devnull case TFLOAT:
532 564ca709 2004-04-19 devnull switch(r.type) {
533 564ca709 2004-04-19 devnull case TINT:
534 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval/r.store.u.ival;
535 564ca709 2004-04-19 devnull break;
536 564ca709 2004-04-19 devnull case TFLOAT:
537 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval/r.store.u.fval;
538 564ca709 2004-04-19 devnull break;
539 564ca709 2004-04-19 devnull default:
540 564ca709 2004-04-19 devnull error("bad rhs type /");
541 564ca709 2004-04-19 devnull }
542 564ca709 2004-04-19 devnull break;
543 564ca709 2004-04-19 devnull }
544 564ca709 2004-04-19 devnull }
545 564ca709 2004-04-19 devnull
546 564ca709 2004-04-19 devnull void
547 564ca709 2004-04-19 devnull omod(Node *n, Node *res)
548 564ca709 2004-04-19 devnull {
549 564ca709 2004-04-19 devnull Node l, r;
550 564ca709 2004-04-19 devnull
551 564ca709 2004-04-19 devnull expr(n->left, &l);
552 564ca709 2004-04-19 devnull expr(n->right, &r);
553 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
554 564ca709 2004-04-19 devnull res->op = OCONST;
555 564ca709 2004-04-19 devnull res->type = TINT;
556 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
557 564ca709 2004-04-19 devnull error("bad expr type %");
558 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival%r.store.u.ival;
559 564ca709 2004-04-19 devnull }
560 564ca709 2004-04-19 devnull
561 564ca709 2004-04-19 devnull void
562 564ca709 2004-04-19 devnull olsh(Node *n, Node *res)
563 564ca709 2004-04-19 devnull {
564 564ca709 2004-04-19 devnull Node l, r;
565 564ca709 2004-04-19 devnull
566 564ca709 2004-04-19 devnull expr(n->left, &l);
567 564ca709 2004-04-19 devnull expr(n->right, &r);
568 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
569 564ca709 2004-04-19 devnull res->op = OCONST;
570 564ca709 2004-04-19 devnull res->type = TINT;
571 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
572 564ca709 2004-04-19 devnull error("bad expr type <<");
573 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival<<r.store.u.ival;
574 564ca709 2004-04-19 devnull }
575 564ca709 2004-04-19 devnull
576 564ca709 2004-04-19 devnull void
577 564ca709 2004-04-19 devnull orsh(Node *n, Node *res)
578 564ca709 2004-04-19 devnull {
579 564ca709 2004-04-19 devnull Node l, r;
580 564ca709 2004-04-19 devnull
581 564ca709 2004-04-19 devnull expr(n->left, &l);
582 564ca709 2004-04-19 devnull expr(n->right, &r);
583 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
584 564ca709 2004-04-19 devnull res->op = OCONST;
585 564ca709 2004-04-19 devnull res->type = TINT;
586 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
587 564ca709 2004-04-19 devnull error("bad expr type >>");
588 564ca709 2004-04-19 devnull res->store.u.ival = (unsigned)l.store.u.ival>>r.store.u.ival;
589 564ca709 2004-04-19 devnull }
590 564ca709 2004-04-19 devnull
591 564ca709 2004-04-19 devnull void
592 564ca709 2004-04-19 devnull olt(Node *n, Node *res)
593 564ca709 2004-04-19 devnull {
594 564ca709 2004-04-19 devnull Node l, r;
595 564ca709 2004-04-19 devnull
596 564ca709 2004-04-19 devnull expr(n->left, &l);
597 564ca709 2004-04-19 devnull expr(n->right, &r);
598 564ca709 2004-04-19 devnull
599 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
600 564ca709 2004-04-19 devnull res->op = OCONST;
601 564ca709 2004-04-19 devnull res->type = TINT;
602 564ca709 2004-04-19 devnull switch(l.type) {
603 564ca709 2004-04-19 devnull default:
604 564ca709 2004-04-19 devnull error("bad lhs type <");
605 564ca709 2004-04-19 devnull case TINT:
606 564ca709 2004-04-19 devnull switch(r.type) {
607 564ca709 2004-04-19 devnull case TINT:
608 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival < r.store.u.ival;
609 564ca709 2004-04-19 devnull break;
610 564ca709 2004-04-19 devnull case TFLOAT:
611 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival < r.store.u.fval;
612 564ca709 2004-04-19 devnull break;
613 564ca709 2004-04-19 devnull default:
614 564ca709 2004-04-19 devnull error("bad rhs type <");
615 564ca709 2004-04-19 devnull }
616 564ca709 2004-04-19 devnull break;
617 564ca709 2004-04-19 devnull case TFLOAT:
618 564ca709 2004-04-19 devnull switch(r.type) {
619 564ca709 2004-04-19 devnull case TINT:
620 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval < r.store.u.ival;
621 564ca709 2004-04-19 devnull break;
622 564ca709 2004-04-19 devnull case TFLOAT:
623 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval < r.store.u.fval;
624 564ca709 2004-04-19 devnull break;
625 564ca709 2004-04-19 devnull default:
626 564ca709 2004-04-19 devnull error("bad rhs type <");
627 564ca709 2004-04-19 devnull }
628 564ca709 2004-04-19 devnull break;
629 564ca709 2004-04-19 devnull }
630 564ca709 2004-04-19 devnull }
631 564ca709 2004-04-19 devnull
632 564ca709 2004-04-19 devnull void
633 564ca709 2004-04-19 devnull ogt(Node *n, Node *res)
634 564ca709 2004-04-19 devnull {
635 564ca709 2004-04-19 devnull Node l, r;
636 564ca709 2004-04-19 devnull
637 564ca709 2004-04-19 devnull expr(n->left, &l);
638 564ca709 2004-04-19 devnull expr(n->right, &r);
639 564ca709 2004-04-19 devnull res->store.fmt = 'D';
640 564ca709 2004-04-19 devnull res->op = OCONST;
641 564ca709 2004-04-19 devnull res->type = TINT;
642 564ca709 2004-04-19 devnull switch(l.type) {
643 564ca709 2004-04-19 devnull default:
644 564ca709 2004-04-19 devnull error("bad lhs type >");
645 564ca709 2004-04-19 devnull case TINT:
646 564ca709 2004-04-19 devnull switch(r.type) {
647 564ca709 2004-04-19 devnull case TINT:
648 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival > r.store.u.ival;
649 564ca709 2004-04-19 devnull break;
650 564ca709 2004-04-19 devnull case TFLOAT:
651 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival > r.store.u.fval;
652 564ca709 2004-04-19 devnull break;
653 564ca709 2004-04-19 devnull default:
654 564ca709 2004-04-19 devnull error("bad rhs type >");
655 564ca709 2004-04-19 devnull }
656 564ca709 2004-04-19 devnull break;
657 564ca709 2004-04-19 devnull case TFLOAT:
658 564ca709 2004-04-19 devnull switch(r.type) {
659 564ca709 2004-04-19 devnull case TINT:
660 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval > r.store.u.ival;
661 564ca709 2004-04-19 devnull break;
662 564ca709 2004-04-19 devnull case TFLOAT:
663 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval > r.store.u.fval;
664 564ca709 2004-04-19 devnull break;
665 564ca709 2004-04-19 devnull default:
666 564ca709 2004-04-19 devnull error("bad rhs type >");
667 564ca709 2004-04-19 devnull }
668 564ca709 2004-04-19 devnull break;
669 564ca709 2004-04-19 devnull }
670 564ca709 2004-04-19 devnull }
671 564ca709 2004-04-19 devnull
672 564ca709 2004-04-19 devnull void
673 564ca709 2004-04-19 devnull oleq(Node *n, Node *res)
674 564ca709 2004-04-19 devnull {
675 564ca709 2004-04-19 devnull Node l, r;
676 564ca709 2004-04-19 devnull
677 564ca709 2004-04-19 devnull expr(n->left, &l);
678 564ca709 2004-04-19 devnull expr(n->right, &r);
679 564ca709 2004-04-19 devnull res->store.fmt = 'D';
680 564ca709 2004-04-19 devnull res->op = OCONST;
681 564ca709 2004-04-19 devnull res->type = TINT;
682 564ca709 2004-04-19 devnull switch(l.type) {
683 564ca709 2004-04-19 devnull default:
684 564ca709 2004-04-19 devnull error("bad expr type <=");
685 564ca709 2004-04-19 devnull case TINT:
686 564ca709 2004-04-19 devnull switch(r.type) {
687 564ca709 2004-04-19 devnull case TINT:
688 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival <= r.store.u.ival;
689 564ca709 2004-04-19 devnull break;
690 564ca709 2004-04-19 devnull case TFLOAT:
691 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival <= r.store.u.fval;
692 564ca709 2004-04-19 devnull break;
693 564ca709 2004-04-19 devnull default:
694 564ca709 2004-04-19 devnull error("bad expr type <=");
695 564ca709 2004-04-19 devnull }
696 564ca709 2004-04-19 devnull break;
697 564ca709 2004-04-19 devnull case TFLOAT:
698 564ca709 2004-04-19 devnull switch(r.type) {
699 564ca709 2004-04-19 devnull case TINT:
700 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval <= r.store.u.ival;
701 564ca709 2004-04-19 devnull break;
702 564ca709 2004-04-19 devnull case TFLOAT:
703 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval <= r.store.u.fval;
704 564ca709 2004-04-19 devnull break;
705 564ca709 2004-04-19 devnull default:
706 564ca709 2004-04-19 devnull error("bad expr type <=");
707 564ca709 2004-04-19 devnull }
708 564ca709 2004-04-19 devnull break;
709 564ca709 2004-04-19 devnull }
710 564ca709 2004-04-19 devnull }
711 564ca709 2004-04-19 devnull
712 564ca709 2004-04-19 devnull void
713 564ca709 2004-04-19 devnull ogeq(Node *n, Node *res)
714 564ca709 2004-04-19 devnull {
715 564ca709 2004-04-19 devnull Node l, r;
716 564ca709 2004-04-19 devnull
717 564ca709 2004-04-19 devnull expr(n->left, &l);
718 564ca709 2004-04-19 devnull expr(n->right, &r);
719 564ca709 2004-04-19 devnull res->store.fmt = 'D';
720 564ca709 2004-04-19 devnull res->op = OCONST;
721 564ca709 2004-04-19 devnull res->type = TINT;
722 564ca709 2004-04-19 devnull switch(l.type) {
723 564ca709 2004-04-19 devnull default:
724 564ca709 2004-04-19 devnull error("bad lhs type >=");
725 564ca709 2004-04-19 devnull case TINT:
726 564ca709 2004-04-19 devnull switch(r.type) {
727 564ca709 2004-04-19 devnull case TINT:
728 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival >= r.store.u.ival;
729 564ca709 2004-04-19 devnull break;
730 564ca709 2004-04-19 devnull case TFLOAT:
731 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival >= r.store.u.fval;
732 564ca709 2004-04-19 devnull break;
733 564ca709 2004-04-19 devnull default:
734 564ca709 2004-04-19 devnull error("bad rhs type >=");
735 564ca709 2004-04-19 devnull }
736 564ca709 2004-04-19 devnull break;
737 564ca709 2004-04-19 devnull case TFLOAT:
738 564ca709 2004-04-19 devnull switch(r.type) {
739 564ca709 2004-04-19 devnull case TINT:
740 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval >= r.store.u.ival;
741 564ca709 2004-04-19 devnull break;
742 564ca709 2004-04-19 devnull case TFLOAT:
743 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval >= r.store.u.fval;
744 564ca709 2004-04-19 devnull break;
745 564ca709 2004-04-19 devnull default:
746 564ca709 2004-04-19 devnull error("bad rhs type >=");
747 564ca709 2004-04-19 devnull }
748 564ca709 2004-04-19 devnull break;
749 564ca709 2004-04-19 devnull }
750 564ca709 2004-04-19 devnull }
751 564ca709 2004-04-19 devnull
752 564ca709 2004-04-19 devnull void
753 564ca709 2004-04-19 devnull oeq(Node *n, Node *res)
754 564ca709 2004-04-19 devnull {
755 564ca709 2004-04-19 devnull Node l, r;
756 564ca709 2004-04-19 devnull
757 564ca709 2004-04-19 devnull expr(n->left, &l);
758 564ca709 2004-04-19 devnull expr(n->right, &r);
759 564ca709 2004-04-19 devnull res->store.fmt = 'D';
760 564ca709 2004-04-19 devnull res->op = OCONST;
761 564ca709 2004-04-19 devnull res->type = TINT;
762 564ca709 2004-04-19 devnull res->store.u.ival = 0;
763 564ca709 2004-04-19 devnull switch(l.type) {
764 564ca709 2004-04-19 devnull default:
765 564ca709 2004-04-19 devnull break;
766 564ca709 2004-04-19 devnull case TINT:
767 564ca709 2004-04-19 devnull switch(r.type) {
768 564ca709 2004-04-19 devnull case TINT:
769 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival == r.store.u.ival;
770 564ca709 2004-04-19 devnull break;
771 564ca709 2004-04-19 devnull case TFLOAT:
772 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival == r.store.u.fval;
773 564ca709 2004-04-19 devnull break;
774 564ca709 2004-04-19 devnull default:
775 564ca709 2004-04-19 devnull break;
776 564ca709 2004-04-19 devnull }
777 564ca709 2004-04-19 devnull break;
778 564ca709 2004-04-19 devnull case TFLOAT:
779 564ca709 2004-04-19 devnull switch(r.type) {
780 564ca709 2004-04-19 devnull case TINT:
781 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval == r.store.u.ival;
782 564ca709 2004-04-19 devnull break;
783 564ca709 2004-04-19 devnull case TFLOAT:
784 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval == r.store.u.fval;
785 564ca709 2004-04-19 devnull break;
786 564ca709 2004-04-19 devnull default:
787 564ca709 2004-04-19 devnull break;
788 564ca709 2004-04-19 devnull }
789 564ca709 2004-04-19 devnull break;
790 564ca709 2004-04-19 devnull case TSTRING:
791 564ca709 2004-04-19 devnull if(r.type == TSTRING) {
792 564ca709 2004-04-19 devnull res->store.u.ival = scmp(r.store.u.string, l.store.u.string);
793 564ca709 2004-04-19 devnull break;
794 564ca709 2004-04-19 devnull }
795 564ca709 2004-04-19 devnull break;
796 564ca709 2004-04-19 devnull case TLIST:
797 564ca709 2004-04-19 devnull if(r.type == TLIST) {
798 564ca709 2004-04-19 devnull res->store.u.ival = listcmp(l.store.u.l, r.store.u.l);
799 564ca709 2004-04-19 devnull break;
800 564ca709 2004-04-19 devnull }
801 564ca709 2004-04-19 devnull break;
802 564ca709 2004-04-19 devnull }
803 564ca709 2004-04-19 devnull if(n->op == ONEQ)
804 564ca709 2004-04-19 devnull res->store.u.ival = !res->store.u.ival;
805 564ca709 2004-04-19 devnull }
806 564ca709 2004-04-19 devnull
807 564ca709 2004-04-19 devnull
808 564ca709 2004-04-19 devnull void
809 564ca709 2004-04-19 devnull oland(Node *n, Node *res)
810 564ca709 2004-04-19 devnull {
811 564ca709 2004-04-19 devnull Node l, r;
812 564ca709 2004-04-19 devnull
813 564ca709 2004-04-19 devnull expr(n->left, &l);
814 564ca709 2004-04-19 devnull expr(n->right, &r);
815 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
816 564ca709 2004-04-19 devnull res->op = OCONST;
817 564ca709 2004-04-19 devnull res->type = TINT;
818 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
819 564ca709 2004-04-19 devnull error("bad expr type &");
820 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival&r.store.u.ival;
821 564ca709 2004-04-19 devnull }
822 564ca709 2004-04-19 devnull
823 564ca709 2004-04-19 devnull void
824 564ca709 2004-04-19 devnull oxor(Node *n, Node *res)
825 564ca709 2004-04-19 devnull {
826 564ca709 2004-04-19 devnull Node l, r;
827 564ca709 2004-04-19 devnull
828 564ca709 2004-04-19 devnull expr(n->left, &l);
829 564ca709 2004-04-19 devnull expr(n->right, &r);
830 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
831 564ca709 2004-04-19 devnull res->op = OCONST;
832 564ca709 2004-04-19 devnull res->type = TINT;
833 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
834 564ca709 2004-04-19 devnull error("bad expr type ^");
835 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival^r.store.u.ival;
836 564ca709 2004-04-19 devnull }
837 564ca709 2004-04-19 devnull
838 564ca709 2004-04-19 devnull void
839 564ca709 2004-04-19 devnull olor(Node *n, Node *res)
840 564ca709 2004-04-19 devnull {
841 564ca709 2004-04-19 devnull Node l, r;
842 564ca709 2004-04-19 devnull
843 564ca709 2004-04-19 devnull expr(n->left, &l);
844 564ca709 2004-04-19 devnull expr(n->right, &r);
845 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
846 564ca709 2004-04-19 devnull res->op = OCONST;
847 564ca709 2004-04-19 devnull res->type = TINT;
848 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
849 564ca709 2004-04-19 devnull error("bad expr type |");
850 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival|r.store.u.ival;
851 564ca709 2004-04-19 devnull }
852 564ca709 2004-04-19 devnull
853 564ca709 2004-04-19 devnull void
854 564ca709 2004-04-19 devnull ocand(Node *n, Node *res)
855 564ca709 2004-04-19 devnull {
856 564ca709 2004-04-19 devnull Node l, r;
857 564ca709 2004-04-19 devnull
858 0c9c620f 2010-03-10 rsc res->store.fmt = 'D';
859 564ca709 2004-04-19 devnull res->op = OCONST;
860 564ca709 2004-04-19 devnull res->type = TINT;
861 564ca709 2004-04-19 devnull res->store.u.ival = 0;
862 564ca709 2004-04-19 devnull expr(n->left, &l);
863 0c9c620f 2010-03-10 rsc res->store.fmt = l.store.fmt;
864 564ca709 2004-04-19 devnull if(bool(&l) == 0)
865 564ca709 2004-04-19 devnull return;
866 564ca709 2004-04-19 devnull expr(n->right, &r);
867 564ca709 2004-04-19 devnull if(bool(&r) == 0)
868 564ca709 2004-04-19 devnull return;
869 564ca709 2004-04-19 devnull res->store.u.ival = 1;
870 564ca709 2004-04-19 devnull }
871 564ca709 2004-04-19 devnull
872 564ca709 2004-04-19 devnull void
873 564ca709 2004-04-19 devnull onot(Node *n, Node *res)
874 564ca709 2004-04-19 devnull {
875 564ca709 2004-04-19 devnull Node l;
876 564ca709 2004-04-19 devnull
877 564ca709 2004-04-19 devnull res->op = OCONST;
878 564ca709 2004-04-19 devnull res->type = TINT;
879 564ca709 2004-04-19 devnull res->store.u.ival = 0;
880 564ca709 2004-04-19 devnull expr(n->left, &l);
881 564ca709 2004-04-19 devnull if(bool(&l) == 0)
882 564ca709 2004-04-19 devnull res->store.u.ival = 1;
883 564ca709 2004-04-19 devnull }
884 564ca709 2004-04-19 devnull
885 564ca709 2004-04-19 devnull void
886 564ca709 2004-04-19 devnull ocor(Node *n, Node *res)
887 564ca709 2004-04-19 devnull {
888 564ca709 2004-04-19 devnull Node l, r;
889 564ca709 2004-04-19 devnull
890 564ca709 2004-04-19 devnull res->op = OCONST;
891 564ca709 2004-04-19 devnull res->type = TINT;
892 564ca709 2004-04-19 devnull res->store.u.ival = 0;
893 564ca709 2004-04-19 devnull expr(n->left, &l);
894 564ca709 2004-04-19 devnull if(bool(&l)) {
895 564ca709 2004-04-19 devnull res->store.u.ival = 1;
896 564ca709 2004-04-19 devnull return;
897 564ca709 2004-04-19 devnull }
898 564ca709 2004-04-19 devnull expr(n->right, &r);
899 564ca709 2004-04-19 devnull if(bool(&r)) {
900 564ca709 2004-04-19 devnull res->store.u.ival = 1;
901 564ca709 2004-04-19 devnull return;
902 564ca709 2004-04-19 devnull }
903 564ca709 2004-04-19 devnull }
904 564ca709 2004-04-19 devnull
905 564ca709 2004-04-19 devnull void
906 564ca709 2004-04-19 devnull oeinc(Node *n, Node *res)
907 564ca709 2004-04-19 devnull {
908 564ca709 2004-04-19 devnull Value *v;
909 564ca709 2004-04-19 devnull
910 4f2ac1b7 2005-01-23 devnull v = chklval(n->left)->v;
911 564ca709 2004-04-19 devnull res->op = OCONST;
912 564ca709 2004-04-19 devnull res->type = v->type;
913 564ca709 2004-04-19 devnull switch(v->type) {
914 564ca709 2004-04-19 devnull case TINT:
915 564ca709 2004-04-19 devnull if(n->op == OEDEC)
916 564ca709 2004-04-19 devnull v->store.u.ival -= fmtsize(v);
917 564ca709 2004-04-19 devnull else
918 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
919 fa325e9b 2020-01-10 cross break;
920 564ca709 2004-04-19 devnull case TFLOAT:
921 564ca709 2004-04-19 devnull if(n->op == OEDEC)
922 564ca709 2004-04-19 devnull v->store.u.fval--;
923 564ca709 2004-04-19 devnull else
924 564ca709 2004-04-19 devnull v->store.u.fval++;
925 564ca709 2004-04-19 devnull break;
926 564ca709 2004-04-19 devnull default:
927 564ca709 2004-04-19 devnull error("bad type for pre --/++");
928 564ca709 2004-04-19 devnull }
929 564ca709 2004-04-19 devnull res->store = v->store;
930 564ca709 2004-04-19 devnull }
931 564ca709 2004-04-19 devnull
932 564ca709 2004-04-19 devnull void
933 564ca709 2004-04-19 devnull opinc(Node *n, Node *res)
934 564ca709 2004-04-19 devnull {
935 564ca709 2004-04-19 devnull Value *v;
936 564ca709 2004-04-19 devnull
937 4f2ac1b7 2005-01-23 devnull v = chklval(n->left)->v;
938 564ca709 2004-04-19 devnull res->op = OCONST;
939 564ca709 2004-04-19 devnull res->type = v->type;
940 564ca709 2004-04-19 devnull res->store = v->store;
941 564ca709 2004-04-19 devnull switch(v->type) {
942 564ca709 2004-04-19 devnull case TINT:
943 564ca709 2004-04-19 devnull if(n->op == OPDEC)
944 564ca709 2004-04-19 devnull v->store.u.ival -= fmtsize(v);
945 564ca709 2004-04-19 devnull else
946 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
947 fa325e9b 2020-01-10 cross break;
948 564ca709 2004-04-19 devnull case TFLOAT:
949 564ca709 2004-04-19 devnull if(n->op == OPDEC)
950 564ca709 2004-04-19 devnull v->store.u.fval--;
951 564ca709 2004-04-19 devnull else
952 564ca709 2004-04-19 devnull v->store.u.fval++;
953 564ca709 2004-04-19 devnull break;
954 564ca709 2004-04-19 devnull default:
955 564ca709 2004-04-19 devnull error("bad type for post --/++");
956 564ca709 2004-04-19 devnull }
957 564ca709 2004-04-19 devnull }
958 564ca709 2004-04-19 devnull
959 564ca709 2004-04-19 devnull void
960 564ca709 2004-04-19 devnull ocall(Node *n, Node *res)
961 564ca709 2004-04-19 devnull {
962 564ca709 2004-04-19 devnull Lsym *s;
963 564ca709 2004-04-19 devnull Rplace *rsav;
964 564ca709 2004-04-19 devnull
965 564ca709 2004-04-19 devnull res->op = OCONST; /* Default return value */
966 564ca709 2004-04-19 devnull res->type = TLIST;
967 564ca709 2004-04-19 devnull res->store.u.l = 0;
968 564ca709 2004-04-19 devnull
969 4f2ac1b7 2005-01-23 devnull s = chklval(n->left);
970 564ca709 2004-04-19 devnull if(n->builtin && !s->builtin){
971 564ca709 2004-04-19 devnull error("no builtin %s", s->name);
972 564ca709 2004-04-19 devnull return;
973 564ca709 2004-04-19 devnull }
974 564ca709 2004-04-19 devnull if(s->builtin && (n->builtin || s->proc == 0)) {
975 564ca709 2004-04-19 devnull (*s->builtin)(res, n->right);
976 564ca709 2004-04-19 devnull return;
977 564ca709 2004-04-19 devnull }
978 564ca709 2004-04-19 devnull if(s->proc == 0)
979 564ca709 2004-04-19 devnull error("no function %s", s->name);
980 564ca709 2004-04-19 devnull
981 564ca709 2004-04-19 devnull rsav = ret;
982 564ca709 2004-04-19 devnull call(s->name, n->right, s->proc->left, s->proc->right, res);
983 564ca709 2004-04-19 devnull ret = rsav;
984 564ca709 2004-04-19 devnull }
985 564ca709 2004-04-19 devnull
986 564ca709 2004-04-19 devnull void
987 564ca709 2004-04-19 devnull ofmt(Node *n, Node *res)
988 564ca709 2004-04-19 devnull {
989 564ca709 2004-04-19 devnull expr(n->left, res);
990 564ca709 2004-04-19 devnull res->store.fmt = n->right->store.u.ival;
991 564ca709 2004-04-19 devnull }
992 564ca709 2004-04-19 devnull
993 564ca709 2004-04-19 devnull void
994 4f2ac1b7 2005-01-23 devnull ouplus(Node *n, Node *res)
995 4f2ac1b7 2005-01-23 devnull {
996 4f2ac1b7 2005-01-23 devnull expr(n->left, res);
997 4f2ac1b7 2005-01-23 devnull }
998 4f2ac1b7 2005-01-23 devnull
999 4f2ac1b7 2005-01-23 devnull void
1000 564ca709 2004-04-19 devnull owhat(Node *n, Node *res)
1001 564ca709 2004-04-19 devnull {
1002 564ca709 2004-04-19 devnull res->op = OCONST; /* Default return value */
1003 564ca709 2004-04-19 devnull res->type = TLIST;
1004 564ca709 2004-04-19 devnull res->store.u.l = 0;
1005 564ca709 2004-04-19 devnull whatis(n->sym);
1006 564ca709 2004-04-19 devnull }
1007 564ca709 2004-04-19 devnull
1008 e637c944 2004-04-20 devnull void (*expop[NUMO])(Node*, Node*);
1009 e637c944 2004-04-20 devnull
1010 e637c944 2004-04-20 devnull static void
1011 e637c944 2004-04-20 devnull initexpop(void)
1012 564ca709 2004-04-19 devnull {
1013 e637c944 2004-04-20 devnull expop[ONAME] = oname;
1014 e637c944 2004-04-20 devnull expop[OCONST] = oconst;
1015 e637c944 2004-04-20 devnull expop[OMUL] = omul;
1016 e637c944 2004-04-20 devnull expop[ODIV] = odiv;
1017 e637c944 2004-04-20 devnull expop[OMOD] = omod;
1018 e637c944 2004-04-20 devnull expop[OADD] = oadd;
1019 e637c944 2004-04-20 devnull expop[OSUB] = osub;
1020 e637c944 2004-04-20 devnull expop[ORSH] = orsh;
1021 e637c944 2004-04-20 devnull expop[OLSH] = olsh;
1022 e637c944 2004-04-20 devnull expop[OLT] = olt;
1023 e637c944 2004-04-20 devnull expop[OGT] = ogt;
1024 e637c944 2004-04-20 devnull expop[OLEQ] = oleq;
1025 e637c944 2004-04-20 devnull expop[OGEQ] = ogeq;
1026 e637c944 2004-04-20 devnull expop[OEQ] = oeq;
1027 e637c944 2004-04-20 devnull expop[ONEQ] = oeq;
1028 e637c944 2004-04-20 devnull expop[OLAND] = oland;
1029 e637c944 2004-04-20 devnull expop[OXOR] = oxor;
1030 e637c944 2004-04-20 devnull expop[OLOR] = olor;
1031 e637c944 2004-04-20 devnull expop[OCAND] = ocand;
1032 e637c944 2004-04-20 devnull expop[OCOR] = ocor;
1033 e637c944 2004-04-20 devnull expop[OASGN] = oasgn;
1034 e637c944 2004-04-20 devnull expop[OINDM] = oindm;
1035 e637c944 2004-04-20 devnull expop[OEDEC] = oeinc;
1036 e637c944 2004-04-20 devnull expop[OEINC] = oeinc;
1037 e637c944 2004-04-20 devnull expop[OPINC] = opinc;
1038 e637c944 2004-04-20 devnull expop[OPDEC] = opinc;
1039 e637c944 2004-04-20 devnull expop[ONOT] = onot;
1040 e637c944 2004-04-20 devnull expop[OIF] = 0;
1041 e637c944 2004-04-20 devnull expop[ODO] = 0;
1042 e637c944 2004-04-20 devnull expop[OLIST] = olist;
1043 e637c944 2004-04-20 devnull expop[OCALL] = ocall;
1044 e637c944 2004-04-20 devnull expop[OCTRUCT] = octruct;
1045 e637c944 2004-04-20 devnull expop[OWHILE] =0;
1046 e637c944 2004-04-20 devnull expop[OELSE] = 0;
1047 e637c944 2004-04-20 devnull expop[OHEAD] = ohead;
1048 e637c944 2004-04-20 devnull expop[OTAIL] = otail;
1049 e637c944 2004-04-20 devnull expop[OAPPEND] = oappend;
1050 e637c944 2004-04-20 devnull expop[ORET] = 0;
1051 e637c944 2004-04-20 devnull expop[OINDEX] =oindex;
1052 e637c944 2004-04-20 devnull expop[OINDC] = oindc;
1053 e637c944 2004-04-20 devnull expop[ODOT] = odot;
1054 e637c944 2004-04-20 devnull expop[OLOCAL] =0;
1055 e637c944 2004-04-20 devnull expop[OFRAME] = oframe;
1056 e637c944 2004-04-20 devnull expop[OCOMPLEX] =0;
1057 e637c944 2004-04-20 devnull expop[ODELETE] = odelete;
1058 e637c944 2004-04-20 devnull expop[OCAST] = ocast;
1059 e637c944 2004-04-20 devnull expop[OFMT] = ofmt;
1060 e637c944 2004-04-20 devnull expop[OEVAL] = oeval;
1061 e637c944 2004-04-20 devnull expop[OWHAT] = owhat;
1062 4f2ac1b7 2005-01-23 devnull expop[OUPLUS] = ouplus;
1063 a0f1e21f 2004-04-20 devnull }
1064 e637c944 2004-04-20 devnull
1065 e637c944 2004-04-20 devnull void
1066 e637c944 2004-04-20 devnull initexpr(void)
1067 e637c944 2004-04-20 devnull {
1068 e637c944 2004-04-20 devnull initfsize();
1069 e637c944 2004-04-20 devnull initexpop();
1070 e637c944 2004-04-20 devnull }
1071 e637c944 2004-04-20 devnull
1072 4f2ac1b7 2005-01-23 devnull int
1073 443d6288 2012-02-19 rsc acidregsrw(Regs *r, char *name, u64int *u, int isr)
1074 4f2ac1b7 2005-01-23 devnull {
1075 4f2ac1b7 2005-01-23 devnull Lsym *l;
1076 4f2ac1b7 2005-01-23 devnull Value *v;
1077 4f2ac1b7 2005-01-23 devnull Node *n;
1078 443d6288 2012-02-19 rsc u64int addr;
1079 4f2ac1b7 2005-01-23 devnull
1080 4f2ac1b7 2005-01-23 devnull if(!isr){
1081 4f2ac1b7 2005-01-23 devnull werrstr("cannot write registers");
1082 4f2ac1b7 2005-01-23 devnull return -1;
1083 4f2ac1b7 2005-01-23 devnull }
1084 4f2ac1b7 2005-01-23 devnull USED(r);
1085 4f2ac1b7 2005-01-23 devnull l = look(name);
1086 4f2ac1b7 2005-01-23 devnull if(l == nil){
1087 4f2ac1b7 2005-01-23 devnull werrstr("register %s not found", name);
1088 4f2ac1b7 2005-01-23 devnull return -1;
1089 4f2ac1b7 2005-01-23 devnull }
1090 4f2ac1b7 2005-01-23 devnull v = l->v;
1091 4f2ac1b7 2005-01-23 devnull switch(v->type){
1092 4f2ac1b7 2005-01-23 devnull default:
1093 4f2ac1b7 2005-01-23 devnull werrstr("*%s: bad type", name);
1094 4f2ac1b7 2005-01-23 devnull return -1;
1095 4f2ac1b7 2005-01-23 devnull case TREG:
1096 4f2ac1b7 2005-01-23 devnull if(correg == nil){
1097 4f2ac1b7 2005-01-23 devnull werrstr("*%s: register %s not mapped", name, v->store.u.reg);
1098 4f2ac1b7 2005-01-23 devnull return -1;
1099 4f2ac1b7 2005-01-23 devnull }
1100 7b8a3f12 2005-02-11 devnull return rget(correg, v->store.u.reg.name, u);
1101 4f2ac1b7 2005-01-23 devnull case TCON:
1102 4f2ac1b7 2005-01-23 devnull n = v->store.u.con;
1103 4f2ac1b7 2005-01-23 devnull if(n->op != OCONST || n->type != TINT){
1104 4f2ac1b7 2005-01-23 devnull werrstr("*%s: bad register constant", name);
1105 4f2ac1b7 2005-01-23 devnull return -1;
1106 4f2ac1b7 2005-01-23 devnull }
1107 4f2ac1b7 2005-01-23 devnull *u = n->store.u.ival;
1108 4f2ac1b7 2005-01-23 devnull return 0;
1109 4f2ac1b7 2005-01-23 devnull case TINT:
1110 4f2ac1b7 2005-01-23 devnull if(cormap == nil){
1111 4f2ac1b7 2005-01-23 devnull werrstr("*%s: core not mapped", name);
1112 4f2ac1b7 2005-01-23 devnull return -1;
1113 4f2ac1b7 2005-01-23 devnull }
1114 4f2ac1b7 2005-01-23 devnull addr = v->store.u.ival;
1115 4f2ac1b7 2005-01-23 devnull /* XXX should use format to determine size */
1116 4a000a28 2012-03-05 rsc if(geta(cormap, addr, u) < 0)
1117 4f2ac1b7 2005-01-23 devnull return -1;
1118 4f2ac1b7 2005-01-23 devnull return 0;
1119 4f2ac1b7 2005-01-23 devnull }
1120 4f2ac1b7 2005-01-23 devnull }