174a4d8c2SCharles.Forsyth #include <lib9.h>
274a4d8c2SCharles.Forsyth #include <bio.h>
374a4d8c2SCharles.Forsyth #include <ctype.h>
474a4d8c2SCharles.Forsyth #include "mach.h"
574a4d8c2SCharles.Forsyth #define Extern extern
674a4d8c2SCharles.Forsyth #include "acid.h"
774a4d8c2SCharles.Forsyth
874a4d8c2SCharles.Forsyth static int fsize[] =
974a4d8c2SCharles.Forsyth {
1074a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 0-7 */
1174a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 8-15 */
1274a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 16-23 */
1374a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 24-31 */
1474a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 32-39 */
1574a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 40-47 */
1674a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 48-55 */
1774a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0,0, /* 56-63 */
1874a4d8c2SCharles.Forsyth 0, /* 64 */
1974a4d8c2SCharles.Forsyth 4, /* 65 ['A'] 4, */
2074a4d8c2SCharles.Forsyth 4, /* 66 ['B'] 4, */
2174a4d8c2SCharles.Forsyth 1, /* 67 ['C'] 1, */
2274a4d8c2SCharles.Forsyth 4, /* 68 ['D'] 4, */
2374a4d8c2SCharles.Forsyth 0, /* 69 */
2474a4d8c2SCharles.Forsyth 8, /* 70 ['F'] 8, */
2574a4d8c2SCharles.Forsyth 8, /* 71 ['G'] 8, */
2674a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0, /* 72-78 */
2774a4d8c2SCharles.Forsyth 4, /* 79 ['O'] 4, */
2874a4d8c2SCharles.Forsyth 0, /* 80 */
2974a4d8c2SCharles.Forsyth 4, /* 81 ['Q'] 4, */
3074a4d8c2SCharles.Forsyth 4, /* 82 ['R'] 4, */
3174a4d8c2SCharles.Forsyth 4, /* 83 ['S'] 4, */
3274a4d8c2SCharles.Forsyth 0, /* 84 */
3374a4d8c2SCharles.Forsyth 4, /* 85 ['U'] 4, */
3474a4d8c2SCharles.Forsyth 8, /* 86 ['V'] 8, */
3574a4d8c2SCharles.Forsyth 0, /* 87 */
3674a4d8c2SCharles.Forsyth 4, /* 88 ['X'] 4, */
3774a4d8c2SCharles.Forsyth 8, /* 89 ['Y'] 8, */
3874a4d8c2SCharles.Forsyth 8, /* 90 ['Z'] 8, */
3974a4d8c2SCharles.Forsyth 0,0,0,0,0,0, /* 91-96 */
4074a4d8c2SCharles.Forsyth 4, /* 97 ['a'] 4, */
4174a4d8c2SCharles.Forsyth 1, /* 98 ['b'] 1, */
4274a4d8c2SCharles.Forsyth 1, /* 99 ['c'] 1, */
4374a4d8c2SCharles.Forsyth 2, /* 100 ['d'] 2, */
4474a4d8c2SCharles.Forsyth 0, /* 101 */
4574a4d8c2SCharles.Forsyth 4, /* 102 ['f'] 4, */
4674a4d8c2SCharles.Forsyth 4, /* 103 ['g'] 4, */
4774a4d8c2SCharles.Forsyth 0,0,0,0,0,0,0, /* 104-110 */
4874a4d8c2SCharles.Forsyth 2, /* 111 ['o'] 2, */
4974a4d8c2SCharles.Forsyth 0, /* 112 */
5074a4d8c2SCharles.Forsyth 2, /* 113 ['q'] 2, */
5174a4d8c2SCharles.Forsyth 2, /* 114 ['r'] 2, */
5274a4d8c2SCharles.Forsyth 4, /* 115 ['s'] 4, */
5374a4d8c2SCharles.Forsyth 0, /* 116 */
5474a4d8c2SCharles.Forsyth 2, /* 117 ['u'] 2, */
5574a4d8c2SCharles.Forsyth 0,0, /* 118-119 */
5674a4d8c2SCharles.Forsyth 2, /* 120 ['x'] 2, */
5774a4d8c2SCharles.Forsyth };
5874a4d8c2SCharles.Forsyth
5974a4d8c2SCharles.Forsyth int
fmtsize(Value * v)6074a4d8c2SCharles.Forsyth fmtsize(Value *v)
6174a4d8c2SCharles.Forsyth {
6274a4d8c2SCharles.Forsyth int ret;
6374a4d8c2SCharles.Forsyth
6474a4d8c2SCharles.Forsyth switch(v->vstore.fmt) {
6574a4d8c2SCharles.Forsyth default:
6674a4d8c2SCharles.Forsyth return fsize[v->vstore.fmt];
6774a4d8c2SCharles.Forsyth case 'i':
6874a4d8c2SCharles.Forsyth case 'I':
6974a4d8c2SCharles.Forsyth if(v->type != TINT || machdata == 0)
7074a4d8c2SCharles.Forsyth error("no size for i fmt pointer ++/--");
7174a4d8c2SCharles.Forsyth ret = (*machdata->instsize)(cormap, v->vstore.u0.sival);
7274a4d8c2SCharles.Forsyth if(ret < 0) {
7374a4d8c2SCharles.Forsyth ret = (*machdata->instsize)(symmap, v->vstore.u0.sival);
7474a4d8c2SCharles.Forsyth if(ret < 0)
7574a4d8c2SCharles.Forsyth error("%r");
7674a4d8c2SCharles.Forsyth }
7774a4d8c2SCharles.Forsyth return ret;
7874a4d8c2SCharles.Forsyth }
7974a4d8c2SCharles.Forsyth }
8074a4d8c2SCharles.Forsyth
8174a4d8c2SCharles.Forsyth void
chklval(Node * lp)8274a4d8c2SCharles.Forsyth chklval(Node *lp)
8374a4d8c2SCharles.Forsyth {
8474a4d8c2SCharles.Forsyth if(lp->op != ONAME)
8574a4d8c2SCharles.Forsyth error("need l-value");
8674a4d8c2SCharles.Forsyth }
8774a4d8c2SCharles.Forsyth
8874a4d8c2SCharles.Forsyth void
olist(Node * n,Node * res)8974a4d8c2SCharles.Forsyth olist(Node *n, Node *res)
9074a4d8c2SCharles.Forsyth {
9174a4d8c2SCharles.Forsyth expr(n->left, res);
9274a4d8c2SCharles.Forsyth expr(n->right, res);
9374a4d8c2SCharles.Forsyth }
9474a4d8c2SCharles.Forsyth
9574a4d8c2SCharles.Forsyth void
oeval(Node * n,Node * res)9674a4d8c2SCharles.Forsyth oeval(Node *n, Node *res)
9774a4d8c2SCharles.Forsyth {
9874a4d8c2SCharles.Forsyth expr(n->left, res);
9974a4d8c2SCharles.Forsyth if(res->type != TCODE)
10074a4d8c2SCharles.Forsyth error("bad type for eval");
10174a4d8c2SCharles.Forsyth expr(res->nstore.u0.scc, res);
10274a4d8c2SCharles.Forsyth }
10374a4d8c2SCharles.Forsyth
10474a4d8c2SCharles.Forsyth void
ocast(Node * n,Node * res)10574a4d8c2SCharles.Forsyth ocast(Node *n, Node *res)
10674a4d8c2SCharles.Forsyth {
10774a4d8c2SCharles.Forsyth if(n->sym->lt == 0)
10874a4d8c2SCharles.Forsyth error("%s is not a complex type", n->sym->name);
10974a4d8c2SCharles.Forsyth
11074a4d8c2SCharles.Forsyth expr(n->left, res);
11174a4d8c2SCharles.Forsyth res->nstore.comt = n->sym->lt;
11274a4d8c2SCharles.Forsyth res->nstore.fmt = 'a';
11374a4d8c2SCharles.Forsyth }
11474a4d8c2SCharles.Forsyth
11574a4d8c2SCharles.Forsyth void
oindm(Node * n,Node * res)11674a4d8c2SCharles.Forsyth oindm(Node *n, Node *res)
11774a4d8c2SCharles.Forsyth {
11874a4d8c2SCharles.Forsyth Map *m;
11974a4d8c2SCharles.Forsyth Node l;
12074a4d8c2SCharles.Forsyth
12174a4d8c2SCharles.Forsyth m = cormap;
12274a4d8c2SCharles.Forsyth if(m == 0)
12374a4d8c2SCharles.Forsyth m = symmap;
12474a4d8c2SCharles.Forsyth expr(n->left, &l);
12574a4d8c2SCharles.Forsyth if(l.type != TINT)
12674a4d8c2SCharles.Forsyth error("bad type for *");
12774a4d8c2SCharles.Forsyth if(m == 0)
12874a4d8c2SCharles.Forsyth error("no map for *");
12974a4d8c2SCharles.Forsyth indir(m, l.nstore.u0.sival, l.nstore.fmt, res);
13074a4d8c2SCharles.Forsyth res->nstore.comt = l.nstore.comt;
13174a4d8c2SCharles.Forsyth }
13274a4d8c2SCharles.Forsyth
13374a4d8c2SCharles.Forsyth void
oindc(Node * n,Node * res)13474a4d8c2SCharles.Forsyth oindc(Node *n, Node *res)
13574a4d8c2SCharles.Forsyth {
13674a4d8c2SCharles.Forsyth Map *m;
13774a4d8c2SCharles.Forsyth Node l;
13874a4d8c2SCharles.Forsyth
13974a4d8c2SCharles.Forsyth m = symmap;
14074a4d8c2SCharles.Forsyth if(m == 0)
14174a4d8c2SCharles.Forsyth m = cormap;
14274a4d8c2SCharles.Forsyth expr(n->left, &l);
14374a4d8c2SCharles.Forsyth if(l.type != TINT)
14474a4d8c2SCharles.Forsyth error("bad type for @");
14574a4d8c2SCharles.Forsyth if(m == 0)
14674a4d8c2SCharles.Forsyth error("no map for @");
14774a4d8c2SCharles.Forsyth indir(m, l.nstore.u0.sival, l.nstore.fmt, res);
14874a4d8c2SCharles.Forsyth res->nstore.comt = l.nstore.comt;
14974a4d8c2SCharles.Forsyth }
15074a4d8c2SCharles.Forsyth
15174a4d8c2SCharles.Forsyth void
oframe(Node * n,Node * res)15274a4d8c2SCharles.Forsyth oframe(Node *n, Node *res)
15374a4d8c2SCharles.Forsyth {
15474a4d8c2SCharles.Forsyth char *p;
15574a4d8c2SCharles.Forsyth Node *lp;
156d67b7dadSforsyth uvlong ival;
15774a4d8c2SCharles.Forsyth Frtype *f;
15874a4d8c2SCharles.Forsyth
15974a4d8c2SCharles.Forsyth p = n->sym->name;
16074a4d8c2SCharles.Forsyth while(*p && *p == '$')
16174a4d8c2SCharles.Forsyth p++;
16274a4d8c2SCharles.Forsyth lp = n->left;
16374a4d8c2SCharles.Forsyth if(localaddr(cormap, p, lp->sym->name, &ival, rget) < 0)
16474a4d8c2SCharles.Forsyth error("colon: %r");
16574a4d8c2SCharles.Forsyth
16674a4d8c2SCharles.Forsyth res->nstore.u0.sival = ival;
16774a4d8c2SCharles.Forsyth res->op = OCONST;
16874a4d8c2SCharles.Forsyth res->nstore.fmt = 'X';
16974a4d8c2SCharles.Forsyth res->type = TINT;
17074a4d8c2SCharles.Forsyth
17174a4d8c2SCharles.Forsyth /* Try and set comt */
17274a4d8c2SCharles.Forsyth for(f = n->sym->local; f; f = f->next) {
17374a4d8c2SCharles.Forsyth if(f->var == lp->sym) {
17474a4d8c2SCharles.Forsyth res->nstore.comt = f->type;
17574a4d8c2SCharles.Forsyth res->nstore.fmt = 'a';
17674a4d8c2SCharles.Forsyth break;
17774a4d8c2SCharles.Forsyth }
17874a4d8c2SCharles.Forsyth }
17974a4d8c2SCharles.Forsyth }
18074a4d8c2SCharles.Forsyth
18174a4d8c2SCharles.Forsyth void
oindex(Node * n,Node * res)18274a4d8c2SCharles.Forsyth oindex(Node *n, Node *res)
18374a4d8c2SCharles.Forsyth {
18474a4d8c2SCharles.Forsyth Node l, r;
18574a4d8c2SCharles.Forsyth
18674a4d8c2SCharles.Forsyth expr(n->left, &l);
18774a4d8c2SCharles.Forsyth expr(n->right, &r);
18874a4d8c2SCharles.Forsyth
18974a4d8c2SCharles.Forsyth if(r.type != TINT)
19074a4d8c2SCharles.Forsyth error("bad type for []");
19174a4d8c2SCharles.Forsyth
19274a4d8c2SCharles.Forsyth switch(l.type) {
19374a4d8c2SCharles.Forsyth default:
19474a4d8c2SCharles.Forsyth error("lhs[] has bad type");
19574a4d8c2SCharles.Forsyth case TINT:
19674a4d8c2SCharles.Forsyth indir(cormap, l.nstore.u0.sival+(r.nstore.u0.sival*fsize[l.nstore.fmt]), l.nstore.fmt, res);
19774a4d8c2SCharles.Forsyth res->nstore.comt = l.nstore.comt;
19874a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
19974a4d8c2SCharles.Forsyth break;
20074a4d8c2SCharles.Forsyth case TLIST:
20174a4d8c2SCharles.Forsyth nthelem(l.nstore.u0.sl, r.nstore.u0.sival, res);
20274a4d8c2SCharles.Forsyth break;
20374a4d8c2SCharles.Forsyth case TSTRING:
20474a4d8c2SCharles.Forsyth res->nstore.u0.sival = 0;
20574a4d8c2SCharles.Forsyth if(r.nstore.u0.sival >= 0 && r.nstore.u0.sival < l.nstore.u0.sstring->len) {
20674a4d8c2SCharles.Forsyth int xx8; /* to get around bug in vc */
20774a4d8c2SCharles.Forsyth xx8 = r.nstore.u0.sival;
20874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sstring->string[xx8];
20974a4d8c2SCharles.Forsyth }
21074a4d8c2SCharles.Forsyth res->op = OCONST;
21174a4d8c2SCharles.Forsyth res->type = TINT;
21274a4d8c2SCharles.Forsyth res->nstore.fmt = 'c';
21374a4d8c2SCharles.Forsyth break;
21474a4d8c2SCharles.Forsyth }
21574a4d8c2SCharles.Forsyth }
21674a4d8c2SCharles.Forsyth
21774a4d8c2SCharles.Forsyth void
oappend(Node * n,Node * res)21874a4d8c2SCharles.Forsyth oappend(Node *n, Node *res)
21974a4d8c2SCharles.Forsyth {
22074a4d8c2SCharles.Forsyth Node r, l;
22174a4d8c2SCharles.Forsyth
22274a4d8c2SCharles.Forsyth expr(n->left, &l);
22374a4d8c2SCharles.Forsyth expr(n->right, &r);
22474a4d8c2SCharles.Forsyth if(l.type != TLIST)
22574a4d8c2SCharles.Forsyth error("must append to list");
22674a4d8c2SCharles.Forsyth append(res, &l, &r);
22774a4d8c2SCharles.Forsyth }
22874a4d8c2SCharles.Forsyth
22974a4d8c2SCharles.Forsyth void
odelete(Node * n,Node * res)23074a4d8c2SCharles.Forsyth odelete(Node *n, Node *res)
23174a4d8c2SCharles.Forsyth {
23274a4d8c2SCharles.Forsyth Node l, r;
23374a4d8c2SCharles.Forsyth
23474a4d8c2SCharles.Forsyth expr(n->left, &l);
23574a4d8c2SCharles.Forsyth expr(n->right, &r);
23674a4d8c2SCharles.Forsyth if(l.type != TLIST)
23774a4d8c2SCharles.Forsyth error("must delete from list");
23874a4d8c2SCharles.Forsyth if(r.type != TINT)
23974a4d8c2SCharles.Forsyth error("delete index must be integer");
24074a4d8c2SCharles.Forsyth
24174a4d8c2SCharles.Forsyth delete(l.nstore.u0.sl, r.nstore.u0.sival, res);
24274a4d8c2SCharles.Forsyth }
24374a4d8c2SCharles.Forsyth
24474a4d8c2SCharles.Forsyth void
ohead(Node * n,Node * res)24574a4d8c2SCharles.Forsyth ohead(Node *n, Node *res)
24674a4d8c2SCharles.Forsyth {
24774a4d8c2SCharles.Forsyth Node l;
24874a4d8c2SCharles.Forsyth
24974a4d8c2SCharles.Forsyth expr(n->left, &l);
25074a4d8c2SCharles.Forsyth if(l.type != TLIST)
25174a4d8c2SCharles.Forsyth error("head needs list");
25274a4d8c2SCharles.Forsyth res->op = OCONST;
25374a4d8c2SCharles.Forsyth if(l.nstore.u0.sl) {
25474a4d8c2SCharles.Forsyth res->type = l.nstore.u0.sl->type;
25574a4d8c2SCharles.Forsyth res->nstore = l.nstore.u0.sl->lstore;
25674a4d8c2SCharles.Forsyth }
25774a4d8c2SCharles.Forsyth else {
25874a4d8c2SCharles.Forsyth res->type = TLIST;
25974a4d8c2SCharles.Forsyth res->nstore.u0.sl = 0;
26074a4d8c2SCharles.Forsyth }
26174a4d8c2SCharles.Forsyth }
26274a4d8c2SCharles.Forsyth
26374a4d8c2SCharles.Forsyth void
otail(Node * n,Node * res)26474a4d8c2SCharles.Forsyth otail(Node *n, Node *res)
26574a4d8c2SCharles.Forsyth {
26674a4d8c2SCharles.Forsyth Node l;
26774a4d8c2SCharles.Forsyth
26874a4d8c2SCharles.Forsyth expr(n->left, &l);
26974a4d8c2SCharles.Forsyth if(l.type != TLIST)
27074a4d8c2SCharles.Forsyth error("tail needs list");
27174a4d8c2SCharles.Forsyth res->op = OCONST;
27274a4d8c2SCharles.Forsyth res->type = TLIST;
27374a4d8c2SCharles.Forsyth if(l.nstore.u0.sl)
27474a4d8c2SCharles.Forsyth res->nstore.u0.sl = l.nstore.u0.sl->next;
27574a4d8c2SCharles.Forsyth else
27674a4d8c2SCharles.Forsyth res->nstore.u0.sl = 0;
27774a4d8c2SCharles.Forsyth }
27874a4d8c2SCharles.Forsyth
27974a4d8c2SCharles.Forsyth void
oconst(Node * n,Node * res)28074a4d8c2SCharles.Forsyth oconst(Node *n, Node *res)
28174a4d8c2SCharles.Forsyth {
28274a4d8c2SCharles.Forsyth res->op = OCONST;
28374a4d8c2SCharles.Forsyth res->type = n->type;
28474a4d8c2SCharles.Forsyth res->nstore = n->nstore;
28574a4d8c2SCharles.Forsyth res->nstore.comt = n->nstore.comt;
28674a4d8c2SCharles.Forsyth }
28774a4d8c2SCharles.Forsyth
28874a4d8c2SCharles.Forsyth void
oname(Node * n,Node * res)28974a4d8c2SCharles.Forsyth oname(Node *n, Node *res)
29074a4d8c2SCharles.Forsyth {
29174a4d8c2SCharles.Forsyth Value *v;
29274a4d8c2SCharles.Forsyth
29374a4d8c2SCharles.Forsyth v = n->sym->v;
29474a4d8c2SCharles.Forsyth if(v->set == 0)
29574a4d8c2SCharles.Forsyth error("%s used but not set", n->sym->name);
29674a4d8c2SCharles.Forsyth res->op = OCONST;
29774a4d8c2SCharles.Forsyth res->type = v->type;
29874a4d8c2SCharles.Forsyth res->nstore = v->vstore;
29974a4d8c2SCharles.Forsyth res->nstore.comt = v->vstore.comt;
30074a4d8c2SCharles.Forsyth }
30174a4d8c2SCharles.Forsyth
30274a4d8c2SCharles.Forsyth void
octruct(Node * n,Node * res)30374a4d8c2SCharles.Forsyth octruct(Node *n, Node *res)
30474a4d8c2SCharles.Forsyth {
30574a4d8c2SCharles.Forsyth res->op = OCONST;
30674a4d8c2SCharles.Forsyth res->type = TLIST;
30774a4d8c2SCharles.Forsyth res->nstore.u0.sl = construct(n->left);
30874a4d8c2SCharles.Forsyth }
30974a4d8c2SCharles.Forsyth
31074a4d8c2SCharles.Forsyth void
oasgn(Node * n,Node * res)31174a4d8c2SCharles.Forsyth oasgn(Node *n, Node *res)
31274a4d8c2SCharles.Forsyth {
31374a4d8c2SCharles.Forsyth Node *lp, r;
31474a4d8c2SCharles.Forsyth Value *v;
31574a4d8c2SCharles.Forsyth
31674a4d8c2SCharles.Forsyth lp = n->left;
31774a4d8c2SCharles.Forsyth switch(lp->op) {
31874a4d8c2SCharles.Forsyth case OINDM:
31974a4d8c2SCharles.Forsyth windir(cormap, lp->left, n->right, res);
32074a4d8c2SCharles.Forsyth break;
32174a4d8c2SCharles.Forsyth case OINDC:
32274a4d8c2SCharles.Forsyth windir(symmap, lp->left, n->right, res);
32374a4d8c2SCharles.Forsyth break;
32474a4d8c2SCharles.Forsyth default:
32574a4d8c2SCharles.Forsyth chklval(lp);
32674a4d8c2SCharles.Forsyth v = lp->sym->v;
32774a4d8c2SCharles.Forsyth expr(n->right, &r);
32874a4d8c2SCharles.Forsyth v->set = 1;
32974a4d8c2SCharles.Forsyth v->type = r.type;
33074a4d8c2SCharles.Forsyth v->vstore = r.nstore;
33174a4d8c2SCharles.Forsyth res->op = OCONST;
33274a4d8c2SCharles.Forsyth res->type = v->type;
33374a4d8c2SCharles.Forsyth res->nstore = v->vstore;
33474a4d8c2SCharles.Forsyth res->nstore.comt = v->vstore.comt;
33574a4d8c2SCharles.Forsyth }
33674a4d8c2SCharles.Forsyth }
33774a4d8c2SCharles.Forsyth
33874a4d8c2SCharles.Forsyth void
oadd(Node * n,Node * res)33974a4d8c2SCharles.Forsyth oadd(Node *n, Node *res)
34074a4d8c2SCharles.Forsyth {
34174a4d8c2SCharles.Forsyth Node l, r;
34274a4d8c2SCharles.Forsyth
34374a4d8c2SCharles.Forsyth expr(n->left, &l);
34474a4d8c2SCharles.Forsyth expr(n->right, &r);
34574a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
34674a4d8c2SCharles.Forsyth res->op = OCONST;
34774a4d8c2SCharles.Forsyth res->type = TFLOAT;
34874a4d8c2SCharles.Forsyth switch(l.type) {
34974a4d8c2SCharles.Forsyth default:
35074a4d8c2SCharles.Forsyth error("bad lhs type +");
35174a4d8c2SCharles.Forsyth case TINT:
35274a4d8c2SCharles.Forsyth switch(r.type) {
35374a4d8c2SCharles.Forsyth case TINT:
35474a4d8c2SCharles.Forsyth res->type = TINT;
35574a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival+r.nstore.u0.sival;
35674a4d8c2SCharles.Forsyth break;
35774a4d8c2SCharles.Forsyth case TFLOAT:
35874a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sival+r.nstore.u0.sfval;
35974a4d8c2SCharles.Forsyth break;
36074a4d8c2SCharles.Forsyth default:
36174a4d8c2SCharles.Forsyth error("bad rhs type +");
36274a4d8c2SCharles.Forsyth }
36374a4d8c2SCharles.Forsyth break;
36474a4d8c2SCharles.Forsyth case TFLOAT:
36574a4d8c2SCharles.Forsyth switch(r.type) {
36674a4d8c2SCharles.Forsyth case TINT:
36774a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval+r.nstore.u0.sival;
36874a4d8c2SCharles.Forsyth break;
36974a4d8c2SCharles.Forsyth case TFLOAT:
37074a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval+r.nstore.u0.sfval;
37174a4d8c2SCharles.Forsyth break;
37274a4d8c2SCharles.Forsyth default:
37374a4d8c2SCharles.Forsyth error("bad rhs type +");
37474a4d8c2SCharles.Forsyth }
37574a4d8c2SCharles.Forsyth break;
37674a4d8c2SCharles.Forsyth case TSTRING:
37774a4d8c2SCharles.Forsyth if(r.type == TSTRING) {
37874a4d8c2SCharles.Forsyth res->type = TSTRING;
37974a4d8c2SCharles.Forsyth res->nstore.fmt = 's';
38074a4d8c2SCharles.Forsyth res->nstore.u0.sstring = stradd(l.nstore.u0.sstring, r.nstore.u0.sstring);
38174a4d8c2SCharles.Forsyth break;
38274a4d8c2SCharles.Forsyth }
38374a4d8c2SCharles.Forsyth error("bad rhs for +");
38474a4d8c2SCharles.Forsyth case TLIST:
38574a4d8c2SCharles.Forsyth res->type = TLIST;
38674a4d8c2SCharles.Forsyth switch(r.type) {
38774a4d8c2SCharles.Forsyth case TLIST:
38874a4d8c2SCharles.Forsyth res->nstore.u0.sl = addlist(l.nstore.u0.sl, r.nstore.u0.sl);
38974a4d8c2SCharles.Forsyth break;
39074a4d8c2SCharles.Forsyth default:
39174a4d8c2SCharles.Forsyth r.left = 0;
39274a4d8c2SCharles.Forsyth r.right = 0;
39374a4d8c2SCharles.Forsyth res->nstore.u0.sl = addlist(l.nstore.u0.sl, construct(&r));
39474a4d8c2SCharles.Forsyth break;
39574a4d8c2SCharles.Forsyth }
39674a4d8c2SCharles.Forsyth }
39774a4d8c2SCharles.Forsyth }
39874a4d8c2SCharles.Forsyth
39974a4d8c2SCharles.Forsyth void
osub(Node * n,Node * res)40074a4d8c2SCharles.Forsyth osub(Node *n, Node *res)
40174a4d8c2SCharles.Forsyth {
40274a4d8c2SCharles.Forsyth Node l, r;
40374a4d8c2SCharles.Forsyth
40474a4d8c2SCharles.Forsyth expr(n->left, &l);
40574a4d8c2SCharles.Forsyth expr(n->right, &r);
40674a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
40774a4d8c2SCharles.Forsyth res->op = OCONST;
40874a4d8c2SCharles.Forsyth res->type = TFLOAT;
40974a4d8c2SCharles.Forsyth switch(l.type) {
41074a4d8c2SCharles.Forsyth default:
41174a4d8c2SCharles.Forsyth error("bad lhs type -");
41274a4d8c2SCharles.Forsyth case TINT:
41374a4d8c2SCharles.Forsyth switch(r.type) {
41474a4d8c2SCharles.Forsyth case TINT:
41574a4d8c2SCharles.Forsyth res->type = TINT;
41674a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival-r.nstore.u0.sival;
41774a4d8c2SCharles.Forsyth break;
41874a4d8c2SCharles.Forsyth case TFLOAT:
41974a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sival-r.nstore.u0.sfval;
42074a4d8c2SCharles.Forsyth break;
42174a4d8c2SCharles.Forsyth default:
42274a4d8c2SCharles.Forsyth error("bad rhs type -");
42374a4d8c2SCharles.Forsyth }
42474a4d8c2SCharles.Forsyth break;
42574a4d8c2SCharles.Forsyth case TFLOAT:
42674a4d8c2SCharles.Forsyth switch(r.type) {
42774a4d8c2SCharles.Forsyth case TINT:
42874a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval-r.nstore.u0.sival;
42974a4d8c2SCharles.Forsyth break;
43074a4d8c2SCharles.Forsyth case TFLOAT:
43174a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval-r.nstore.u0.sfval;
43274a4d8c2SCharles.Forsyth break;
43374a4d8c2SCharles.Forsyth default:
43474a4d8c2SCharles.Forsyth error("bad rhs type -");
43574a4d8c2SCharles.Forsyth }
43674a4d8c2SCharles.Forsyth break;
43774a4d8c2SCharles.Forsyth }
43874a4d8c2SCharles.Forsyth }
43974a4d8c2SCharles.Forsyth
44074a4d8c2SCharles.Forsyth void
omul(Node * n,Node * res)44174a4d8c2SCharles.Forsyth omul(Node *n, Node *res)
44274a4d8c2SCharles.Forsyth {
44374a4d8c2SCharles.Forsyth Node l, r;
44474a4d8c2SCharles.Forsyth
44574a4d8c2SCharles.Forsyth expr(n->left, &l);
44674a4d8c2SCharles.Forsyth expr(n->right, &r);
44774a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
44874a4d8c2SCharles.Forsyth res->op = OCONST;
44974a4d8c2SCharles.Forsyth res->type = TFLOAT;
45074a4d8c2SCharles.Forsyth switch(l.type) {
45174a4d8c2SCharles.Forsyth default:
45274a4d8c2SCharles.Forsyth error("bad lhs type *");
45374a4d8c2SCharles.Forsyth case TINT:
45474a4d8c2SCharles.Forsyth switch(r.type) {
45574a4d8c2SCharles.Forsyth case TINT:
45674a4d8c2SCharles.Forsyth res->type = TINT;
45774a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival*r.nstore.u0.sival;
45874a4d8c2SCharles.Forsyth break;
45974a4d8c2SCharles.Forsyth case TFLOAT:
46074a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sival*r.nstore.u0.sfval;
46174a4d8c2SCharles.Forsyth break;
46274a4d8c2SCharles.Forsyth default:
46374a4d8c2SCharles.Forsyth error("bad rhs type *");
46474a4d8c2SCharles.Forsyth }
46574a4d8c2SCharles.Forsyth break;
46674a4d8c2SCharles.Forsyth case TFLOAT:
46774a4d8c2SCharles.Forsyth switch(r.type) {
46874a4d8c2SCharles.Forsyth case TINT:
46974a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval*r.nstore.u0.sival;
47074a4d8c2SCharles.Forsyth break;
47174a4d8c2SCharles.Forsyth case TFLOAT:
47274a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval*r.nstore.u0.sfval;
47374a4d8c2SCharles.Forsyth break;
47474a4d8c2SCharles.Forsyth default:
47574a4d8c2SCharles.Forsyth error("bad rhs type *");
47674a4d8c2SCharles.Forsyth }
47774a4d8c2SCharles.Forsyth break;
47874a4d8c2SCharles.Forsyth }
47974a4d8c2SCharles.Forsyth }
48074a4d8c2SCharles.Forsyth
48174a4d8c2SCharles.Forsyth void
odiv(Node * n,Node * res)48274a4d8c2SCharles.Forsyth odiv(Node *n, Node *res)
48374a4d8c2SCharles.Forsyth {
48474a4d8c2SCharles.Forsyth Node l, r;
48574a4d8c2SCharles.Forsyth
48674a4d8c2SCharles.Forsyth expr(n->left, &l);
48774a4d8c2SCharles.Forsyth expr(n->right, &r);
48874a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
48974a4d8c2SCharles.Forsyth res->op = OCONST;
49074a4d8c2SCharles.Forsyth res->type = TFLOAT;
49174a4d8c2SCharles.Forsyth switch(l.type) {
49274a4d8c2SCharles.Forsyth default:
49374a4d8c2SCharles.Forsyth error("bad lhs type /");
49474a4d8c2SCharles.Forsyth case TINT:
49574a4d8c2SCharles.Forsyth switch(r.type) {
49674a4d8c2SCharles.Forsyth case TINT:
49774a4d8c2SCharles.Forsyth res->type = TINT;
49874a4d8c2SCharles.Forsyth if(r.nstore.u0.sival == 0)
49974a4d8c2SCharles.Forsyth error("zero divide");
50074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival/r.nstore.u0.sival;
50174a4d8c2SCharles.Forsyth break;
50274a4d8c2SCharles.Forsyth case TFLOAT:
50374a4d8c2SCharles.Forsyth if(r.nstore.u0.sfval == 0)
50474a4d8c2SCharles.Forsyth error("zero divide");
50574a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sival/r.nstore.u0.sfval;
50674a4d8c2SCharles.Forsyth break;
50774a4d8c2SCharles.Forsyth default:
50874a4d8c2SCharles.Forsyth error("bad rhs type /");
50974a4d8c2SCharles.Forsyth }
51074a4d8c2SCharles.Forsyth break;
51174a4d8c2SCharles.Forsyth case TFLOAT:
51274a4d8c2SCharles.Forsyth switch(r.type) {
51374a4d8c2SCharles.Forsyth case TINT:
51474a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval/r.nstore.u0.sival;
51574a4d8c2SCharles.Forsyth break;
51674a4d8c2SCharles.Forsyth case TFLOAT:
51774a4d8c2SCharles.Forsyth res->nstore.u0.sfval = l.nstore.u0.sfval/r.nstore.u0.sfval;
51874a4d8c2SCharles.Forsyth break;
51974a4d8c2SCharles.Forsyth default:
52074a4d8c2SCharles.Forsyth error("bad rhs type /");
52174a4d8c2SCharles.Forsyth }
52274a4d8c2SCharles.Forsyth break;
52374a4d8c2SCharles.Forsyth }
52474a4d8c2SCharles.Forsyth }
52574a4d8c2SCharles.Forsyth
52674a4d8c2SCharles.Forsyth void
omod(Node * n,Node * res)52774a4d8c2SCharles.Forsyth omod(Node *n, Node *res)
52874a4d8c2SCharles.Forsyth {
52974a4d8c2SCharles.Forsyth Node l, r;
53074a4d8c2SCharles.Forsyth
53174a4d8c2SCharles.Forsyth expr(n->left, &l);
53274a4d8c2SCharles.Forsyth expr(n->right, &r);
53374a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
53474a4d8c2SCharles.Forsyth res->op = OCONST;
53574a4d8c2SCharles.Forsyth res->type = TINT;
53674a4d8c2SCharles.Forsyth if(l.type != TINT || r.type != TINT)
53774a4d8c2SCharles.Forsyth error("bad expr type %");
53874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival%r.nstore.u0.sival;
53974a4d8c2SCharles.Forsyth }
54074a4d8c2SCharles.Forsyth
54174a4d8c2SCharles.Forsyth void
olsh(Node * n,Node * res)54274a4d8c2SCharles.Forsyth olsh(Node *n, Node *res)
54374a4d8c2SCharles.Forsyth {
54474a4d8c2SCharles.Forsyth Node l, r;
54574a4d8c2SCharles.Forsyth
54674a4d8c2SCharles.Forsyth expr(n->left, &l);
54774a4d8c2SCharles.Forsyth expr(n->right, &r);
54874a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
54974a4d8c2SCharles.Forsyth res->op = OCONST;
55074a4d8c2SCharles.Forsyth res->type = TINT;
55174a4d8c2SCharles.Forsyth if(l.type != TINT || r.type != TINT)
55274a4d8c2SCharles.Forsyth error("bad expr type <<");
55374a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival<<r.nstore.u0.sival;
55474a4d8c2SCharles.Forsyth }
55574a4d8c2SCharles.Forsyth
55674a4d8c2SCharles.Forsyth void
orsh(Node * n,Node * res)55774a4d8c2SCharles.Forsyth orsh(Node *n, Node *res)
55874a4d8c2SCharles.Forsyth {
55974a4d8c2SCharles.Forsyth Node l, r;
56074a4d8c2SCharles.Forsyth
56174a4d8c2SCharles.Forsyth expr(n->left, &l);
56274a4d8c2SCharles.Forsyth expr(n->right, &r);
56374a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
56474a4d8c2SCharles.Forsyth res->op = OCONST;
56574a4d8c2SCharles.Forsyth res->type = TINT;
56674a4d8c2SCharles.Forsyth if(l.type != TINT || r.type != TINT)
56774a4d8c2SCharles.Forsyth error("bad expr type >>");
56874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival>>r.nstore.u0.sival;
56974a4d8c2SCharles.Forsyth }
57074a4d8c2SCharles.Forsyth
57174a4d8c2SCharles.Forsyth void
olt(Node * n,Node * res)57274a4d8c2SCharles.Forsyth olt(Node *n, Node *res)
57374a4d8c2SCharles.Forsyth {
57474a4d8c2SCharles.Forsyth Node l, r;
57574a4d8c2SCharles.Forsyth
57674a4d8c2SCharles.Forsyth expr(n->left, &l);
57774a4d8c2SCharles.Forsyth expr(n->right, &r);
57874a4d8c2SCharles.Forsyth
57974a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
58074a4d8c2SCharles.Forsyth res->op = OCONST;
58174a4d8c2SCharles.Forsyth res->type = TINT;
58274a4d8c2SCharles.Forsyth switch(l.type) {
58374a4d8c2SCharles.Forsyth default:
58474a4d8c2SCharles.Forsyth error("bad lhs type <");
58574a4d8c2SCharles.Forsyth case TINT:
58674a4d8c2SCharles.Forsyth switch(r.type) {
58774a4d8c2SCharles.Forsyth case TINT:
58874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival < r.nstore.u0.sival;
58974a4d8c2SCharles.Forsyth break;
59074a4d8c2SCharles.Forsyth case TFLOAT:
59174a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival < r.nstore.u0.sfval;
59274a4d8c2SCharles.Forsyth break;
59374a4d8c2SCharles.Forsyth default:
59474a4d8c2SCharles.Forsyth error("bad rhs type <");
59574a4d8c2SCharles.Forsyth }
59674a4d8c2SCharles.Forsyth break;
59774a4d8c2SCharles.Forsyth case TFLOAT:
59874a4d8c2SCharles.Forsyth switch(r.type) {
59974a4d8c2SCharles.Forsyth case TINT:
60074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval < r.nstore.u0.sival;
60174a4d8c2SCharles.Forsyth break;
60274a4d8c2SCharles.Forsyth case TFLOAT:
60374a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval < r.nstore.u0.sfval;
60474a4d8c2SCharles.Forsyth break;
60574a4d8c2SCharles.Forsyth default:
60674a4d8c2SCharles.Forsyth error("bad rhs type <");
60774a4d8c2SCharles.Forsyth }
60874a4d8c2SCharles.Forsyth break;
60974a4d8c2SCharles.Forsyth }
61074a4d8c2SCharles.Forsyth }
61174a4d8c2SCharles.Forsyth
61274a4d8c2SCharles.Forsyth void
ogt(Node * n,Node * res)61374a4d8c2SCharles.Forsyth ogt(Node *n, Node *res)
61474a4d8c2SCharles.Forsyth {
61574a4d8c2SCharles.Forsyth Node l, r;
61674a4d8c2SCharles.Forsyth
61774a4d8c2SCharles.Forsyth expr(n->left, &l);
61874a4d8c2SCharles.Forsyth expr(n->right, &r);
61974a4d8c2SCharles.Forsyth res->nstore.fmt = 'D';
62074a4d8c2SCharles.Forsyth res->op = OCONST;
62174a4d8c2SCharles.Forsyth res->type = TINT;
62274a4d8c2SCharles.Forsyth switch(l.type) {
62374a4d8c2SCharles.Forsyth default:
62474a4d8c2SCharles.Forsyth error("bad lhs type >");
62574a4d8c2SCharles.Forsyth case TINT:
62674a4d8c2SCharles.Forsyth switch(r.type) {
62774a4d8c2SCharles.Forsyth case TINT:
62874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival > r.nstore.u0.sival;
62974a4d8c2SCharles.Forsyth break;
63074a4d8c2SCharles.Forsyth case TFLOAT:
63174a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival > r.nstore.u0.sfval;
63274a4d8c2SCharles.Forsyth break;
63374a4d8c2SCharles.Forsyth default:
63474a4d8c2SCharles.Forsyth error("bad rhs type >");
63574a4d8c2SCharles.Forsyth }
63674a4d8c2SCharles.Forsyth break;
63774a4d8c2SCharles.Forsyth case TFLOAT:
63874a4d8c2SCharles.Forsyth switch(r.type) {
63974a4d8c2SCharles.Forsyth case TINT:
64074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval > r.nstore.u0.sival;
64174a4d8c2SCharles.Forsyth break;
64274a4d8c2SCharles.Forsyth case TFLOAT:
64374a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval > r.nstore.u0.sfval;
64474a4d8c2SCharles.Forsyth break;
64574a4d8c2SCharles.Forsyth default:
64674a4d8c2SCharles.Forsyth error("bad rhs type >");
64774a4d8c2SCharles.Forsyth }
64874a4d8c2SCharles.Forsyth break;
64974a4d8c2SCharles.Forsyth }
65074a4d8c2SCharles.Forsyth }
65174a4d8c2SCharles.Forsyth
65274a4d8c2SCharles.Forsyth void
oleq(Node * n,Node * res)65374a4d8c2SCharles.Forsyth oleq(Node *n, Node *res)
65474a4d8c2SCharles.Forsyth {
65574a4d8c2SCharles.Forsyth Node l, r;
65674a4d8c2SCharles.Forsyth
65774a4d8c2SCharles.Forsyth expr(n->left, &l);
65874a4d8c2SCharles.Forsyth expr(n->right, &r);
65974a4d8c2SCharles.Forsyth res->nstore.fmt = 'D';
66074a4d8c2SCharles.Forsyth res->op = OCONST;
66174a4d8c2SCharles.Forsyth res->type = TINT;
66274a4d8c2SCharles.Forsyth switch(l.type) {
66374a4d8c2SCharles.Forsyth default:
66474a4d8c2SCharles.Forsyth error("bad expr type <=");
66574a4d8c2SCharles.Forsyth case TINT:
66674a4d8c2SCharles.Forsyth switch(r.type) {
66774a4d8c2SCharles.Forsyth case TINT:
66874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival <= r.nstore.u0.sival;
66974a4d8c2SCharles.Forsyth break;
67074a4d8c2SCharles.Forsyth case TFLOAT:
67174a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival <= r.nstore.u0.sfval;
67274a4d8c2SCharles.Forsyth break;
67374a4d8c2SCharles.Forsyth default:
67474a4d8c2SCharles.Forsyth error("bad expr type <=");
67574a4d8c2SCharles.Forsyth }
67674a4d8c2SCharles.Forsyth break;
67774a4d8c2SCharles.Forsyth case TFLOAT:
67874a4d8c2SCharles.Forsyth switch(r.type) {
67974a4d8c2SCharles.Forsyth case TINT:
68074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval <= r.nstore.u0.sival;
68174a4d8c2SCharles.Forsyth break;
68274a4d8c2SCharles.Forsyth case TFLOAT:
68374a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval <= r.nstore.u0.sfval;
68474a4d8c2SCharles.Forsyth break;
68574a4d8c2SCharles.Forsyth default:
68674a4d8c2SCharles.Forsyth error("bad expr type <=");
68774a4d8c2SCharles.Forsyth }
68874a4d8c2SCharles.Forsyth break;
68974a4d8c2SCharles.Forsyth }
69074a4d8c2SCharles.Forsyth }
69174a4d8c2SCharles.Forsyth
69274a4d8c2SCharles.Forsyth void
ogeq(Node * n,Node * res)69374a4d8c2SCharles.Forsyth ogeq(Node *n, Node *res)
69474a4d8c2SCharles.Forsyth {
69574a4d8c2SCharles.Forsyth Node l, r;
69674a4d8c2SCharles.Forsyth
69774a4d8c2SCharles.Forsyth expr(n->left, &l);
69874a4d8c2SCharles.Forsyth expr(n->right, &r);
69974a4d8c2SCharles.Forsyth res->nstore.fmt = 'D';
70074a4d8c2SCharles.Forsyth res->op = OCONST;
70174a4d8c2SCharles.Forsyth res->type = TINT;
70274a4d8c2SCharles.Forsyth switch(l.type) {
70374a4d8c2SCharles.Forsyth default:
70474a4d8c2SCharles.Forsyth error("bad lhs type >=");
70574a4d8c2SCharles.Forsyth case TINT:
70674a4d8c2SCharles.Forsyth switch(r.type) {
70774a4d8c2SCharles.Forsyth case TINT:
70874a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival >= r.nstore.u0.sival;
70974a4d8c2SCharles.Forsyth break;
71074a4d8c2SCharles.Forsyth case TFLOAT:
71174a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival >= r.nstore.u0.sfval;
71274a4d8c2SCharles.Forsyth break;
71374a4d8c2SCharles.Forsyth default:
71474a4d8c2SCharles.Forsyth error("bad rhs type >=");
71574a4d8c2SCharles.Forsyth }
71674a4d8c2SCharles.Forsyth break;
71774a4d8c2SCharles.Forsyth case TFLOAT:
71874a4d8c2SCharles.Forsyth switch(r.type) {
71974a4d8c2SCharles.Forsyth case TINT:
72074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval >= r.nstore.u0.sival;
72174a4d8c2SCharles.Forsyth break;
72274a4d8c2SCharles.Forsyth case TFLOAT:
72374a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval >= r.nstore.u0.sfval;
72474a4d8c2SCharles.Forsyth break;
72574a4d8c2SCharles.Forsyth default:
72674a4d8c2SCharles.Forsyth error("bad rhs type >=");
72774a4d8c2SCharles.Forsyth }
72874a4d8c2SCharles.Forsyth break;
72974a4d8c2SCharles.Forsyth }
73074a4d8c2SCharles.Forsyth }
73174a4d8c2SCharles.Forsyth
73274a4d8c2SCharles.Forsyth void
oeq(Node * n,Node * res)73374a4d8c2SCharles.Forsyth oeq(Node *n, Node *res)
73474a4d8c2SCharles.Forsyth {
73574a4d8c2SCharles.Forsyth Node l, r;
73674a4d8c2SCharles.Forsyth
73774a4d8c2SCharles.Forsyth expr(n->left, &l);
73874a4d8c2SCharles.Forsyth expr(n->right, &r);
73974a4d8c2SCharles.Forsyth res->nstore.fmt = 'D';
74074a4d8c2SCharles.Forsyth res->op = OCONST;
74174a4d8c2SCharles.Forsyth res->type = TINT;
74274a4d8c2SCharles.Forsyth res->nstore.u0.sival = 0;
74374a4d8c2SCharles.Forsyth switch(l.type) {
74474a4d8c2SCharles.Forsyth default:
74574a4d8c2SCharles.Forsyth break;
74674a4d8c2SCharles.Forsyth case TINT:
74774a4d8c2SCharles.Forsyth switch(r.type) {
74874a4d8c2SCharles.Forsyth case TINT:
74974a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival == r.nstore.u0.sival;
75074a4d8c2SCharles.Forsyth break;
75174a4d8c2SCharles.Forsyth case TFLOAT:
75274a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival == r.nstore.u0.sfval;
75374a4d8c2SCharles.Forsyth break;
75474a4d8c2SCharles.Forsyth default:
75574a4d8c2SCharles.Forsyth break;
75674a4d8c2SCharles.Forsyth }
75774a4d8c2SCharles.Forsyth break;
75874a4d8c2SCharles.Forsyth case TFLOAT:
75974a4d8c2SCharles.Forsyth switch(r.type) {
76074a4d8c2SCharles.Forsyth case TINT:
76174a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval == r.nstore.u0.sival;
76274a4d8c2SCharles.Forsyth break;
76374a4d8c2SCharles.Forsyth case TFLOAT:
76474a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sfval == r.nstore.u0.sfval;
76574a4d8c2SCharles.Forsyth break;
76674a4d8c2SCharles.Forsyth default:
76774a4d8c2SCharles.Forsyth break;
76874a4d8c2SCharles.Forsyth }
76974a4d8c2SCharles.Forsyth break;
77074a4d8c2SCharles.Forsyth case TSTRING:
77174a4d8c2SCharles.Forsyth if(r.type == TSTRING) {
77274a4d8c2SCharles.Forsyth res->nstore.u0.sival = scmp(r.nstore.u0.sstring, l.nstore.u0.sstring);
77374a4d8c2SCharles.Forsyth break;
77474a4d8c2SCharles.Forsyth }
77574a4d8c2SCharles.Forsyth break;
77674a4d8c2SCharles.Forsyth case TLIST:
77774a4d8c2SCharles.Forsyth if(r.type == TLIST) {
77874a4d8c2SCharles.Forsyth res->nstore.u0.sival = listcmp(l.nstore.u0.sl, r.nstore.u0.sl);
77974a4d8c2SCharles.Forsyth break;
78074a4d8c2SCharles.Forsyth }
78174a4d8c2SCharles.Forsyth break;
78274a4d8c2SCharles.Forsyth }
78374a4d8c2SCharles.Forsyth if(n->op == ONEQ)
78474a4d8c2SCharles.Forsyth res->nstore.u0.sival = !res->nstore.u0.sival;
78574a4d8c2SCharles.Forsyth }
78674a4d8c2SCharles.Forsyth
78774a4d8c2SCharles.Forsyth
78874a4d8c2SCharles.Forsyth void
oland(Node * n,Node * res)78974a4d8c2SCharles.Forsyth oland(Node *n, Node *res)
79074a4d8c2SCharles.Forsyth {
79174a4d8c2SCharles.Forsyth Node l, r;
79274a4d8c2SCharles.Forsyth
79374a4d8c2SCharles.Forsyth expr(n->left, &l);
79474a4d8c2SCharles.Forsyth expr(n->right, &r);
79574a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
79674a4d8c2SCharles.Forsyth res->op = OCONST;
79774a4d8c2SCharles.Forsyth res->type = TINT;
79874a4d8c2SCharles.Forsyth if(l.type != TINT || r.type != TINT)
79974a4d8c2SCharles.Forsyth error("bad expr type &");
80074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival&r.nstore.u0.sival;
80174a4d8c2SCharles.Forsyth }
80274a4d8c2SCharles.Forsyth
80374a4d8c2SCharles.Forsyth void
oxor(Node * n,Node * res)80474a4d8c2SCharles.Forsyth oxor(Node *n, Node *res)
80574a4d8c2SCharles.Forsyth {
80674a4d8c2SCharles.Forsyth Node l, r;
80774a4d8c2SCharles.Forsyth
80874a4d8c2SCharles.Forsyth expr(n->left, &l);
80974a4d8c2SCharles.Forsyth expr(n->right, &r);
81074a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
81174a4d8c2SCharles.Forsyth res->op = OCONST;
81274a4d8c2SCharles.Forsyth res->type = TINT;
81374a4d8c2SCharles.Forsyth if(l.type != TINT || r.type != TINT)
81474a4d8c2SCharles.Forsyth error("bad expr type ^");
81574a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival^r.nstore.u0.sival;
81674a4d8c2SCharles.Forsyth }
81774a4d8c2SCharles.Forsyth
81874a4d8c2SCharles.Forsyth void
olor(Node * n,Node * res)81974a4d8c2SCharles.Forsyth olor(Node *n, Node *res)
82074a4d8c2SCharles.Forsyth {
82174a4d8c2SCharles.Forsyth Node l, r;
82274a4d8c2SCharles.Forsyth
82374a4d8c2SCharles.Forsyth expr(n->left, &l);
82474a4d8c2SCharles.Forsyth expr(n->right, &r);
82574a4d8c2SCharles.Forsyth res->nstore.fmt = l.nstore.fmt;
82674a4d8c2SCharles.Forsyth res->op = OCONST;
82774a4d8c2SCharles.Forsyth res->type = TINT;
82874a4d8c2SCharles.Forsyth if(l.type != TINT || r.type != TINT)
82974a4d8c2SCharles.Forsyth error("bad expr type |");
83074a4d8c2SCharles.Forsyth res->nstore.u0.sival = l.nstore.u0.sival|r.nstore.u0.sival;
83174a4d8c2SCharles.Forsyth }
83274a4d8c2SCharles.Forsyth
83374a4d8c2SCharles.Forsyth void
ocand(Node * n,Node * res)83474a4d8c2SCharles.Forsyth ocand(Node *n, Node *res)
83574a4d8c2SCharles.Forsyth {
83674a4d8c2SCharles.Forsyth Node l, r;
83774a4d8c2SCharles.Forsyth
83874a4d8c2SCharles.Forsyth res->op = OCONST;
83974a4d8c2SCharles.Forsyth res->type = TINT;
84074a4d8c2SCharles.Forsyth res->nstore.u0.sival = 0;
84174a4d8c2SCharles.Forsyth expr(n->left, &l);
84245a20ab7Sforsyth res->nstore.fmt = l.nstore.fmt;
843*1272589eSCharles Forsyth if(boolx(&l) == 0)
84474a4d8c2SCharles.Forsyth return;
84574a4d8c2SCharles.Forsyth expr(n->right, &r);
846*1272589eSCharles Forsyth if(boolx(&r) == 0)
84774a4d8c2SCharles.Forsyth return;
84874a4d8c2SCharles.Forsyth res->nstore.u0.sival = 1;
84974a4d8c2SCharles.Forsyth }
85074a4d8c2SCharles.Forsyth
85174a4d8c2SCharles.Forsyth void
onot(Node * n,Node * res)85274a4d8c2SCharles.Forsyth onot(Node *n, Node *res)
85374a4d8c2SCharles.Forsyth {
85474a4d8c2SCharles.Forsyth Node l;
85574a4d8c2SCharles.Forsyth
85674a4d8c2SCharles.Forsyth res->op = OCONST;
85774a4d8c2SCharles.Forsyth res->type = TINT;
85874a4d8c2SCharles.Forsyth res->nstore.u0.sival = 0;
85974a4d8c2SCharles.Forsyth expr(n->left, &l);
860*1272589eSCharles Forsyth if(boolx(&l) == 0)
86174a4d8c2SCharles.Forsyth res->nstore.u0.sival = 1;
86274a4d8c2SCharles.Forsyth }
86374a4d8c2SCharles.Forsyth
86474a4d8c2SCharles.Forsyth void
ocor(Node * n,Node * res)86574a4d8c2SCharles.Forsyth ocor(Node *n, Node *res)
86674a4d8c2SCharles.Forsyth {
86774a4d8c2SCharles.Forsyth Node l, r;
86874a4d8c2SCharles.Forsyth
86974a4d8c2SCharles.Forsyth res->op = OCONST;
87074a4d8c2SCharles.Forsyth res->type = TINT;
87174a4d8c2SCharles.Forsyth res->nstore.u0.sival = 0;
87274a4d8c2SCharles.Forsyth expr(n->left, &l);
873*1272589eSCharles Forsyth if(boolx(&l)) {
87474a4d8c2SCharles.Forsyth res->nstore.u0.sival = 1;
87574a4d8c2SCharles.Forsyth return;
87674a4d8c2SCharles.Forsyth }
87774a4d8c2SCharles.Forsyth expr(n->right, &r);
878*1272589eSCharles Forsyth if(boolx(&r)) {
87974a4d8c2SCharles.Forsyth res->nstore.u0.sival = 1;
88074a4d8c2SCharles.Forsyth return;
88174a4d8c2SCharles.Forsyth }
88274a4d8c2SCharles.Forsyth }
88374a4d8c2SCharles.Forsyth
88474a4d8c2SCharles.Forsyth void
oeinc(Node * n,Node * res)88574a4d8c2SCharles.Forsyth oeinc(Node *n, Node *res)
88674a4d8c2SCharles.Forsyth {
88774a4d8c2SCharles.Forsyth Value *v;
88874a4d8c2SCharles.Forsyth
88974a4d8c2SCharles.Forsyth chklval(n->left);
89074a4d8c2SCharles.Forsyth v = n->left->sym->v;
89174a4d8c2SCharles.Forsyth res->op = OCONST;
89274a4d8c2SCharles.Forsyth res->type = v->type;
89374a4d8c2SCharles.Forsyth switch(v->type) {
89474a4d8c2SCharles.Forsyth case TINT:
89574a4d8c2SCharles.Forsyth if(n->op == OEDEC)
89674a4d8c2SCharles.Forsyth v->vstore.u0.sival -= fmtsize(v);
89774a4d8c2SCharles.Forsyth else
89874a4d8c2SCharles.Forsyth v->vstore.u0.sival += fmtsize(v);
89974a4d8c2SCharles.Forsyth break;
90074a4d8c2SCharles.Forsyth case TFLOAT:
90174a4d8c2SCharles.Forsyth if(n->op == OEDEC)
90274a4d8c2SCharles.Forsyth v->vstore.u0.sfval--;
90374a4d8c2SCharles.Forsyth else
90474a4d8c2SCharles.Forsyth v->vstore.u0.sfval++;
90574a4d8c2SCharles.Forsyth break;
90674a4d8c2SCharles.Forsyth default:
90774a4d8c2SCharles.Forsyth error("bad type for pre --/++");
90874a4d8c2SCharles.Forsyth }
90974a4d8c2SCharles.Forsyth res->nstore = v->vstore;
91074a4d8c2SCharles.Forsyth }
91174a4d8c2SCharles.Forsyth
91274a4d8c2SCharles.Forsyth void
opinc(Node * n,Node * res)91374a4d8c2SCharles.Forsyth opinc(Node *n, Node *res)
91474a4d8c2SCharles.Forsyth {
91574a4d8c2SCharles.Forsyth Value *v;
91674a4d8c2SCharles.Forsyth
91774a4d8c2SCharles.Forsyth chklval(n->left);
91874a4d8c2SCharles.Forsyth v = n->left->sym->v;
91974a4d8c2SCharles.Forsyth res->op = OCONST;
92074a4d8c2SCharles.Forsyth res->type = v->type;
92174a4d8c2SCharles.Forsyth res->nstore = v->vstore;
92274a4d8c2SCharles.Forsyth switch(v->type) {
92374a4d8c2SCharles.Forsyth case TINT:
92474a4d8c2SCharles.Forsyth if(n->op == OPDEC)
92574a4d8c2SCharles.Forsyth v->vstore.u0.sival -= fmtsize(v);
92674a4d8c2SCharles.Forsyth else
92774a4d8c2SCharles.Forsyth v->vstore.u0.sival += fmtsize(v);
92874a4d8c2SCharles.Forsyth break;
92974a4d8c2SCharles.Forsyth case TFLOAT:
93074a4d8c2SCharles.Forsyth if(n->op == OPDEC)
93174a4d8c2SCharles.Forsyth v->vstore.u0.sfval--;
93274a4d8c2SCharles.Forsyth else
93374a4d8c2SCharles.Forsyth v->vstore.u0.sfval++;
93474a4d8c2SCharles.Forsyth break;
93574a4d8c2SCharles.Forsyth default:
93674a4d8c2SCharles.Forsyth error("bad type for post --/++");
93774a4d8c2SCharles.Forsyth }
93874a4d8c2SCharles.Forsyth }
93974a4d8c2SCharles.Forsyth
94074a4d8c2SCharles.Forsyth void
ocall(Node * n,Node * res)94174a4d8c2SCharles.Forsyth ocall(Node *n, Node *res)
94274a4d8c2SCharles.Forsyth {
94374a4d8c2SCharles.Forsyth Lsym *s;
94474a4d8c2SCharles.Forsyth Rplace *rsav;
94574a4d8c2SCharles.Forsyth
94674a4d8c2SCharles.Forsyth res->op = OCONST; /* Default return value */
94774a4d8c2SCharles.Forsyth res->type = TLIST;
94874a4d8c2SCharles.Forsyth res->nstore.u0.sl = 0;
94974a4d8c2SCharles.Forsyth
95074a4d8c2SCharles.Forsyth chklval(n->left);
95174a4d8c2SCharles.Forsyth s = n->left->sym;
95274a4d8c2SCharles.Forsyth
95374a4d8c2SCharles.Forsyth if(s->builtin) {
95474a4d8c2SCharles.Forsyth (*s->builtin)(res, n->right);
95574a4d8c2SCharles.Forsyth return;
95674a4d8c2SCharles.Forsyth }
95774a4d8c2SCharles.Forsyth if(s->proc == 0)
95874a4d8c2SCharles.Forsyth error("no function %s", s->name);
95974a4d8c2SCharles.Forsyth
96074a4d8c2SCharles.Forsyth rsav = ret;
96174a4d8c2SCharles.Forsyth call(s->name, n->right, s->proc->left, s->proc->right, res);
96274a4d8c2SCharles.Forsyth ret = rsav;
96374a4d8c2SCharles.Forsyth }
96474a4d8c2SCharles.Forsyth
96574a4d8c2SCharles.Forsyth void
ofmt(Node * n,Node * res)96674a4d8c2SCharles.Forsyth ofmt(Node *n, Node *res)
96774a4d8c2SCharles.Forsyth {
96874a4d8c2SCharles.Forsyth expr(n->left, res);
96974a4d8c2SCharles.Forsyth res->nstore.fmt = n->right->nstore.u0.sival;
97074a4d8c2SCharles.Forsyth }
97174a4d8c2SCharles.Forsyth
97274a4d8c2SCharles.Forsyth void
owhat(Node * n,Node * res)97374a4d8c2SCharles.Forsyth owhat(Node *n, Node *res)
97474a4d8c2SCharles.Forsyth {
97574a4d8c2SCharles.Forsyth res->op = OCONST; /* Default return value */
97674a4d8c2SCharles.Forsyth res->type = TLIST;
97774a4d8c2SCharles.Forsyth res->nstore.u0.sl = 0;
97874a4d8c2SCharles.Forsyth whatis(n->sym);
97974a4d8c2SCharles.Forsyth }
98074a4d8c2SCharles.Forsyth
98174a4d8c2SCharles.Forsyth void (*expop[])(Node*, Node*) =
98274a4d8c2SCharles.Forsyth {
98374a4d8c2SCharles.Forsyth oname, /* [ONAME] oname, */
98474a4d8c2SCharles.Forsyth oconst, /* [OCONST] oconst, */
98574a4d8c2SCharles.Forsyth omul, /* [OMUL] omul, */
98674a4d8c2SCharles.Forsyth odiv, /* [ODIV] odiv, */
98774a4d8c2SCharles.Forsyth omod, /* [OMOD] omod, */
98874a4d8c2SCharles.Forsyth oadd, /* [OADD] oadd, */
98974a4d8c2SCharles.Forsyth osub, /* [OSUB] osub, */
99074a4d8c2SCharles.Forsyth orsh, /* [ORSH] orsh, */
99174a4d8c2SCharles.Forsyth olsh, /* [OLSH] olsh, */
99274a4d8c2SCharles.Forsyth olt, /* [OLT] olt, */
99374a4d8c2SCharles.Forsyth ogt, /* [OGT] ogt, */
99474a4d8c2SCharles.Forsyth oleq, /* [OLEQ] oleq, */
99574a4d8c2SCharles.Forsyth ogeq, /* [OGEQ] ogeq, */
99674a4d8c2SCharles.Forsyth oeq, /* [OEQ] oeq, */
99774a4d8c2SCharles.Forsyth oeq, /* [ONEQ] oeq, */
99874a4d8c2SCharles.Forsyth oland, /* [OLAND] oland, */
99974a4d8c2SCharles.Forsyth oxor, /* [OXOR] oxor, */
100074a4d8c2SCharles.Forsyth olor, /* [OLOR] olor, */
100174a4d8c2SCharles.Forsyth ocand, /* [OCAND] ocand, */
100274a4d8c2SCharles.Forsyth ocor, /* [OCOR] ocor, */
100374a4d8c2SCharles.Forsyth oasgn, /* [OASGN] oasgn, */
100474a4d8c2SCharles.Forsyth oindm, /* [OINDM] oindm, */
100574a4d8c2SCharles.Forsyth oeinc, /* [OEDEC] oeinc, */
100674a4d8c2SCharles.Forsyth oeinc, /* [OEINC] oeinc, */
100774a4d8c2SCharles.Forsyth opinc, /* [OPINC] opinc, */
100874a4d8c2SCharles.Forsyth opinc, /* [OPDEC] opinc, */
100974a4d8c2SCharles.Forsyth onot, /* [ONOT] onot, */
101074a4d8c2SCharles.Forsyth 0, /* [OIF] 0, */
101174a4d8c2SCharles.Forsyth 0, /* [ODO] 0, */
101274a4d8c2SCharles.Forsyth olist, /* [OLIST] olist, */
101374a4d8c2SCharles.Forsyth ocall, /* [OCALL] ocall, */
101474a4d8c2SCharles.Forsyth octruct, /* [OCTRUCT] octruct, */
101574a4d8c2SCharles.Forsyth 0, /* [OWHILE] 0, */
101674a4d8c2SCharles.Forsyth 0, /* [OELSE] 0, */
101774a4d8c2SCharles.Forsyth ohead, /* [OHEAD] ohead, */
101874a4d8c2SCharles.Forsyth otail, /* [OTAIL] otail, */
101974a4d8c2SCharles.Forsyth oappend, /* [OAPPEND] oappend, */
102074a4d8c2SCharles.Forsyth 0, /* [ORET] 0, */
102174a4d8c2SCharles.Forsyth oindex, /* [OINDEX] oindex, */
102274a4d8c2SCharles.Forsyth oindc, /* [OINDC] oindc, */
102374a4d8c2SCharles.Forsyth odot, /* [ODOT] odot, */
102474a4d8c2SCharles.Forsyth 0, /* [OLOCAL] 0, */
102574a4d8c2SCharles.Forsyth oframe, /* [OFRAME] oframe, */
102674a4d8c2SCharles.Forsyth 0, /* [OCOMPLEX] 0, */
102774a4d8c2SCharles.Forsyth odelete, /* [ODELETE] odelete, */
102874a4d8c2SCharles.Forsyth ocast, /* [OCAST] ocast, */
102974a4d8c2SCharles.Forsyth ofmt, /* [OFMT] ofmt, */
103074a4d8c2SCharles.Forsyth oeval, /* [OEVAL] oeval, */
103174a4d8c2SCharles.Forsyth owhat, /* [OWHAT] owhat, */
103274a4d8c2SCharles.Forsyth };
1033