xref: /plan9/sys/src/cmd/cc/funct.c (revision c88b16f0f24f874f22e13ccc0947c732c69371b1)
180ee5cbfSDavid du Colombier #include	"cc.h"
280ee5cbfSDavid du Colombier 
380ee5cbfSDavid du Colombier typedef	struct	Ftab	Ftab;
480ee5cbfSDavid du Colombier struct	Ftab
580ee5cbfSDavid du Colombier {
680ee5cbfSDavid du Colombier 	char	op;
780ee5cbfSDavid du Colombier 	char*	name;
880ee5cbfSDavid du Colombier 	char	typ;
980ee5cbfSDavid du Colombier };
1080ee5cbfSDavid du Colombier typedef	struct	Gtab	Gtab;
1180ee5cbfSDavid du Colombier struct	Gtab
1280ee5cbfSDavid du Colombier {
1380ee5cbfSDavid du Colombier 	char	etype;
1480ee5cbfSDavid du Colombier 	char*	name;
1580ee5cbfSDavid du Colombier };
1680ee5cbfSDavid du Colombier 
1780ee5cbfSDavid du Colombier Ftab	ftabinit[OEND];
1880ee5cbfSDavid du Colombier Gtab	gtabinit[NTYPE];
1980ee5cbfSDavid du Colombier 
2080ee5cbfSDavid du Colombier int
isfunct(Node * n)2180ee5cbfSDavid du Colombier isfunct(Node *n)
2280ee5cbfSDavid du Colombier {
2380ee5cbfSDavid du Colombier 	Type *t, *t1;
2480ee5cbfSDavid du Colombier 	Funct *f;
2580ee5cbfSDavid du Colombier 	Node *l;
2680ee5cbfSDavid du Colombier 	Sym *s;
2780ee5cbfSDavid du Colombier 	int o;
2880ee5cbfSDavid du Colombier 
2980ee5cbfSDavid du Colombier 	o = n->op;
3080ee5cbfSDavid du Colombier 	if(n->left == Z)
3180ee5cbfSDavid du Colombier 		goto no;
3280ee5cbfSDavid du Colombier 	t = n->left->type;
3380ee5cbfSDavid du Colombier 	if(t == T)
3480ee5cbfSDavid du Colombier 		goto no;
3580ee5cbfSDavid du Colombier 	f = t->funct;
3680ee5cbfSDavid du Colombier 
3780ee5cbfSDavid du Colombier 	switch(o) {
3880ee5cbfSDavid du Colombier 	case OAS:	// put cast on rhs
3980ee5cbfSDavid du Colombier 	case OASI:
4080ee5cbfSDavid du Colombier 	case OASADD:
4180ee5cbfSDavid du Colombier 	case OASAND:
4280ee5cbfSDavid du Colombier 	case OASASHL:
4380ee5cbfSDavid du Colombier 	case OASASHR:
4480ee5cbfSDavid du Colombier 	case OASDIV:
4580ee5cbfSDavid du Colombier 	case OASLDIV:
4680ee5cbfSDavid du Colombier 	case OASLMOD:
4780ee5cbfSDavid du Colombier 	case OASLMUL:
4880ee5cbfSDavid du Colombier 	case OASLSHR:
4980ee5cbfSDavid du Colombier 	case OASMOD:
5080ee5cbfSDavid du Colombier 	case OASMUL:
5180ee5cbfSDavid du Colombier 	case OASOR:
5280ee5cbfSDavid du Colombier 	case OASSUB:
5380ee5cbfSDavid du Colombier 	case OASXOR:
5480ee5cbfSDavid du Colombier 		if(n->right == Z)
5580ee5cbfSDavid du Colombier 			goto no;
5680ee5cbfSDavid du Colombier 		t1 = n->right->type;
5780ee5cbfSDavid du Colombier 		if(t1 == T)
5880ee5cbfSDavid du Colombier 			goto no;
5980ee5cbfSDavid du Colombier 		if(t1->funct == f)
6080ee5cbfSDavid du Colombier 			break;
6180ee5cbfSDavid du Colombier 
6280ee5cbfSDavid du Colombier 		l = new(OXXX, Z, Z);
6380ee5cbfSDavid du Colombier 		*l = *n->right;
6480ee5cbfSDavid du Colombier 
6580ee5cbfSDavid du Colombier 		n->right->left = l;
6680ee5cbfSDavid du Colombier 		n->right->right = Z;
6780ee5cbfSDavid du Colombier 		n->right->type = t;
6880ee5cbfSDavid du Colombier 		n->right->op = OCAST;
6980ee5cbfSDavid du Colombier 
7080ee5cbfSDavid du Colombier 		if(!isfunct(n->right))
7180ee5cbfSDavid du Colombier 			prtree(n, "isfunc !");
7280ee5cbfSDavid du Colombier 		break;
7380ee5cbfSDavid du Colombier 
7480ee5cbfSDavid du Colombier 	case OCAST:	// t f(T) or T f(t)
7580ee5cbfSDavid du Colombier 		t1 = n->type;
7680ee5cbfSDavid du Colombier 		if(t1 == T)
7780ee5cbfSDavid du Colombier 			goto no;
7880ee5cbfSDavid du Colombier 		if(f != nil) {
7980ee5cbfSDavid du Colombier 			s = f->castfr[t1->etype];
8080ee5cbfSDavid du Colombier 			if(s == S)
8180ee5cbfSDavid du Colombier 				goto no;
8280ee5cbfSDavid du Colombier 			n->right = n->left;
8380ee5cbfSDavid du Colombier 			goto build;
8480ee5cbfSDavid du Colombier 		}
8580ee5cbfSDavid du Colombier 		f = t1->funct;
8680ee5cbfSDavid du Colombier 		if(f != nil) {
8780ee5cbfSDavid du Colombier 			s = f->castto[t->etype];
8880ee5cbfSDavid du Colombier 			if(s == S)
8980ee5cbfSDavid du Colombier 				goto no;
9080ee5cbfSDavid du Colombier 			n->right = n->left;
9180ee5cbfSDavid du Colombier 			goto build;
9280ee5cbfSDavid du Colombier 		}
9380ee5cbfSDavid du Colombier 		goto no;
9480ee5cbfSDavid du Colombier 	}
9580ee5cbfSDavid du Colombier 
9680ee5cbfSDavid du Colombier 	if(f == nil)
9780ee5cbfSDavid du Colombier 		goto no;
9880ee5cbfSDavid du Colombier 	s = f->sym[o];
9980ee5cbfSDavid du Colombier 	if(s == S)
10080ee5cbfSDavid du Colombier 		goto no;
10180ee5cbfSDavid du Colombier 
10280ee5cbfSDavid du Colombier 	/*
10380ee5cbfSDavid du Colombier 	 * the answer is yes,
10480ee5cbfSDavid du Colombier 	 * now we rewrite the node
10580ee5cbfSDavid du Colombier 	 * and give diagnostics
10680ee5cbfSDavid du Colombier 	 */
10780ee5cbfSDavid du Colombier 	switch(o) {
10880ee5cbfSDavid du Colombier 	default:
10980ee5cbfSDavid du Colombier 		diag(n, "isfunct op missing %O\n", o);
11080ee5cbfSDavid du Colombier 		goto bad;
11180ee5cbfSDavid du Colombier 
11280ee5cbfSDavid du Colombier 	case OADD:	// T f(T, T)
11380ee5cbfSDavid du Colombier 	case OAND:
11480ee5cbfSDavid du Colombier 	case OASHL:
11580ee5cbfSDavid du Colombier 	case OASHR:
11680ee5cbfSDavid du Colombier 	case ODIV:
11780ee5cbfSDavid du Colombier 	case OLDIV:
11880ee5cbfSDavid du Colombier 	case OLMOD:
11980ee5cbfSDavid du Colombier 	case OLMUL:
12080ee5cbfSDavid du Colombier 	case OLSHR:
12180ee5cbfSDavid du Colombier 	case OMOD:
12280ee5cbfSDavid du Colombier 	case OMUL:
12380ee5cbfSDavid du Colombier 	case OOR:
12480ee5cbfSDavid du Colombier 	case OSUB:
12580ee5cbfSDavid du Colombier 	case OXOR:
12680ee5cbfSDavid du Colombier 
12780ee5cbfSDavid du Colombier 	case OEQ:	// int f(T, T)
12880ee5cbfSDavid du Colombier 	case OGE:
12980ee5cbfSDavid du Colombier 	case OGT:
13080ee5cbfSDavid du Colombier 	case OHI:
13180ee5cbfSDavid du Colombier 	case OHS:
13280ee5cbfSDavid du Colombier 	case OLE:
13380ee5cbfSDavid du Colombier 	case OLO:
13480ee5cbfSDavid du Colombier 	case OLS:
13580ee5cbfSDavid du Colombier 	case OLT:
13680ee5cbfSDavid du Colombier 	case ONE:
13780ee5cbfSDavid du Colombier 		if(n->right == Z)
13880ee5cbfSDavid du Colombier 			goto bad;
13980ee5cbfSDavid du Colombier 		t1 = n->right->type;
14080ee5cbfSDavid du Colombier 		if(t1 == T)
14180ee5cbfSDavid du Colombier 			goto bad;
14280ee5cbfSDavid du Colombier 		if(t1->funct != f)
14380ee5cbfSDavid du Colombier 			goto bad;
14480ee5cbfSDavid du Colombier 		n->right = new(OLIST, n->left, n->right);
14580ee5cbfSDavid du Colombier 		break;
14680ee5cbfSDavid du Colombier 
14780ee5cbfSDavid du Colombier 	case OAS:	// structure copies done by the compiler
14880ee5cbfSDavid du Colombier 	case OASI:
14980ee5cbfSDavid du Colombier 		goto no;
15080ee5cbfSDavid du Colombier 
15180ee5cbfSDavid du Colombier 	case OASADD:	// T f(T*, T)
15280ee5cbfSDavid du Colombier 	case OASAND:
15380ee5cbfSDavid du Colombier 	case OASASHL:
15480ee5cbfSDavid du Colombier 	case OASASHR:
15580ee5cbfSDavid du Colombier 	case OASDIV:
15680ee5cbfSDavid du Colombier 	case OASLDIV:
15780ee5cbfSDavid du Colombier 	case OASLMOD:
15880ee5cbfSDavid du Colombier 	case OASLMUL:
15980ee5cbfSDavid du Colombier 	case OASLSHR:
16080ee5cbfSDavid du Colombier 	case OASMOD:
16180ee5cbfSDavid du Colombier 	case OASMUL:
16280ee5cbfSDavid du Colombier 	case OASOR:
16380ee5cbfSDavid du Colombier 	case OASSUB:
16480ee5cbfSDavid du Colombier 	case OASXOR:
16580ee5cbfSDavid du Colombier 		if(n->right == Z)
16680ee5cbfSDavid du Colombier 			goto bad;
16780ee5cbfSDavid du Colombier 		t1 = n->right->type;
16880ee5cbfSDavid du Colombier 		if(t1 == T)
16980ee5cbfSDavid du Colombier 			goto bad;
17080ee5cbfSDavid du Colombier 		if(t1->funct != f)
17180ee5cbfSDavid du Colombier 			goto bad;
17280ee5cbfSDavid du Colombier 		n->right = new(OLIST, new(OADDR, n->left, Z), n->right);
17380ee5cbfSDavid du Colombier 		break;
17480ee5cbfSDavid du Colombier 
17580ee5cbfSDavid du Colombier 	case OPOS:	// T f(T)
17680ee5cbfSDavid du Colombier 	case ONEG:
17780ee5cbfSDavid du Colombier 	case ONOT:
17880ee5cbfSDavid du Colombier 	case OCOM:
17980ee5cbfSDavid du Colombier 		n->right = n->left;
18080ee5cbfSDavid du Colombier 		break;
18180ee5cbfSDavid du Colombier 
18280ee5cbfSDavid du Colombier 
18380ee5cbfSDavid du Colombier 	}
18480ee5cbfSDavid du Colombier 
18580ee5cbfSDavid du Colombier build:
18680ee5cbfSDavid du Colombier 	l = new(ONAME, Z, Z);
18780ee5cbfSDavid du Colombier 	l->sym = s;
18880ee5cbfSDavid du Colombier 	l->type = s->type;
18980ee5cbfSDavid du Colombier 	l->etype = s->type->etype;
19080ee5cbfSDavid du Colombier 	l->xoffset = s->offset;
19180ee5cbfSDavid du Colombier 	l->class = s->class;
19280ee5cbfSDavid du Colombier 	tcomo(l, 0);
19380ee5cbfSDavid du Colombier 
19480ee5cbfSDavid du Colombier 	n->op = OFUNC;
19580ee5cbfSDavid du Colombier 	n->left = l;
19680ee5cbfSDavid du Colombier 	n->type = l->type->link;
19780ee5cbfSDavid du Colombier 	if(tcompat(n, T, l->type, tfunct))
19880ee5cbfSDavid du Colombier 		goto bad;
19980ee5cbfSDavid du Colombier 	if(tcoma(n->left, n->right, l->type->down, 1))
20080ee5cbfSDavid du Colombier 		goto bad;
20180ee5cbfSDavid du Colombier 	return 1;
20280ee5cbfSDavid du Colombier 
20380ee5cbfSDavid du Colombier no:
20480ee5cbfSDavid du Colombier 	return 0;
20580ee5cbfSDavid du Colombier 
20680ee5cbfSDavid du Colombier bad:
20780ee5cbfSDavid du Colombier 	diag(n, "cant rewrite typestr for op %O\n", o);
20880ee5cbfSDavid du Colombier 	prtree(n, "isfunct");
20980ee5cbfSDavid du Colombier 	n->type = T;
21080ee5cbfSDavid du Colombier 	return 1;
21180ee5cbfSDavid du Colombier }
21280ee5cbfSDavid du Colombier 
21380ee5cbfSDavid du Colombier void
dclfunct(Type * t,Sym * s)21480ee5cbfSDavid du Colombier dclfunct(Type *t, Sym *s)
21580ee5cbfSDavid du Colombier {
21680ee5cbfSDavid du Colombier 	Funct *f;
21780ee5cbfSDavid du Colombier 	Node *n;
21880ee5cbfSDavid du Colombier 	Type *f1, *f2, *f3, *f4;
21980ee5cbfSDavid du Colombier 	int o, i, c;
22080ee5cbfSDavid du Colombier 	char str[100];
22180ee5cbfSDavid du Colombier 
22280ee5cbfSDavid du Colombier 	if(t->funct)
22380ee5cbfSDavid du Colombier 		return;
22480ee5cbfSDavid du Colombier 
22580ee5cbfSDavid du Colombier 	// recognize generated tag of dorm _%d_
22680ee5cbfSDavid du Colombier 	if(t->tag == S)
22780ee5cbfSDavid du Colombier 		goto bad;
22880ee5cbfSDavid du Colombier 	for(i=0; c = t->tag->name[i]; i++) {
22980ee5cbfSDavid du Colombier 		if(c == '_') {
23080ee5cbfSDavid du Colombier 			if(i == 0 || t->tag->name[i+1] == 0)
23180ee5cbfSDavid du Colombier 				continue;
23280ee5cbfSDavid du Colombier 			break;
23380ee5cbfSDavid du Colombier 		}
23480ee5cbfSDavid du Colombier 		if(c < '0' || c > '9')
23580ee5cbfSDavid du Colombier 			break;
23680ee5cbfSDavid du Colombier 	}
23780ee5cbfSDavid du Colombier 	if(c == 0)
23880ee5cbfSDavid du Colombier 		goto bad;
23980ee5cbfSDavid du Colombier 
24080ee5cbfSDavid du Colombier 	f = alloc(sizeof(*f));
241*c88b16f0SDavid du Colombier 	for(o=0; o<nelem(f->sym); o++)
24280ee5cbfSDavid du Colombier 		f->sym[o] = S;
24380ee5cbfSDavid du Colombier 
24480ee5cbfSDavid du Colombier 	t->funct = f;
24580ee5cbfSDavid du Colombier 
24680ee5cbfSDavid du Colombier 	f1 = typ(TFUNC, t);
24780ee5cbfSDavid du Colombier 	f1->down = copytyp(t);
24880ee5cbfSDavid du Colombier 	f1->down->down = t;
24980ee5cbfSDavid du Colombier 
25080ee5cbfSDavid du Colombier 	f2 = typ(TFUNC, types[TINT]);
25180ee5cbfSDavid du Colombier 	f2->down = copytyp(t);
25280ee5cbfSDavid du Colombier 	f2->down->down = t;
25380ee5cbfSDavid du Colombier 
25480ee5cbfSDavid du Colombier 	f3 = typ(TFUNC, t);
25580ee5cbfSDavid du Colombier 	f3->down = typ(TIND, t);
25680ee5cbfSDavid du Colombier 	f3->down->down = t;
25780ee5cbfSDavid du Colombier 
25880ee5cbfSDavid du Colombier 	f4 = typ(TFUNC, t);
25980ee5cbfSDavid du Colombier 	f4->down = t;
26080ee5cbfSDavid du Colombier 
26180ee5cbfSDavid du Colombier 	for(i=0;; i++) {
26280ee5cbfSDavid du Colombier 		o = ftabinit[i].op;
26380ee5cbfSDavid du Colombier 		if(o == OXXX)
26480ee5cbfSDavid du Colombier 			break;
26580ee5cbfSDavid du Colombier 		sprint(str, "%s_%s_", t->tag->name, ftabinit[i].name);
26680ee5cbfSDavid du Colombier 		n = new(ONAME, Z, Z);
26780ee5cbfSDavid du Colombier 		n->sym = slookup(str);
26880ee5cbfSDavid du Colombier 		f->sym[o] = n->sym;
26980ee5cbfSDavid du Colombier 		switch(ftabinit[i].typ) {
27080ee5cbfSDavid du Colombier 		default:
27180ee5cbfSDavid du Colombier 			diag(Z, "dclfunct op missing %d\n", ftabinit[i].typ);
27280ee5cbfSDavid du Colombier 			break;
27380ee5cbfSDavid du Colombier 
27480ee5cbfSDavid du Colombier 		case 1:	// T f(T,T)	+
27580ee5cbfSDavid du Colombier 			dodecl(xdecl, CEXTERN, f1, n);
27680ee5cbfSDavid du Colombier 			break;
27780ee5cbfSDavid du Colombier 
27880ee5cbfSDavid du Colombier 		case 2:	// int f(T,T)	==
27980ee5cbfSDavid du Colombier 			dodecl(xdecl, CEXTERN, f2, n);
28080ee5cbfSDavid du Colombier 			break;
28180ee5cbfSDavid du Colombier 
28280ee5cbfSDavid du Colombier 		case 3:	// void f(T*,T)	+=
28380ee5cbfSDavid du Colombier 			dodecl(xdecl, CEXTERN, f3, n);
28480ee5cbfSDavid du Colombier 			break;
28580ee5cbfSDavid du Colombier 
28680ee5cbfSDavid du Colombier 		case 4:	// T f(T)	~
28780ee5cbfSDavid du Colombier 			dodecl(xdecl, CEXTERN, f4, n);
28880ee5cbfSDavid du Colombier 			break;
28980ee5cbfSDavid du Colombier 		}
29080ee5cbfSDavid du Colombier 	}
29180ee5cbfSDavid du Colombier 	for(i=0;; i++) {
29280ee5cbfSDavid du Colombier 		o = gtabinit[i].etype;
29380ee5cbfSDavid du Colombier 		if(o == TXXX)
29480ee5cbfSDavid du Colombier 			break;
29580ee5cbfSDavid du Colombier 
29680ee5cbfSDavid du Colombier 		/*
29780ee5cbfSDavid du Colombier 		 * OCAST types T1 _T2_T1_(T2)
29880ee5cbfSDavid du Colombier 		 */
29980ee5cbfSDavid du Colombier 		sprint(str, "_%s%s_", gtabinit[i].name, t->tag->name);
30080ee5cbfSDavid du Colombier 		n = new(ONAME, Z, Z);
30180ee5cbfSDavid du Colombier 		n->sym = slookup(str);
30280ee5cbfSDavid du Colombier 		f->castto[o] = n->sym;
30380ee5cbfSDavid du Colombier 
30480ee5cbfSDavid du Colombier 		f1 = typ(TFUNC, t);
30580ee5cbfSDavid du Colombier 		f1->down = types[o];
30680ee5cbfSDavid du Colombier 		dodecl(xdecl, CEXTERN, f1, n);
30780ee5cbfSDavid du Colombier 
30880ee5cbfSDavid du Colombier 		sprint(str, "%s_%s_", t->tag->name, gtabinit[i].name);
30980ee5cbfSDavid du Colombier 		n = new(ONAME, Z, Z);
31080ee5cbfSDavid du Colombier 		n->sym = slookup(str);
31180ee5cbfSDavid du Colombier 		f->castfr[o] = n->sym;
31280ee5cbfSDavid du Colombier 
31380ee5cbfSDavid du Colombier 		f1 = typ(TFUNC, types[o]);
31480ee5cbfSDavid du Colombier 		f1->down = t;
31580ee5cbfSDavid du Colombier 		dodecl(xdecl, CEXTERN, f1, n);
31680ee5cbfSDavid du Colombier 	}
31780ee5cbfSDavid du Colombier 	return;
31880ee5cbfSDavid du Colombier bad:
31980ee5cbfSDavid du Colombier 	diag(Z, "dclfunct bad %T %s\n", t, s->name);
32080ee5cbfSDavid du Colombier }
32180ee5cbfSDavid du Colombier 
32280ee5cbfSDavid du Colombier Gtab	gtabinit[NTYPE] =
32380ee5cbfSDavid du Colombier {
32480ee5cbfSDavid du Colombier 	TCHAR,		"c",
32580ee5cbfSDavid du Colombier 	TUCHAR,		"uc",
32680ee5cbfSDavid du Colombier 	TSHORT,		"h",
32780ee5cbfSDavid du Colombier 	TUSHORT,	"uh",
32880ee5cbfSDavid du Colombier 	TINT,		"i",
32980ee5cbfSDavid du Colombier 	TUINT,		"ui",
33080ee5cbfSDavid du Colombier 	TLONG,		"l",
33180ee5cbfSDavid du Colombier 	TULONG,		"ul",
33280ee5cbfSDavid du Colombier 	TVLONG,		"v",
33380ee5cbfSDavid du Colombier 	TUVLONG,	"uv",
33480ee5cbfSDavid du Colombier 	TFLOAT,		"f",
33580ee5cbfSDavid du Colombier 	TDOUBLE,	"d",
33680ee5cbfSDavid du Colombier 	TXXX
33780ee5cbfSDavid du Colombier };
33880ee5cbfSDavid du Colombier 
33980ee5cbfSDavid du Colombier Ftab	ftabinit[OEND] =
34080ee5cbfSDavid du Colombier {
34180ee5cbfSDavid du Colombier 	OADD,		"add",		1,
34280ee5cbfSDavid du Colombier 	OAND,		"and",		1,
34380ee5cbfSDavid du Colombier 	OASHL,		"ashl",		1,
34480ee5cbfSDavid du Colombier 	OASHR,		"ashr",		1,
34580ee5cbfSDavid du Colombier 	ODIV,		"div",		1,
34680ee5cbfSDavid du Colombier 	OLDIV,		"ldiv",		1,
34780ee5cbfSDavid du Colombier 	OLMOD,		"lmod",		1,
34880ee5cbfSDavid du Colombier 	OLMUL,		"lmul",		1,
34980ee5cbfSDavid du Colombier 	OLSHR,		"lshr",		1,
35080ee5cbfSDavid du Colombier 	OMOD,		"mod",		1,
35180ee5cbfSDavid du Colombier 	OMUL,		"mul",		1,
35280ee5cbfSDavid du Colombier 	OOR,		"or",		1,
35380ee5cbfSDavid du Colombier 	OSUB,		"sub",		1,
35480ee5cbfSDavid du Colombier 	OXOR,		"xor",		1,
35580ee5cbfSDavid du Colombier 
35680ee5cbfSDavid du Colombier 	OEQ,		"eq",		2,
35780ee5cbfSDavid du Colombier 	OGE,		"ge",		2,
35880ee5cbfSDavid du Colombier 	OGT,		"gt",		2,
35980ee5cbfSDavid du Colombier 	OHI,		"hi",		2,
36080ee5cbfSDavid du Colombier 	OHS,		"hs",		2,
36180ee5cbfSDavid du Colombier 	OLE,		"le",		2,
36280ee5cbfSDavid du Colombier 	OLO,		"lo",		2,
36380ee5cbfSDavid du Colombier 	OLS,		"ls",		2,
36480ee5cbfSDavid du Colombier 	OLT,		"lt",		2,
36580ee5cbfSDavid du Colombier 	ONE,		"ne",		2,
36680ee5cbfSDavid du Colombier 
36780ee5cbfSDavid du Colombier 	OASADD,		"asadd",	3,
36880ee5cbfSDavid du Colombier 	OASAND,		"asand",	3,
36980ee5cbfSDavid du Colombier 	OASASHL,	"asashl",	3,
37080ee5cbfSDavid du Colombier 	OASASHR,	"asashr",	3,
37180ee5cbfSDavid du Colombier 	OASDIV,		"asdiv",	3,
37280ee5cbfSDavid du Colombier 	OASLDIV,	"asldiv",	3,
37380ee5cbfSDavid du Colombier 	OASLMOD,	"aslmod",	3,
37480ee5cbfSDavid du Colombier 	OASLMUL,	"aslmul",	3,
37580ee5cbfSDavid du Colombier 	OASLSHR,	"aslshr",	3,
37680ee5cbfSDavid du Colombier 	OASMOD,		"asmod",	3,
37780ee5cbfSDavid du Colombier 	OASMUL,		"asmul",	3,
37880ee5cbfSDavid du Colombier 	OASOR,		"asor",		3,
37980ee5cbfSDavid du Colombier 	OASSUB,		"assub",	3,
38080ee5cbfSDavid du Colombier 	OASXOR,		"asxor",	3,
38180ee5cbfSDavid du Colombier 
38280ee5cbfSDavid du Colombier 	OPOS,		"pos",		4,
38380ee5cbfSDavid du Colombier 	ONEG,		"neg",		4,
38480ee5cbfSDavid du Colombier 	OCOM,		"com",		4,
38580ee5cbfSDavid du Colombier 	ONOT,		"not",		4,
38680ee5cbfSDavid du Colombier 
38780ee5cbfSDavid du Colombier //	OPOSTDEC,
38880ee5cbfSDavid du Colombier //	OPOSTINC,
38980ee5cbfSDavid du Colombier //	OPREDEC,
39080ee5cbfSDavid du Colombier //	OPREINC,
39180ee5cbfSDavid du Colombier 
39280ee5cbfSDavid du Colombier 	OXXX,
39380ee5cbfSDavid du Colombier };
39480ee5cbfSDavid du Colombier 
39580ee5cbfSDavid du Colombier //	Node*	nodtestv;
39680ee5cbfSDavid du Colombier 
39780ee5cbfSDavid du Colombier //	Node*	nodvpp;
39880ee5cbfSDavid du Colombier //	Node*	nodppv;
39980ee5cbfSDavid du Colombier //	Node*	nodvmm;
40080ee5cbfSDavid du Colombier //	Node*	nodmmv;
401