xref: /plan9/sys/src/cmd/cc/sub.c (revision 82726826a7b3d40fb66339b4b0e95b60314f98b9)
13e12c5d1SDavid du Colombier #include	"cc.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier Node*
new(int t,Node * l,Node * r)43e12c5d1SDavid du Colombier new(int t, Node *l, Node *r)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 	Node *n;
73e12c5d1SDavid du Colombier 
87dd7cddfSDavid du Colombier 	n = alloc(sizeof(*n));
93e12c5d1SDavid du Colombier 	n->op = t;
103e12c5d1SDavid du Colombier 	n->left = l;
113e12c5d1SDavid du Colombier 	n->right = r;
12b85a8364SDavid du Colombier 	if(l && t != OGOTO)
13b85a8364SDavid du Colombier 		n->lineno = l->lineno;
14b85a8364SDavid du Colombier 	else if(r)
15b85a8364SDavid du Colombier 		n->lineno = r->lineno;
16b85a8364SDavid du Colombier 	else
173e12c5d1SDavid du Colombier 		n->lineno = lineno;
183e12c5d1SDavid du Colombier 	newflag = 1;
193e12c5d1SDavid du Colombier 	return n;
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier Node*
new1(int o,Node * l,Node * r)233e12c5d1SDavid du Colombier new1(int o, Node *l, Node *r)
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier 	Node *n;
263e12c5d1SDavid du Colombier 
273e12c5d1SDavid du Colombier 	n = new(o, l, r);
283e12c5d1SDavid du Colombier 	n->lineno = nearln;
293e12c5d1SDavid du Colombier 	return n;
303e12c5d1SDavid du Colombier }
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier void
prtree(Node * n,char * s)333e12c5d1SDavid du Colombier prtree(Node *n, char *s)
343e12c5d1SDavid du Colombier {
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier 	print(" == %s ==\n", s);
373e12c5d1SDavid du Colombier 	prtree1(n, 0, 0);
383e12c5d1SDavid du Colombier 	print("\n");
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier void
prtree1(Node * n,int d,int f)423e12c5d1SDavid du Colombier prtree1(Node *n, int d, int f)
433e12c5d1SDavid du Colombier {
443e12c5d1SDavid du Colombier 	int i;
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier 	if(f)
473e12c5d1SDavid du Colombier 	for(i=0; i<d; i++)
483e12c5d1SDavid du Colombier 		print("   ");
493e12c5d1SDavid du Colombier 	if(n == Z) {
503e12c5d1SDavid du Colombier 		print("Z\n");
513e12c5d1SDavid du Colombier 		return;
523e12c5d1SDavid du Colombier 	}
533e12c5d1SDavid du Colombier 	if(n->op == OLIST) {
543e12c5d1SDavid du Colombier 		prtree1(n->left, d, 0);
553e12c5d1SDavid du Colombier 		prtree1(n->right, d, 1);
563e12c5d1SDavid du Colombier 		return;
573e12c5d1SDavid du Colombier 	}
583e12c5d1SDavid du Colombier 	d++;
593e12c5d1SDavid du Colombier 	print("%O", n->op);
603e12c5d1SDavid du Colombier 	i = 3;
613e12c5d1SDavid du Colombier 	switch(n->op)
623e12c5d1SDavid du Colombier 	{
633e12c5d1SDavid du Colombier 	case ONAME:
64219b2ee8SDavid du Colombier 		print(" \"%F\"", n);
65219b2ee8SDavid du Colombier 		print(" %ld", n->xoffset);
663e12c5d1SDavid du Colombier 		i = 0;
673e12c5d1SDavid du Colombier 		break;
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier 	case OINDREG:
70219b2ee8SDavid du Colombier 		print(" %ld(R%d)", n->xoffset, n->reg);
713e12c5d1SDavid du Colombier 		i = 0;
723e12c5d1SDavid du Colombier 		break;
733e12c5d1SDavid du Colombier 
743e12c5d1SDavid du Colombier 	case OREGISTER:
75219b2ee8SDavid du Colombier 		if(n->xoffset)
76219b2ee8SDavid du Colombier 			print(" %ld+R%d", n->xoffset, n->reg);
773e12c5d1SDavid du Colombier 		else
783e12c5d1SDavid du Colombier 			print(" R%d", n->reg);
793e12c5d1SDavid du Colombier 		i = 0;
803e12c5d1SDavid du Colombier 		break;
813e12c5d1SDavid du Colombier 
823e12c5d1SDavid du Colombier 	case OSTRING:
83219b2ee8SDavid du Colombier 		print(" \"%s\"", n->cstring);
843e12c5d1SDavid du Colombier 		i = 0;
853e12c5d1SDavid du Colombier 		break;
863e12c5d1SDavid du Colombier 
873e12c5d1SDavid du Colombier 	case OLSTRING:
88*82726826SDavid du Colombier 		if(sizeof(TRune) == sizeof(Rune))
89*82726826SDavid du Colombier 			print(" \"%S\"", (Rune*)n->rstring);
90*82726826SDavid du Colombier 		else
91*82726826SDavid du Colombier 			print(" \"...\"");
923e12c5d1SDavid du Colombier 		i = 0;
933e12c5d1SDavid du Colombier 		break;
943e12c5d1SDavid du Colombier 
953e12c5d1SDavid du Colombier 	case ODOT:
96219b2ee8SDavid du Colombier 	case OELEM:
97219b2ee8SDavid du Colombier 		print(" \"%F\"", n);
983e12c5d1SDavid du Colombier 		break;
993e12c5d1SDavid du Colombier 
1003e12c5d1SDavid du Colombier 	case OCONST:
101219b2ee8SDavid du Colombier 		if(typefd[n->type->etype])
102219b2ee8SDavid du Colombier 			print(" \"%.8e\"", n->fconst);
1033e12c5d1SDavid du Colombier 		else
104219b2ee8SDavid du Colombier 			print(" \"%lld\"", n->vconst);
1053e12c5d1SDavid du Colombier 		i = 0;
1063e12c5d1SDavid du Colombier 		break;
1073e12c5d1SDavid du Colombier 	}
1083e12c5d1SDavid du Colombier 	if(n->addable != 0)
1093e12c5d1SDavid du Colombier 		print(" <%d>", n->addable);
1103e12c5d1SDavid du Colombier 	if(n->type != T)
1113e12c5d1SDavid du Colombier 		print(" %T", n->type);
1123e12c5d1SDavid du Colombier 	if(n->complex != 0)
1133e12c5d1SDavid du Colombier 		print(" (%d)", n->complex);
114b85a8364SDavid du Colombier 	print(" %L\n", n->lineno);
1153e12c5d1SDavid du Colombier 	if(i & 2)
1163e12c5d1SDavid du Colombier 		prtree1(n->left, d, 1);
1173e12c5d1SDavid du Colombier 	if(i & 1)
1183e12c5d1SDavid du Colombier 		prtree1(n->right, d, 1);
1193e12c5d1SDavid du Colombier }
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier Type*
typ(int et,Type * d)1223e12c5d1SDavid du Colombier typ(int et, Type *d)
1233e12c5d1SDavid du Colombier {
1243e12c5d1SDavid du Colombier 	Type *t;
1253e12c5d1SDavid du Colombier 
1267dd7cddfSDavid du Colombier 	t = alloc(sizeof(*t));
1273e12c5d1SDavid du Colombier 	t->etype = et;
1283e12c5d1SDavid du Colombier 	t->link = d;
1293e12c5d1SDavid du Colombier 	t->down = T;
1303e12c5d1SDavid du Colombier 	t->sym = S;
1313e12c5d1SDavid du Colombier 	t->width = ewidth[et];
1323e12c5d1SDavid du Colombier 	t->offset = 0;
1333e12c5d1SDavid du Colombier 	t->shift = 0;
1343e12c5d1SDavid du Colombier 	t->nbits = 0;
1357dd7cddfSDavid du Colombier 	t->garb = 0;
1363e12c5d1SDavid du Colombier 	return t;
1373e12c5d1SDavid du Colombier }
1383e12c5d1SDavid du Colombier 
1397dd7cddfSDavid du Colombier Type*
copytyp(Type * t)14080ee5cbfSDavid du Colombier copytyp(Type *t)
14180ee5cbfSDavid du Colombier {
14280ee5cbfSDavid du Colombier 	Type *nt;
14380ee5cbfSDavid du Colombier 
14480ee5cbfSDavid du Colombier 	nt = typ(TXXX, T);
14580ee5cbfSDavid du Colombier 	*nt = *t;
14680ee5cbfSDavid du Colombier 	return nt;
14780ee5cbfSDavid du Colombier }
14880ee5cbfSDavid du Colombier 
14980ee5cbfSDavid du Colombier Type*
garbt(Type * t,long b)1507dd7cddfSDavid du Colombier garbt(Type *t, long b)
1517dd7cddfSDavid du Colombier {
1527dd7cddfSDavid du Colombier 	Type *t1;
1537dd7cddfSDavid du Colombier 
1547dd7cddfSDavid du Colombier 	if(b & BGARB) {
15580ee5cbfSDavid du Colombier 		t1 = copytyp(t);
1567dd7cddfSDavid du Colombier 		t1->garb = simpleg(b);
1577dd7cddfSDavid du Colombier 		return t1;
1587dd7cddfSDavid du Colombier 	}
1597dd7cddfSDavid du Colombier 	return t;
1607dd7cddfSDavid du Colombier }
1617dd7cddfSDavid du Colombier 
1627dd7cddfSDavid du Colombier int
simpleg(long b)1637dd7cddfSDavid du Colombier simpleg(long b)
1647dd7cddfSDavid du Colombier {
1657dd7cddfSDavid du Colombier 
1667dd7cddfSDavid du Colombier 	b &= BGARB;
1677dd7cddfSDavid du Colombier 	switch(b) {
1687dd7cddfSDavid du Colombier 	case BCONSTNT:
1697dd7cddfSDavid du Colombier 		return GCONSTNT;
1707dd7cddfSDavid du Colombier 	case BVOLATILE:
1717dd7cddfSDavid du Colombier 		return GVOLATILE;
1727dd7cddfSDavid du Colombier 	case BVOLATILE|BCONSTNT:
1737dd7cddfSDavid du Colombier 		return GCONSTNT|GVOLATILE;
1747dd7cddfSDavid du Colombier 	}
1757dd7cddfSDavid du Colombier 	return GXXX;
1767dd7cddfSDavid du Colombier }
1777dd7cddfSDavid du Colombier 
1783e12c5d1SDavid du Colombier int
simplec(long b)1793e12c5d1SDavid du Colombier simplec(long b)
1803e12c5d1SDavid du Colombier {
1813e12c5d1SDavid du Colombier 
1823e12c5d1SDavid du Colombier 	b &= BCLASS;
1833e12c5d1SDavid du Colombier 	switch(b) {
1843e12c5d1SDavid du Colombier 	case 0:
1853e12c5d1SDavid du Colombier 	case BREGISTER:
1863e12c5d1SDavid du Colombier 		return CXXX;
1873e12c5d1SDavid du Colombier 	case BAUTO:
1883e12c5d1SDavid du Colombier 	case BAUTO|BREGISTER:
1893e12c5d1SDavid du Colombier 		return CAUTO;
1903e12c5d1SDavid du Colombier 	case BEXTERN:
1913e12c5d1SDavid du Colombier 		return CEXTERN;
1923e12c5d1SDavid du Colombier 	case BEXTERN|BREGISTER:
1933e12c5d1SDavid du Colombier 		return CEXREG;
1943e12c5d1SDavid du Colombier 	case BSTATIC:
1953e12c5d1SDavid du Colombier 		return CSTATIC;
1963e12c5d1SDavid du Colombier 	case BTYPEDEF:
1973e12c5d1SDavid du Colombier 		return CTYPEDEF;
19880ee5cbfSDavid du Colombier 	case BTYPESTR:
19980ee5cbfSDavid du Colombier 		return CTYPESTR;
2003e12c5d1SDavid du Colombier 	}
2013e12c5d1SDavid du Colombier 	diag(Z, "illegal combination of classes %Q", b);
2023e12c5d1SDavid du Colombier 	return CXXX;
2033e12c5d1SDavid du Colombier }
2043e12c5d1SDavid du Colombier 
2053e12c5d1SDavid du Colombier Type*
simplet(long b)2063e12c5d1SDavid du Colombier simplet(long b)
2073e12c5d1SDavid du Colombier {
2083e12c5d1SDavid du Colombier 
2097dd7cddfSDavid du Colombier 	b &= ~BCLASS & ~BGARB;
2103e12c5d1SDavid du Colombier 	switch(b) {
2113e12c5d1SDavid du Colombier 	case BCHAR:
2123e12c5d1SDavid du Colombier 	case BCHAR|BSIGNED:
2133e12c5d1SDavid du Colombier 		return types[TCHAR];
2143e12c5d1SDavid du Colombier 
2153e12c5d1SDavid du Colombier 	case BCHAR|BUNSIGNED:
2163e12c5d1SDavid du Colombier 		return types[TUCHAR];
2173e12c5d1SDavid du Colombier 
2183e12c5d1SDavid du Colombier 	case BSHORT:
2193e12c5d1SDavid du Colombier 	case BSHORT|BINT:
2203e12c5d1SDavid du Colombier 	case BSHORT|BSIGNED:
2213e12c5d1SDavid du Colombier 	case BSHORT|BINT|BSIGNED:
2223e12c5d1SDavid du Colombier 		return types[TSHORT];
2233e12c5d1SDavid du Colombier 
2243e12c5d1SDavid du Colombier 	case BUNSIGNED|BSHORT:
2253e12c5d1SDavid du Colombier 	case BUNSIGNED|BSHORT|BINT:
2263e12c5d1SDavid du Colombier 		return types[TUSHORT];
2273e12c5d1SDavid du Colombier 
2283e12c5d1SDavid du Colombier 	case 0:
2293e12c5d1SDavid du Colombier 	case BINT:
2303e12c5d1SDavid du Colombier 	case BINT|BSIGNED:
2313e12c5d1SDavid du Colombier 	case BSIGNED:
2327dd7cddfSDavid du Colombier 		return types[TINT];
2333e12c5d1SDavid du Colombier 
2343e12c5d1SDavid du Colombier 	case BUNSIGNED:
2353e12c5d1SDavid du Colombier 	case BUNSIGNED|BINT:
2367dd7cddfSDavid du Colombier 		return types[TUINT];
2373e12c5d1SDavid du Colombier 
2383e12c5d1SDavid du Colombier 	case BLONG:
2393e12c5d1SDavid du Colombier 	case BLONG|BINT:
2403e12c5d1SDavid du Colombier 	case BLONG|BSIGNED:
2413e12c5d1SDavid du Colombier 	case BLONG|BINT|BSIGNED:
2423e12c5d1SDavid du Colombier 		return types[TLONG];
2433e12c5d1SDavid du Colombier 
2443e12c5d1SDavid du Colombier 	case BUNSIGNED|BLONG:
2453e12c5d1SDavid du Colombier 	case BUNSIGNED|BLONG|BINT:
2463e12c5d1SDavid du Colombier 		return types[TULONG];
2473e12c5d1SDavid du Colombier 
2483e12c5d1SDavid du Colombier 	case BVLONG|BLONG:
2493e12c5d1SDavid du Colombier 	case BVLONG|BLONG|BINT:
2503e12c5d1SDavid du Colombier 	case BVLONG|BLONG|BSIGNED:
2513e12c5d1SDavid du Colombier 	case BVLONG|BLONG|BINT|BSIGNED:
2523e12c5d1SDavid du Colombier 		return types[TVLONG];
2533e12c5d1SDavid du Colombier 
254219b2ee8SDavid du Colombier 	case BVLONG|BLONG|BUNSIGNED:
255219b2ee8SDavid du Colombier 	case BVLONG|BLONG|BINT|BUNSIGNED:
256219b2ee8SDavid du Colombier 		return types[TUVLONG];
257219b2ee8SDavid du Colombier 
2583e12c5d1SDavid du Colombier 	case BFLOAT:
2593e12c5d1SDavid du Colombier 		return types[TFLOAT];
2603e12c5d1SDavid du Colombier 
2613e12c5d1SDavid du Colombier 	case BDOUBLE:
2623e12c5d1SDavid du Colombier 	case BDOUBLE|BLONG:
2633e12c5d1SDavid du Colombier 	case BFLOAT|BLONG:
2643e12c5d1SDavid du Colombier 		return types[TDOUBLE];
2653e12c5d1SDavid du Colombier 
2663e12c5d1SDavid du Colombier 	case BVOID:
2673e12c5d1SDavid du Colombier 		return types[TVOID];
2683e12c5d1SDavid du Colombier 	}
2693e12c5d1SDavid du Colombier 
2703e12c5d1SDavid du Colombier 	diag(Z, "illegal combination of types %Q", b);
2717dd7cddfSDavid du Colombier 	return types[TINT];
2723e12c5d1SDavid du Colombier }
2733e12c5d1SDavid du Colombier 
2743e12c5d1SDavid du Colombier int
stcompat(Node * n,Type * t1,Type * t2,long ttab[])2753e12c5d1SDavid du Colombier stcompat(Node *n, Type *t1, Type *t2, long ttab[])
2763e12c5d1SDavid du Colombier {
2777dd7cddfSDavid du Colombier 	int i;
2787dd7cddfSDavid du Colombier 	ulong b;
2793e12c5d1SDavid du Colombier 
2803e12c5d1SDavid du Colombier 	i = 0;
2813e12c5d1SDavid du Colombier 	if(t2 != T)
2823e12c5d1SDavid du Colombier 		i = t2->etype;
2833e12c5d1SDavid du Colombier 	b = 1L << i;
2843e12c5d1SDavid du Colombier 	i = 0;
2853e12c5d1SDavid du Colombier 	if(t1 != T)
2863e12c5d1SDavid du Colombier 		i = t1->etype;
2873e12c5d1SDavid du Colombier 	if(b & ttab[i]) {
2883e12c5d1SDavid du Colombier 		if(ttab == tasign)
2893e12c5d1SDavid du Colombier 			if(b == BSTRUCT || b == BUNION)
2903e12c5d1SDavid du Colombier 				if(!sametype(t1, t2))
2913e12c5d1SDavid du Colombier 					return 1;
2923e12c5d1SDavid du Colombier 		if(n->op != OCAST)
2933e12c5d1SDavid du Colombier 		 	if(b == BIND && i == TIND)
2943e12c5d1SDavid du Colombier 				if(!sametype(t1, t2))
2953e12c5d1SDavid du Colombier 					return 1;
2963e12c5d1SDavid du Colombier 		return 0;
2973e12c5d1SDavid du Colombier 	}
2983e12c5d1SDavid du Colombier 	return 1;
2993e12c5d1SDavid du Colombier }
3003e12c5d1SDavid du Colombier 
3013e12c5d1SDavid du Colombier int
tcompat(Node * n,Type * t1,Type * t2,long ttab[])3023e12c5d1SDavid du Colombier tcompat(Node *n, Type *t1, Type *t2, long ttab[])
3033e12c5d1SDavid du Colombier {
3043e12c5d1SDavid du Colombier 
3053e12c5d1SDavid du Colombier 	if(stcompat(n, t1, t2, ttab)) {
3063e12c5d1SDavid du Colombier 		if(t1 == T)
3073e12c5d1SDavid du Colombier 			diag(n, "incompatible type: \"%T\" for op \"%O\"",
3083e12c5d1SDavid du Colombier 				t2, n->op);
3093e12c5d1SDavid du Colombier 		else
3103e12c5d1SDavid du Colombier 			diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
3113e12c5d1SDavid du Colombier 				t1, t2, n->op);
3123e12c5d1SDavid du Colombier 		return 1;
3133e12c5d1SDavid du Colombier 	}
3143e12c5d1SDavid du Colombier 	return 0;
3153e12c5d1SDavid du Colombier }
3163e12c5d1SDavid du Colombier 
3173e12c5d1SDavid du Colombier void
makedot(Node * n,Type * t,long o)3183e12c5d1SDavid du Colombier makedot(Node *n, Type *t, long o)
3193e12c5d1SDavid du Colombier {
3203e12c5d1SDavid du Colombier 	Node *n1, *n2;
3213e12c5d1SDavid du Colombier 
3223e12c5d1SDavid du Colombier 	if(t->nbits) {
3233e12c5d1SDavid du Colombier 		n1 = new(OXXX, Z, Z);
3243e12c5d1SDavid du Colombier 		*n1 = *n;
3253e12c5d1SDavid du Colombier 		n->op = OBIT;
3263e12c5d1SDavid du Colombier 		n->left = n1;
3273e12c5d1SDavid du Colombier 		n->right = Z;
3283e12c5d1SDavid du Colombier 		n->type = t;
3293e12c5d1SDavid du Colombier 		n->addable = n1->left->addable;
3303e12c5d1SDavid du Colombier 		n = n1;
3313e12c5d1SDavid du Colombier 	}
3323e12c5d1SDavid du Colombier 	n->addable = n->left->addable;
3333e12c5d1SDavid du Colombier 	if(n->addable == 0) {
3343e12c5d1SDavid du Colombier 		n1 = new1(OCONST, Z, Z);
335219b2ee8SDavid du Colombier 		n1->vconst = o;
3363e12c5d1SDavid du Colombier 		n1->type = types[TLONG];
3373e12c5d1SDavid du Colombier 		n->right = n1;
3383e12c5d1SDavid du Colombier 		n->type = t;
3393e12c5d1SDavid du Colombier 		return;
3403e12c5d1SDavid du Colombier 	}
3413e12c5d1SDavid du Colombier 	n->left->type = t;
3423e12c5d1SDavid du Colombier 	if(o == 0) {
3433e12c5d1SDavid du Colombier 		*n = *n->left;
3443e12c5d1SDavid du Colombier 		return;
3453e12c5d1SDavid du Colombier 	}
3463e12c5d1SDavid du Colombier 	n->type = t;
3473e12c5d1SDavid du Colombier 	n1 = new1(OCONST, Z, Z);
348219b2ee8SDavid du Colombier 	n1->vconst = o;
3493e12c5d1SDavid du Colombier 	t = typ(TIND, t);
3503e12c5d1SDavid du Colombier 	t->width = types[TIND]->width;
3513e12c5d1SDavid du Colombier 	n1->type = t;
3523e12c5d1SDavid du Colombier 
3533e12c5d1SDavid du Colombier 	n2 = new1(OADDR, n->left, Z);
3543e12c5d1SDavid du Colombier 	n2->type = t;
3553e12c5d1SDavid du Colombier 
3563e12c5d1SDavid du Colombier 	n1 = new1(OADD, n1, n2);
3573e12c5d1SDavid du Colombier 	n1->type = t;
3583e12c5d1SDavid du Colombier 
3593e12c5d1SDavid du Colombier 	n->op = OIND;
3603e12c5d1SDavid du Colombier 	n->left = n1;
3613e12c5d1SDavid du Colombier 	n->right = Z;
3623e12c5d1SDavid du Colombier }
3633e12c5d1SDavid du Colombier 
3643e12c5d1SDavid du Colombier Type*
dotsearch(Sym * s,Type * t,Node * n,long * off)36580ee5cbfSDavid du Colombier dotsearch(Sym *s, Type *t, Node *n, long *off)
3663e12c5d1SDavid du Colombier {
36780ee5cbfSDavid du Colombier 	Type *t1, *xt, *rt;
3683e12c5d1SDavid du Colombier 
3693e12c5d1SDavid du Colombier 	xt = T;
3703e12c5d1SDavid du Colombier 
3713e12c5d1SDavid du Colombier 	/*
3723e12c5d1SDavid du Colombier 	 * look it up by name
3733e12c5d1SDavid du Colombier 	 */
3743e12c5d1SDavid du Colombier 	for(t1 = t; t1 != T; t1 = t1->down)
3753e12c5d1SDavid du Colombier 		if(t1->sym == s) {
3763e12c5d1SDavid du Colombier 			if(xt != T)
3773e12c5d1SDavid du Colombier 				goto ambig;
3783e12c5d1SDavid du Colombier 			xt = t1;
3793e12c5d1SDavid du Colombier 		}
3803e12c5d1SDavid du Colombier 
3813e12c5d1SDavid du Colombier 	/*
3823e12c5d1SDavid du Colombier 	 * look it up by type
3833e12c5d1SDavid du Colombier 	 */
38480ee5cbfSDavid du Colombier 	if(s->class == CTYPEDEF || s->class == CTYPESTR)
3853e12c5d1SDavid du Colombier 		for(t1 = t; t1 != T; t1 = t1->down)
3863e12c5d1SDavid du Colombier 			if(t1->sym == S && typesu[t1->etype])
3873e12c5d1SDavid du Colombier 				if(sametype(s->type, t1)) {
3883e12c5d1SDavid du Colombier 					if(xt != T)
3893e12c5d1SDavid du Colombier 						goto ambig;
3903e12c5d1SDavid du Colombier 					xt = t1;
3913e12c5d1SDavid du Colombier 				}
39280ee5cbfSDavid du Colombier 	if(xt != T) {
39380ee5cbfSDavid du Colombier 		*off = xt->offset;
3943e12c5d1SDavid du Colombier 		return xt;
39580ee5cbfSDavid du Colombier 	}
3963e12c5d1SDavid du Colombier 
3973e12c5d1SDavid du Colombier 	/*
3983e12c5d1SDavid du Colombier 	 * look it up in unnamed substructures
3993e12c5d1SDavid du Colombier 	 */
4003e12c5d1SDavid du Colombier 	for(t1 = t; t1 != T; t1 = t1->down)
40180ee5cbfSDavid du Colombier 		if(t1->sym == S && typesu[t1->etype]){
40280ee5cbfSDavid du Colombier 			rt = dotsearch(s, t1->link, n, off);
40380ee5cbfSDavid du Colombier 			if(rt != T) {
4043e12c5d1SDavid du Colombier 				if(xt != T)
4053e12c5d1SDavid du Colombier 					goto ambig;
40680ee5cbfSDavid du Colombier 				xt = rt;
40780ee5cbfSDavid du Colombier 				*off += t1->offset;
40880ee5cbfSDavid du Colombier 			}
4093e12c5d1SDavid du Colombier 		}
4103e12c5d1SDavid du Colombier 	return xt;
4113e12c5d1SDavid du Colombier 
4123e12c5d1SDavid du Colombier ambig:
4133e12c5d1SDavid du Colombier 	diag(n, "ambiguous structure element: %s", s->name);
4143e12c5d1SDavid du Colombier 	return xt;
4153e12c5d1SDavid du Colombier }
4163e12c5d1SDavid du Colombier 
4173e12c5d1SDavid du Colombier long
dotoffset(Type * st,Type * lt,Node * n)4183e12c5d1SDavid du Colombier dotoffset(Type *st, Type *lt, Node *n)
4193e12c5d1SDavid du Colombier {
4203e12c5d1SDavid du Colombier 	Type *t;
4213e12c5d1SDavid du Colombier 	Sym *g;
4223e12c5d1SDavid du Colombier 	long o, o1;
4233e12c5d1SDavid du Colombier 
4243e12c5d1SDavid du Colombier 	o = -1;
4253e12c5d1SDavid du Colombier 	/*
4263e12c5d1SDavid du Colombier 	 * first try matching at the top level
4273e12c5d1SDavid du Colombier 	 * for matching tag names
4283e12c5d1SDavid du Colombier 	 */
4293e12c5d1SDavid du Colombier 	g = st->tag;
4303e12c5d1SDavid du Colombier 	if(g != S)
4313e12c5d1SDavid du Colombier 		for(t=lt->link; t!=T; t=t->down)
4323e12c5d1SDavid du Colombier 			if(t->sym == S)
4333e12c5d1SDavid du Colombier 				if(g == t->tag) {
4343e12c5d1SDavid du Colombier 					if(o >= 0)
4353e12c5d1SDavid du Colombier 						goto ambig;
4363e12c5d1SDavid du Colombier 					o = t->offset;
4373e12c5d1SDavid du Colombier 				}
4383e12c5d1SDavid du Colombier 	if(o >= 0)
4393e12c5d1SDavid du Colombier 		return o;
4403e12c5d1SDavid du Colombier 
4413e12c5d1SDavid du Colombier 	/*
4423e12c5d1SDavid du Colombier 	 * second try matching at the top level
4433e12c5d1SDavid du Colombier 	 * for similar types
4443e12c5d1SDavid du Colombier 	 */
4453e12c5d1SDavid du Colombier 	for(t=lt->link; t!=T; t=t->down)
4463e12c5d1SDavid du Colombier 		if(t->sym == S)
4473e12c5d1SDavid du Colombier 			if(sametype(st, t)) {
4483e12c5d1SDavid du Colombier 				if(o >= 0)
4493e12c5d1SDavid du Colombier 					goto ambig;
4503e12c5d1SDavid du Colombier 				o = t->offset;
4513e12c5d1SDavid du Colombier 			}
4523e12c5d1SDavid du Colombier 	if(o >= 0)
4533e12c5d1SDavid du Colombier 		return o;
4543e12c5d1SDavid du Colombier 
4553e12c5d1SDavid du Colombier 	/*
4563e12c5d1SDavid du Colombier 	 * last try matching sub-levels
4573e12c5d1SDavid du Colombier 	 */
4583e12c5d1SDavid du Colombier 	for(t=lt->link; t!=T; t=t->down)
4593e12c5d1SDavid du Colombier 		if(t->sym == S)
4603e12c5d1SDavid du Colombier 		if(typesu[t->etype]) {
4613e12c5d1SDavid du Colombier 			o1 = dotoffset(st, t, n);
4623e12c5d1SDavid du Colombier 			if(o1 >= 0) {
4633e12c5d1SDavid du Colombier 				if(o >= 0)
4643e12c5d1SDavid du Colombier 					goto ambig;
4653e12c5d1SDavid du Colombier 				o = o1 + t->offset;
4663e12c5d1SDavid du Colombier 			}
4673e12c5d1SDavid du Colombier 		}
4683e12c5d1SDavid du Colombier 	return o;
4693e12c5d1SDavid du Colombier 
4703e12c5d1SDavid du Colombier ambig:
4713e12c5d1SDavid du Colombier 	diag(n, "ambiguous unnamed structure element");
4723e12c5d1SDavid du Colombier 	return o;
4733e12c5d1SDavid du Colombier }
4743e12c5d1SDavid du Colombier 
475219b2ee8SDavid du Colombier /*
476219b2ee8SDavid du Colombier  * look into tree for floating point constant expressions
477219b2ee8SDavid du Colombier  */
478219b2ee8SDavid du Colombier int
allfloat(Node * n,int flag)479219b2ee8SDavid du Colombier allfloat(Node *n, int flag)
480219b2ee8SDavid du Colombier {
481219b2ee8SDavid du Colombier 
482219b2ee8SDavid du Colombier 	if(n != Z) {
483219b2ee8SDavid du Colombier 		if(n->type->etype != TDOUBLE)
484219b2ee8SDavid du Colombier 			return 1;
485219b2ee8SDavid du Colombier 		switch(n->op) {
486219b2ee8SDavid du Colombier 		case OCONST:
487219b2ee8SDavid du Colombier 			if(flag)
488219b2ee8SDavid du Colombier 				n->type = types[TFLOAT];
489219b2ee8SDavid du Colombier 			return 1;
490219b2ee8SDavid du Colombier 		case OADD:	/* no need to get more exotic than this */
491219b2ee8SDavid du Colombier 		case OSUB:
492219b2ee8SDavid du Colombier 		case OMUL:
493219b2ee8SDavid du Colombier 		case ODIV:
494219b2ee8SDavid du Colombier 			if(!allfloat(n->right, flag))
495219b2ee8SDavid du Colombier 				break;
496219b2ee8SDavid du Colombier 		case OCAST:
497219b2ee8SDavid du Colombier 			if(!allfloat(n->left, flag))
498219b2ee8SDavid du Colombier 				break;
499219b2ee8SDavid du Colombier 			if(flag)
500219b2ee8SDavid du Colombier 				n->type = types[TFLOAT];
501219b2ee8SDavid du Colombier 			return 1;
502219b2ee8SDavid du Colombier 		}
503219b2ee8SDavid du Colombier 	}
504219b2ee8SDavid du Colombier 	return 0;
505219b2ee8SDavid du Colombier }
506219b2ee8SDavid du Colombier 
507219b2ee8SDavid du Colombier void
constas(Node * n,Type * il,Type * ir)5087dd7cddfSDavid du Colombier constas(Node *n, Type *il, Type *ir)
5097dd7cddfSDavid du Colombier {
5107dd7cddfSDavid du Colombier 	Type *l, *r;
5117dd7cddfSDavid du Colombier 
5127dd7cddfSDavid du Colombier 	l = il;
5137dd7cddfSDavid du Colombier 	r = ir;
5147dd7cddfSDavid du Colombier 
5157dd7cddfSDavid du Colombier 	if(l == T)
5167dd7cddfSDavid du Colombier 		return;
5177dd7cddfSDavid du Colombier 	if(l->garb & GCONSTNT) {
5187dd7cddfSDavid du Colombier 		warn(n, "assignment to a constant type (%T)", il);
5197dd7cddfSDavid du Colombier 		return;
5207dd7cddfSDavid du Colombier 	}
5217dd7cddfSDavid du Colombier 	if(r == T)
5227dd7cddfSDavid du Colombier 		return;
5237dd7cddfSDavid du Colombier 	for(;;) {
5247dd7cddfSDavid du Colombier 		if(l->etype != TIND || r->etype != TIND)
5257dd7cddfSDavid du Colombier 			break;
5267dd7cddfSDavid du Colombier 		l = l->link;
5277dd7cddfSDavid du Colombier 		r = r->link;
5287dd7cddfSDavid du Colombier 		if(l == T || r == T)
5297dd7cddfSDavid du Colombier 			break;
5307dd7cddfSDavid du Colombier 		if(r->garb & GCONSTNT)
5317dd7cddfSDavid du Colombier 			if(!(l->garb & GCONSTNT)) {
5327dd7cddfSDavid du Colombier 				warn(n, "assignment of a constant pointer type (%T)", ir);
5337dd7cddfSDavid du Colombier 				break;
5347dd7cddfSDavid du Colombier 			}
5357dd7cddfSDavid du Colombier 	}
5367dd7cddfSDavid du Colombier }
5377dd7cddfSDavid du Colombier 
5387dd7cddfSDavid du Colombier void
typeext1(Type * st,Node * l)539219b2ee8SDavid du Colombier typeext1(Type *st, Node *l)
540219b2ee8SDavid du Colombier {
541219b2ee8SDavid du Colombier 	if(st->etype == TFLOAT && allfloat(l, 0))
542219b2ee8SDavid du Colombier 		allfloat(l, 1);
543219b2ee8SDavid du Colombier }
544219b2ee8SDavid du Colombier 
5453e12c5d1SDavid du Colombier void
typeext(Type * st,Node * l)5463e12c5d1SDavid du Colombier typeext(Type *st, Node *l)
5473e12c5d1SDavid du Colombier {
5483e12c5d1SDavid du Colombier 	Type *lt;
5493e12c5d1SDavid du Colombier 	Node *n1, *n2;
5503e12c5d1SDavid du Colombier 	long o;
5513e12c5d1SDavid du Colombier 
5523e12c5d1SDavid du Colombier 	lt = l->type;
5533e12c5d1SDavid du Colombier 	if(lt == T)
5543e12c5d1SDavid du Colombier 		return;
5553e12c5d1SDavid du Colombier 	if(st->etype == TIND && vconst(l) == 0) {
5563e12c5d1SDavid du Colombier 		l->type = st;
557219b2ee8SDavid du Colombier 		l->vconst = 0;
5583e12c5d1SDavid du Colombier 		return;
5593e12c5d1SDavid du Colombier 	}
560219b2ee8SDavid du Colombier 	typeext1(st, l);
5613e12c5d1SDavid du Colombier 
5623e12c5d1SDavid du Colombier 	/*
5633e12c5d1SDavid du Colombier 	 * extension of C
5643e12c5d1SDavid du Colombier 	 * if assign of struct containing unnamed sub-struct
5653e12c5d1SDavid du Colombier 	 * to type of sub-struct, insert the DOT.
5663e12c5d1SDavid du Colombier 	 * if assign of *struct containing unnamed substruct
5673e12c5d1SDavid du Colombier 	 * to type of *sub-struct, insert the add-offset
5683e12c5d1SDavid du Colombier 	 */
5693e12c5d1SDavid du Colombier 	if(typesu[st->etype] && typesu[lt->etype]) {
5703e12c5d1SDavid du Colombier 		o = dotoffset(st, lt, l);
5713e12c5d1SDavid du Colombier 		if(o >= 0) {
5723e12c5d1SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
5733e12c5d1SDavid du Colombier 			*n1 = *l;
5743e12c5d1SDavid du Colombier 			l->op = ODOT;
5753e12c5d1SDavid du Colombier 			l->left = n1;
5763e12c5d1SDavid du Colombier 			l->right = Z;
5773e12c5d1SDavid du Colombier 			makedot(l, st, o);
5783e12c5d1SDavid du Colombier 		}
5793e12c5d1SDavid du Colombier 		return;
5803e12c5d1SDavid du Colombier 	}
5813e12c5d1SDavid du Colombier 	if(st->etype == TIND && typesu[st->link->etype])
5823e12c5d1SDavid du Colombier 	if(lt->etype == TIND && typesu[lt->link->etype]) {
5833e12c5d1SDavid du Colombier 		o = dotoffset(st->link, lt->link, l);
5843e12c5d1SDavid du Colombier 		if(o >= 0) {
5853e12c5d1SDavid du Colombier 			l->type = st;
5863e12c5d1SDavid du Colombier 			if(o == 0)
5873e12c5d1SDavid du Colombier 				return;
5883e12c5d1SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
5893e12c5d1SDavid du Colombier 			*n1 = *l;
5903e12c5d1SDavid du Colombier 			n2 = new1(OCONST, Z, Z);
591219b2ee8SDavid du Colombier 			n2->vconst = o;
5923e12c5d1SDavid du Colombier 			n2->type = st;
5933e12c5d1SDavid du Colombier 			l->op = OADD;
5943e12c5d1SDavid du Colombier 			l->left = n1;
5953e12c5d1SDavid du Colombier 			l->right = n2;
5963e12c5d1SDavid du Colombier 		}
5973e12c5d1SDavid du Colombier 		return;
5983e12c5d1SDavid du Colombier 	}
5993e12c5d1SDavid du Colombier }
6003e12c5d1SDavid du Colombier 
6013e12c5d1SDavid du Colombier /*
6023e12c5d1SDavid du Colombier  * a cast that generates no code
6033e12c5d1SDavid du Colombier  * (same size move)
6043e12c5d1SDavid du Colombier  */
6053e12c5d1SDavid du Colombier int
nocast(Type * t1,Type * t2)6063e12c5d1SDavid du Colombier nocast(Type *t1, Type *t2)
6073e12c5d1SDavid du Colombier {
6083e12c5d1SDavid du Colombier 	int i, b;
6093e12c5d1SDavid du Colombier 
6103e12c5d1SDavid du Colombier 	if(t1->nbits)
6113e12c5d1SDavid du Colombier 		return 0;
6123e12c5d1SDavid du Colombier 	i = 0;
6133e12c5d1SDavid du Colombier 	if(t2 != T)
6143e12c5d1SDavid du Colombier 		i = t2->etype;
6153e12c5d1SDavid du Colombier 	b = 1<<i;
6163e12c5d1SDavid du Colombier 	i = 0;
6173e12c5d1SDavid du Colombier 	if(t1 != T)
6183e12c5d1SDavid du Colombier 		i = t1->etype;
6193e12c5d1SDavid du Colombier 	if(b & ncast[i])
6203e12c5d1SDavid du Colombier 		return 1;
6213e12c5d1SDavid du Colombier 	return 0;
6223e12c5d1SDavid du Colombier }
6233e12c5d1SDavid du Colombier 
6243e12c5d1SDavid du Colombier /*
6253e12c5d1SDavid du Colombier  * a cast that has a noop semantic
6263e12c5d1SDavid du Colombier  * (small to large, convert)
6273e12c5d1SDavid du Colombier  */
6283e12c5d1SDavid du Colombier int
nilcast(Type * t1,Type * t2)6293e12c5d1SDavid du Colombier nilcast(Type *t1, Type *t2)
6303e12c5d1SDavid du Colombier {
6317dd7cddfSDavid du Colombier 	int et1, et2;
6323e12c5d1SDavid du Colombier 
6337dd7cddfSDavid du Colombier 	if(t1 == T)
6347dd7cddfSDavid du Colombier 		return 0;
6353e12c5d1SDavid du Colombier 	if(t1->nbits)
6363e12c5d1SDavid du Colombier 		return 0;
6377dd7cddfSDavid du Colombier 	if(t2 == T)
6387dd7cddfSDavid du Colombier 		return 0;
6397dd7cddfSDavid du Colombier 	et1 = t1->etype;
6407dd7cddfSDavid du Colombier 	et2 = t2->etype;
6417dd7cddfSDavid du Colombier 	if(et1 == et2)
6423e12c5d1SDavid du Colombier 		return 1;
6437dd7cddfSDavid du Colombier 	if(typefd[et1] && typefd[et2]) {
6447dd7cddfSDavid du Colombier 		if(ewidth[et1] < ewidth[et2])
6457dd7cddfSDavid du Colombier 			return 1;
6467dd7cddfSDavid du Colombier 		return 0;
6477dd7cddfSDavid du Colombier 	}
6487dd7cddfSDavid du Colombier 	if(typechlp[et1] && typechlp[et2]) {
6497dd7cddfSDavid du Colombier 		if(ewidth[et1] < ewidth[et2])
6507dd7cddfSDavid du Colombier 			return 1;
6517dd7cddfSDavid du Colombier 		return 0;
6527dd7cddfSDavid du Colombier 	}
6533e12c5d1SDavid du Colombier 	return 0;
6543e12c5d1SDavid du Colombier }
6553e12c5d1SDavid du Colombier 
6563e12c5d1SDavid du Colombier /*
6573e12c5d1SDavid du Colombier  * "the usual arithmetic conversions are performed"
6583e12c5d1SDavid du Colombier  */
6593e12c5d1SDavid du Colombier void
arith(Node * n,int f)6603e12c5d1SDavid du Colombier arith(Node *n, int f)
6613e12c5d1SDavid du Colombier {
6623e12c5d1SDavid du Colombier 	Type *t1, *t2;
6633e12c5d1SDavid du Colombier 	int i, j, k;
6643e12c5d1SDavid du Colombier 	Node *n1;
6653e12c5d1SDavid du Colombier 	long w;
6663e12c5d1SDavid du Colombier 
6673e12c5d1SDavid du Colombier 	t1 = n->left->type;
6683e12c5d1SDavid du Colombier 	if(n->right == Z)
6693e12c5d1SDavid du Colombier 		t2 = t1;
6703e12c5d1SDavid du Colombier 	else
6713e12c5d1SDavid du Colombier 		t2 = n->right->type;
6723e12c5d1SDavid du Colombier 	i = TXXX;
6733e12c5d1SDavid du Colombier 	if(t1 != T)
6743e12c5d1SDavid du Colombier 		i = t1->etype;
6753e12c5d1SDavid du Colombier 	j = TXXX;
6763e12c5d1SDavid du Colombier 	if(t2 != T)
6773e12c5d1SDavid du Colombier 		j = t2->etype;
6783e12c5d1SDavid du Colombier 	k = tab[i][j];
6793e12c5d1SDavid du Colombier 	if(k == TIND) {
6803e12c5d1SDavid du Colombier 		if(i == TIND)
6813e12c5d1SDavid du Colombier 			n->type = t1;
6823e12c5d1SDavid du Colombier 		else
6833e12c5d1SDavid du Colombier 		if(j == TIND)
6843e12c5d1SDavid du Colombier 			n->type = t2;
6853e12c5d1SDavid du Colombier 	} else {
6863e12c5d1SDavid du Colombier 		/* convert up to at least int */
6873e12c5d1SDavid du Colombier 		if(f == 1)
6887dd7cddfSDavid du Colombier 		while(k < TINT)
6893e12c5d1SDavid du Colombier 			k += 2;
6903e12c5d1SDavid du Colombier 		n->type = types[k];
6913e12c5d1SDavid du Colombier 	}
6923e12c5d1SDavid du Colombier 	if(n->op == OSUB)
6933e12c5d1SDavid du Colombier 	if(i == TIND && j == TIND) {
6943e12c5d1SDavid du Colombier 		w = n->right->type->link->width;
6952cca75a1SDavid du Colombier 		if(w < 1 || n->left->type->link == T || n->left->type->link->width < 1)
6963e12c5d1SDavid du Colombier 			goto bad;
6977bd483b0SDavid du Colombier 		n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG];
6987bd483b0SDavid du Colombier 		if(1 && ewidth[TIND] > ewidth[TLONG]){
6997bd483b0SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
7007bd483b0SDavid du Colombier 			*n1 = *n;
7017bd483b0SDavid du Colombier 			n->op = OCAST;
7027bd483b0SDavid du Colombier 			n->left = n1;
7037bd483b0SDavid du Colombier 			n->right = Z;
7047bd483b0SDavid du Colombier 			n->type = types[TLONG];
7057bd483b0SDavid du Colombier 		}
7063e12c5d1SDavid du Colombier 		if(w > 1) {
7073e12c5d1SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
7083e12c5d1SDavid du Colombier 			*n1 = *n;
7093e12c5d1SDavid du Colombier 			n->op = ODIV;
7103e12c5d1SDavid du Colombier 			n->left = n1;
7113e12c5d1SDavid du Colombier 			n1 = new1(OCONST, Z, Z);
71280ee5cbfSDavid du Colombier 			n1->vconst = w;
7133e12c5d1SDavid du Colombier 			n1->type = n->type;
7143e12c5d1SDavid du Colombier 			n->right = n1;
71580ee5cbfSDavid du Colombier 			w = vlog(n1);
71680ee5cbfSDavid du Colombier 			if(w >= 0) {
71780ee5cbfSDavid du Colombier 				n->op = OASHR;
71880ee5cbfSDavid du Colombier 				n1->vconst = w;
71980ee5cbfSDavid du Colombier 			}
7203e12c5d1SDavid du Colombier 		}
7213e12c5d1SDavid du Colombier 		return;
7223e12c5d1SDavid du Colombier 	}
7233e12c5d1SDavid du Colombier 	if(!sametype(n->type, n->left->type)) {
7243e12c5d1SDavid du Colombier 		n->left = new1(OCAST, n->left, Z);
7253e12c5d1SDavid du Colombier 		n->left->type = n->type;
7263e12c5d1SDavid du Colombier 		if(n->type->etype == TIND) {
7273e12c5d1SDavid du Colombier 			w = n->type->link->width;
7287dd7cddfSDavid du Colombier 			if(w < 1) {
7297dd7cddfSDavid du Colombier 				snap(n->type->link);
7307dd7cddfSDavid du Colombier 				w = n->type->link->width;
7313e12c5d1SDavid du Colombier 				if(w < 1)
7323e12c5d1SDavid du Colombier 					goto bad;
7337dd7cddfSDavid du Colombier 			}
7343e12c5d1SDavid du Colombier 			if(w > 1) {
7353e12c5d1SDavid du Colombier 				n1 = new1(OCONST, Z, Z);
736219b2ee8SDavid du Colombier 				n1->vconst = w;
7373e12c5d1SDavid du Colombier 				n1->type = n->type;
7383e12c5d1SDavid du Colombier 				n->left = new1(OMUL, n->left, n1);
7393e12c5d1SDavid du Colombier 				n->left->type = n->type;
7403e12c5d1SDavid du Colombier 			}
7413e12c5d1SDavid du Colombier 		}
7423e12c5d1SDavid du Colombier 	}
7433e12c5d1SDavid du Colombier 	if(n->right != Z)
7443e12c5d1SDavid du Colombier 	if(!sametype(n->type, n->right->type)) {
7453e12c5d1SDavid du Colombier 		n->right = new1(OCAST, n->right, Z);
7463e12c5d1SDavid du Colombier 		n->right->type = n->type;
7473e12c5d1SDavid du Colombier 		if(n->type->etype == TIND) {
7483e12c5d1SDavid du Colombier 			w = n->type->link->width;
7497dd7cddfSDavid du Colombier 			if(w < 1) {
7507dd7cddfSDavid du Colombier 				snap(n->type->link);
7517dd7cddfSDavid du Colombier 				w = n->type->link->width;
7523e12c5d1SDavid du Colombier 				if(w < 1)
7533e12c5d1SDavid du Colombier 					goto bad;
7547dd7cddfSDavid du Colombier 			}
7553e12c5d1SDavid du Colombier 			if(w != 1) {
7563e12c5d1SDavid du Colombier 				n1 = new1(OCONST, Z, Z);
757219b2ee8SDavid du Colombier 				n1->vconst = w;
7583e12c5d1SDavid du Colombier 				n1->type = n->type;
7593e12c5d1SDavid du Colombier 				n->right = new1(OMUL, n->right, n1);
7603e12c5d1SDavid du Colombier 				n->right->type = n->type;
7613e12c5d1SDavid du Colombier 			}
7623e12c5d1SDavid du Colombier 		}
7633e12c5d1SDavid du Colombier 	}
7643e12c5d1SDavid du Colombier 	return;
7653e12c5d1SDavid du Colombier bad:
7667dd7cddfSDavid du Colombier 	diag(n, "pointer addition not fully declared: %T", n->type->link);
7673e12c5d1SDavid du Colombier }
7683e12c5d1SDavid du Colombier 
769375daca8SDavid du Colombier /*
770375daca8SDavid du Colombier  * try to rewrite shift & mask
771375daca8SDavid du Colombier  */
772375daca8SDavid du Colombier void
simplifyshift(Node * n)773375daca8SDavid du Colombier simplifyshift(Node *n)
774375daca8SDavid du Colombier {
775375daca8SDavid du Colombier 	ulong c3;
776375daca8SDavid du Colombier 	int o, s1, s2, c1, c2;
777375daca8SDavid du Colombier 
778375daca8SDavid du Colombier 	if(!typechlp[n->type->etype])
779375daca8SDavid du Colombier 		return;
780375daca8SDavid du Colombier 	switch(n->op) {
781375daca8SDavid du Colombier 	default:
782375daca8SDavid du Colombier 		return;
783375daca8SDavid du Colombier 	case OASHL:
784375daca8SDavid du Colombier 		s1 = 0;
785375daca8SDavid du Colombier 		break;
786375daca8SDavid du Colombier 	case OLSHR:
787375daca8SDavid du Colombier 		s1 = 1;
788375daca8SDavid du Colombier 		break;
789375daca8SDavid du Colombier 	case OASHR:
790375daca8SDavid du Colombier 		s1 = 2;
791375daca8SDavid du Colombier 		break;
792375daca8SDavid du Colombier 	}
793375daca8SDavid du Colombier 	if(n->right->op != OCONST)
794375daca8SDavid du Colombier 		return;
795375daca8SDavid du Colombier 	if(n->left->op != OAND)
796375daca8SDavid du Colombier 		return;
797375daca8SDavid du Colombier 	if(n->left->right->op != OCONST)
798375daca8SDavid du Colombier 		return;
799375daca8SDavid du Colombier 	switch(n->left->left->op) {
800375daca8SDavid du Colombier 	default:
801375daca8SDavid du Colombier 		return;
802375daca8SDavid du Colombier 	case OASHL:
803375daca8SDavid du Colombier 		s2 = 0;
804375daca8SDavid du Colombier 		break;
805375daca8SDavid du Colombier 	case OLSHR:
806375daca8SDavid du Colombier 		s2 = 1;
807375daca8SDavid du Colombier 		break;
808375daca8SDavid du Colombier 	case OASHR:
809375daca8SDavid du Colombier 		s2 = 2;
810375daca8SDavid du Colombier 		break;
811375daca8SDavid du Colombier 	}
812375daca8SDavid du Colombier 	if(n->left->left->right->op != OCONST)
813375daca8SDavid du Colombier 		return;
814375daca8SDavid du Colombier 
815375daca8SDavid du Colombier 	c1 = n->right->vconst;
816375daca8SDavid du Colombier 	c2 = n->left->left->right->vconst;
817375daca8SDavid du Colombier 	c3 = n->left->right->vconst;
818375daca8SDavid du Colombier 
819375daca8SDavid du Colombier /*
820375daca8SDavid du Colombier 	if(debug['h'])
821375daca8SDavid du Colombier 		print("%.3o %ld %ld %d #%.lux\n",
822375daca8SDavid du Colombier 			(s1<<3)|s2, c1, c2, topbit(c3), c3);
823375daca8SDavid du Colombier */
824375daca8SDavid du Colombier 
825375daca8SDavid du Colombier 	o = n->op;
826375daca8SDavid du Colombier 	switch((s1<<3)|s2) {
827375daca8SDavid du Colombier 	case 000:	/* (((e <<u c2) & c3) <<u c1) */
828375daca8SDavid du Colombier 		c3 >>= c2;
829375daca8SDavid du Colombier 		c1 += c2;
830375daca8SDavid du Colombier 		if(c1 >= 32)
831375daca8SDavid du Colombier 			break;
832375daca8SDavid du Colombier 		goto rewrite1;
833375daca8SDavid du Colombier 
834375daca8SDavid du Colombier 	case 002:	/* (((e >>s c2) & c3) <<u c1) */
835375daca8SDavid du Colombier 		if(topbit(c3) >= (32-c2))
836375daca8SDavid du Colombier 			break;
837375daca8SDavid du Colombier 	case 001:	/* (((e >>u c2) & c3) <<u c1) */
838375daca8SDavid du Colombier 		if(c1 > c2) {
839375daca8SDavid du Colombier 			c3 <<= c2;
840375daca8SDavid du Colombier 			c1 -= c2;
841375daca8SDavid du Colombier 			o = OASHL;
842375daca8SDavid du Colombier 			goto rewrite1;
843375daca8SDavid du Colombier 		}
844375daca8SDavid du Colombier 		c3 <<= c1;
845375daca8SDavid du Colombier 		if(c1 == c2)
846375daca8SDavid du Colombier 			goto rewrite0;
847375daca8SDavid du Colombier 		c1 = c2-c1;
848375daca8SDavid du Colombier 		o = OLSHR;
849375daca8SDavid du Colombier 		goto rewrite2;
850375daca8SDavid du Colombier 
851375daca8SDavid du Colombier 	case 022:	/* (((e >>s c2) & c3) >>s c1) */
852375daca8SDavid du Colombier 		if(c2 <= 0)
853375daca8SDavid du Colombier 			break;
854375daca8SDavid du Colombier 	case 012:	/* (((e >>s c2) & c3) >>u c1) */
855375daca8SDavid du Colombier 		if(topbit(c3) >= (32-c2))
856375daca8SDavid du Colombier 			break;
857375daca8SDavid du Colombier 		goto s11;
858375daca8SDavid du Colombier 	case 021:	/* (((e >>u c2) & c3) >>s c1) */
859375daca8SDavid du Colombier 		if(topbit(c3) >= 31 && c2 <= 0)
860375daca8SDavid du Colombier 			break;
861375daca8SDavid du Colombier 		goto s11;
862375daca8SDavid du Colombier 	case 011:	/* (((e >>u c2) & c3) >>u c1) */
863375daca8SDavid du Colombier 	s11:
864375daca8SDavid du Colombier 		c3 <<= c2;
865375daca8SDavid du Colombier 		c1 += c2;
866375daca8SDavid du Colombier 		if(c1 >= 32)
867375daca8SDavid du Colombier 			break;
868375daca8SDavid du Colombier 		o = OLSHR;
869375daca8SDavid du Colombier 		goto rewrite1;
870375daca8SDavid du Colombier 
871375daca8SDavid du Colombier 	case 020:	/* (((e <<u c2) & c3) >>s c1) */
872375daca8SDavid du Colombier 		if(topbit(c3) >= 31)
873375daca8SDavid du Colombier 			break;
874375daca8SDavid du Colombier 	case 010:	/* (((e <<u c2) & c3) >>u c1) */
875375daca8SDavid du Colombier 		c3 >>= c1;
876375daca8SDavid du Colombier 		if(c1 == c2)
877375daca8SDavid du Colombier 			goto rewrite0;
878375daca8SDavid du Colombier 		if(c1 > c2) {
879375daca8SDavid du Colombier 			c1 -= c2;
880375daca8SDavid du Colombier 			goto rewrite2;
881375daca8SDavid du Colombier 		}
882375daca8SDavid du Colombier 		c1 = c2 - c1;
883375daca8SDavid du Colombier 		o = OASHL;
884375daca8SDavid du Colombier 		goto rewrite2;
885375daca8SDavid du Colombier 	}
886375daca8SDavid du Colombier 	return;
887375daca8SDavid du Colombier 
888375daca8SDavid du Colombier rewrite0:	/* get rid of both shifts */
889375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite0");
890375daca8SDavid du Colombier 	*n = *n->left;
891375daca8SDavid du Colombier 	n->left = n->left->left;
892375daca8SDavid du Colombier 	n->right->vconst = c3;
893375daca8SDavid du Colombier 	return;
894375daca8SDavid du Colombier rewrite1:	/* get rid of lower shift */
895375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite1");
896375daca8SDavid du Colombier 	n->left->left = n->left->left->left;
897375daca8SDavid du Colombier 	n->left->right->vconst = c3;
898375daca8SDavid du Colombier 	n->right->vconst = c1;
899375daca8SDavid du Colombier 	n->op = o;
900375daca8SDavid du Colombier 	return;
901375daca8SDavid du Colombier rewrite2:	/* get rid of upper shift */
902375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite2");
903375daca8SDavid du Colombier 	*n = *n->left;
904375daca8SDavid du Colombier 	n->right->vconst = c3;
905375daca8SDavid du Colombier 	n->left->right->vconst = c1;
906375daca8SDavid du Colombier 	n->left->op = o;
907375daca8SDavid du Colombier }
908375daca8SDavid du Colombier 
9093e12c5d1SDavid du Colombier int
side(Node * n)9103e12c5d1SDavid du Colombier side(Node *n)
9113e12c5d1SDavid du Colombier {
9123e12c5d1SDavid du Colombier 
9133e12c5d1SDavid du Colombier loop:
9143e12c5d1SDavid du Colombier 	if(n != Z)
9153e12c5d1SDavid du Colombier 	switch(n->op) {
9163e12c5d1SDavid du Colombier 	case OCAST:
9173e12c5d1SDavid du Colombier 	case ONOT:
9183e12c5d1SDavid du Colombier 	case OADDR:
9193e12c5d1SDavid du Colombier 	case OIND:
9203e12c5d1SDavid du Colombier 		n = n->left;
9213e12c5d1SDavid du Colombier 		goto loop;
9223e12c5d1SDavid du Colombier 
9233e12c5d1SDavid du Colombier 	case OCOND:
9243e12c5d1SDavid du Colombier 		if(side(n->left))
9253e12c5d1SDavid du Colombier 			break;
9263e12c5d1SDavid du Colombier 		n = n->right;
9273e12c5d1SDavid du Colombier 
9283e12c5d1SDavid du Colombier 	case OEQ:
9293e12c5d1SDavid du Colombier 	case ONE:
9303e12c5d1SDavid du Colombier 	case OLT:
9313e12c5d1SDavid du Colombier 	case OGE:
9323e12c5d1SDavid du Colombier 	case OGT:
9333e12c5d1SDavid du Colombier 	case OLE:
9343e12c5d1SDavid du Colombier 	case OADD:
9353e12c5d1SDavid du Colombier 	case OSUB:
9363e12c5d1SDavid du Colombier 	case OMUL:
9373e12c5d1SDavid du Colombier 	case OLMUL:
9383e12c5d1SDavid du Colombier 	case ODIV:
9393e12c5d1SDavid du Colombier 	case OLDIV:
9403e12c5d1SDavid du Colombier 	case OLSHR:
9413e12c5d1SDavid du Colombier 	case OASHL:
9423e12c5d1SDavid du Colombier 	case OASHR:
9433e12c5d1SDavid du Colombier 	case OAND:
9443e12c5d1SDavid du Colombier 	case OOR:
9453e12c5d1SDavid du Colombier 	case OXOR:
9463e12c5d1SDavid du Colombier 	case OMOD:
9473e12c5d1SDavid du Colombier 	case OLMOD:
9483e12c5d1SDavid du Colombier 	case OANDAND:
9493e12c5d1SDavid du Colombier 	case OOROR:
9503e12c5d1SDavid du Colombier 	case OCOMMA:
9513e12c5d1SDavid du Colombier 	case ODOT:
9523e12c5d1SDavid du Colombier 		if(side(n->left))
9533e12c5d1SDavid du Colombier 			break;
9543e12c5d1SDavid du Colombier 		n = n->right;
9553e12c5d1SDavid du Colombier 		goto loop;
9563e12c5d1SDavid du Colombier 
9577dd7cddfSDavid du Colombier 	case OSIGN:
9583e12c5d1SDavid du Colombier 	case OSIZE:
9593e12c5d1SDavid du Colombier 	case OCONST:
9603e12c5d1SDavid du Colombier 	case OSTRING:
9613e12c5d1SDavid du Colombier 	case OLSTRING:
9623e12c5d1SDavid du Colombier 	case ONAME:
9633e12c5d1SDavid du Colombier 		return 0;
9643e12c5d1SDavid du Colombier 	}
9653e12c5d1SDavid du Colombier 	return 1;
9663e12c5d1SDavid du Colombier }
9673e12c5d1SDavid du Colombier 
9683e12c5d1SDavid du Colombier int
vconst(Node * n)9693e12c5d1SDavid du Colombier vconst(Node *n)
9703e12c5d1SDavid du Colombier {
9713e12c5d1SDavid du Colombier 	int i;
9723e12c5d1SDavid du Colombier 
9733e12c5d1SDavid du Colombier 	if(n == Z)
9743e12c5d1SDavid du Colombier 		goto no;
9753e12c5d1SDavid du Colombier 	if(n->op != OCONST)
9763e12c5d1SDavid du Colombier 		goto no;
9773e12c5d1SDavid du Colombier 	if(n->type == T)
9783e12c5d1SDavid du Colombier 		goto no;
9793e12c5d1SDavid du Colombier 	switch(n->type->etype)
9803e12c5d1SDavid du Colombier 	{
9813e12c5d1SDavid du Colombier 	case TFLOAT:
9823e12c5d1SDavid du Colombier 	case TDOUBLE:
9833e12c5d1SDavid du Colombier 		i = 100;
984219b2ee8SDavid du Colombier 		if(n->fconst > i || n->fconst < -i)
9853e12c5d1SDavid du Colombier 			goto no;
986219b2ee8SDavid du Colombier 		i = n->fconst;
987219b2ee8SDavid du Colombier 		if(i != n->fconst)
988219b2ee8SDavid du Colombier 			goto no;
989219b2ee8SDavid du Colombier 		return i;
990219b2ee8SDavid du Colombier 
991219b2ee8SDavid du Colombier 	case TVLONG:
992219b2ee8SDavid du Colombier 	case TUVLONG:
993219b2ee8SDavid du Colombier 		i = n->vconst;
994219b2ee8SDavid du Colombier 		if(i != n->vconst)
9953e12c5d1SDavid du Colombier 			goto no;
9963e12c5d1SDavid du Colombier 		return i;
9973e12c5d1SDavid du Colombier 
9983e12c5d1SDavid du Colombier 	case TCHAR:
9993e12c5d1SDavid du Colombier 	case TUCHAR:
10003e12c5d1SDavid du Colombier 	case TSHORT:
10013e12c5d1SDavid du Colombier 	case TUSHORT:
10027dd7cddfSDavid du Colombier 	case TINT:
10037dd7cddfSDavid du Colombier 	case TUINT:
10043e12c5d1SDavid du Colombier 	case TLONG:
10053e12c5d1SDavid du Colombier 	case TULONG:
10063e12c5d1SDavid du Colombier 	case TIND:
1007219b2ee8SDavid du Colombier 		i = n->vconst;
1008219b2ee8SDavid du Colombier 		if(i != n->vconst)
10093e12c5d1SDavid du Colombier 			goto no;
10103e12c5d1SDavid du Colombier 		return i;
10113e12c5d1SDavid du Colombier 	}
10123e12c5d1SDavid du Colombier no:
10133e12c5d1SDavid du Colombier 	return -159;	/* first uninteresting constant */
10143e12c5d1SDavid du Colombier }
10153e12c5d1SDavid du Colombier 
10163e12c5d1SDavid du Colombier /*
10177dd7cddfSDavid du Colombier  * return log(n) if n is a power of 2 constant
10187dd7cddfSDavid du Colombier  */
10197dd7cddfSDavid du Colombier int
log2(uvlong v)1020282e677fSDavid du Colombier log2(uvlong v)
10217dd7cddfSDavid du Colombier {
10227dd7cddfSDavid du Colombier 	int s, i;
1023282e677fSDavid du Colombier 	uvlong m;
10247dd7cddfSDavid du Colombier 
10257dd7cddfSDavid du Colombier 	s = 0;
10267dd7cddfSDavid du Colombier 	m = MASK(8*sizeof(uvlong));
10277dd7cddfSDavid du Colombier 	for(i=32; i; i>>=1) {
10287dd7cddfSDavid du Colombier 		m >>= i;
10297dd7cddfSDavid du Colombier 		if(!(v & m)) {
10307dd7cddfSDavid du Colombier 			v >>= i;
10317dd7cddfSDavid du Colombier 			s += i;
10327dd7cddfSDavid du Colombier 		}
10337dd7cddfSDavid du Colombier 	}
10347dd7cddfSDavid du Colombier 	if(v == 1)
10357dd7cddfSDavid du Colombier 		return s;
1036282e677fSDavid du Colombier 	return -1;
1037282e677fSDavid du Colombier }
1038282e677fSDavid du Colombier 
1039282e677fSDavid du Colombier int
vlog(Node * n)1040282e677fSDavid du Colombier vlog(Node *n)
1041282e677fSDavid du Colombier {
1042282e677fSDavid du Colombier 	if(n->op != OCONST)
1043282e677fSDavid du Colombier 		goto bad;
1044282e677fSDavid du Colombier 	if(typefd[n->type->etype])
1045282e677fSDavid du Colombier 		goto bad;
1046282e677fSDavid du Colombier 
1047282e677fSDavid du Colombier 	return log2(n->vconst);
10487dd7cddfSDavid du Colombier 
10497dd7cddfSDavid du Colombier bad:
10507dd7cddfSDavid du Colombier 	return -1;
10517dd7cddfSDavid du Colombier }
10527dd7cddfSDavid du Colombier 
10537dd7cddfSDavid du Colombier int
topbit(ulong v)10547dd7cddfSDavid du Colombier topbit(ulong v)
10557dd7cddfSDavid du Colombier {
10567dd7cddfSDavid du Colombier 	int i;
10577dd7cddfSDavid du Colombier 
10587dd7cddfSDavid du Colombier 	for(i = -1; v; i++)
10597dd7cddfSDavid du Colombier 		v >>= 1;
10607dd7cddfSDavid du Colombier 	return i;
10617dd7cddfSDavid du Colombier }
10627dd7cddfSDavid du Colombier 
10637dd7cddfSDavid du Colombier /*
10643e12c5d1SDavid du Colombier  * try to cast a constant down
10653e12c5d1SDavid du Colombier  * rather than cast a variable up
10663e12c5d1SDavid du Colombier  * example:
10673e12c5d1SDavid du Colombier  *	if(c == 'a')
10683e12c5d1SDavid du Colombier  */
10693e12c5d1SDavid du Colombier void
relcon(Node * l,Node * r)10703e12c5d1SDavid du Colombier relcon(Node *l, Node *r)
10713e12c5d1SDavid du Colombier {
1072219b2ee8SDavid du Colombier 	vlong v;
10733e12c5d1SDavid du Colombier 
10743e12c5d1SDavid du Colombier 	if(l->op != OCONST)
10753e12c5d1SDavid du Colombier 		return;
10763e12c5d1SDavid du Colombier 	if(r->op != OCAST)
10773e12c5d1SDavid du Colombier 		return;
10783e12c5d1SDavid du Colombier 	if(!nilcast(r->left->type, r->type))
10793e12c5d1SDavid du Colombier 		return;
10803e12c5d1SDavid du Colombier 	switch(r->type->etype) {
10813e12c5d1SDavid du Colombier 	default:
10823e12c5d1SDavid du Colombier 		return;
10833e12c5d1SDavid du Colombier 	case TCHAR:
10843e12c5d1SDavid du Colombier 	case TUCHAR:
10853e12c5d1SDavid du Colombier 	case TSHORT:
10863e12c5d1SDavid du Colombier 	case TUSHORT:
1087219b2ee8SDavid du Colombier 		v = convvtox(l->vconst, r->type->etype);
1088219b2ee8SDavid du Colombier 		if(v != l->vconst)
10893e12c5d1SDavid du Colombier 			return;
10903e12c5d1SDavid du Colombier 		break;
10913e12c5d1SDavid du Colombier 	}
10923e12c5d1SDavid du Colombier 	l->type = r->left->type;
10933e12c5d1SDavid du Colombier 	*r = *r->left;
10943e12c5d1SDavid du Colombier }
10953e12c5d1SDavid du Colombier 
10963e12c5d1SDavid du Colombier int
relindex(int o)10973e12c5d1SDavid du Colombier relindex(int o)
10983e12c5d1SDavid du Colombier {
10993e12c5d1SDavid du Colombier 
11003e12c5d1SDavid du Colombier 	switch(o) {
11013e12c5d1SDavid du Colombier 	default:
11023e12c5d1SDavid du Colombier 		diag(Z, "bad in relindex: %O", o);
11033e12c5d1SDavid du Colombier 	case OEQ: return 0;
11043e12c5d1SDavid du Colombier 	case ONE: return 1;
11053e12c5d1SDavid du Colombier 	case OLE: return 2;
11063e12c5d1SDavid du Colombier 	case OLS: return 3;
11073e12c5d1SDavid du Colombier 	case OLT: return 4;
11083e12c5d1SDavid du Colombier 	case OLO: return 5;
11093e12c5d1SDavid du Colombier 	case OGE: return 6;
11103e12c5d1SDavid du Colombier 	case OHS: return 7;
11113e12c5d1SDavid du Colombier 	case OGT: return 8;
11123e12c5d1SDavid du Colombier 	case OHI: return 9;
11133e12c5d1SDavid du Colombier 	}
11143e12c5d1SDavid du Colombier }
11153e12c5d1SDavid du Colombier 
11163e12c5d1SDavid du Colombier Node*
invert(Node * n)11173e12c5d1SDavid du Colombier invert(Node *n)
11183e12c5d1SDavid du Colombier {
11193e12c5d1SDavid du Colombier 	Node *i;
11203e12c5d1SDavid du Colombier 
11213e12c5d1SDavid du Colombier 	if(n == Z || n->op != OLIST)
11223e12c5d1SDavid du Colombier 		return n;
11233e12c5d1SDavid du Colombier 	i = n;
11243e12c5d1SDavid du Colombier 	for(n = n->left; n != Z; n = n->left) {
11253e12c5d1SDavid du Colombier 		if(n->op != OLIST)
11263e12c5d1SDavid du Colombier 			break;
11273e12c5d1SDavid du Colombier 		i->left = n->right;
11283e12c5d1SDavid du Colombier 		n->right = i;
11293e12c5d1SDavid du Colombier 		i = n;
11303e12c5d1SDavid du Colombier 	}
11313e12c5d1SDavid du Colombier 	i->left = n;
11323e12c5d1SDavid du Colombier 	return i;
11333e12c5d1SDavid du Colombier }
11343e12c5d1SDavid du Colombier 
11353e12c5d1SDavid du Colombier int
bitno(long b)11363e12c5d1SDavid du Colombier bitno(long b)
11373e12c5d1SDavid du Colombier {
11383e12c5d1SDavid du Colombier 	int i;
11393e12c5d1SDavid du Colombier 
11403e12c5d1SDavid du Colombier 	for(i=0; i<32; i++)
11413e12c5d1SDavid du Colombier 		if(b & (1L<<i))
11423e12c5d1SDavid du Colombier 			return i;
11433e12c5d1SDavid du Colombier 	diag(Z, "bad in bitno");
11443e12c5d1SDavid du Colombier 	return 0;
11453e12c5d1SDavid du Colombier }
11463e12c5d1SDavid du Colombier 
11477dd7cddfSDavid du Colombier long
typebitor(long a,long b)11487dd7cddfSDavid du Colombier typebitor(long a, long b)
11497dd7cddfSDavid du Colombier {
11507dd7cddfSDavid du Colombier 	long c;
11517dd7cddfSDavid du Colombier 
11527dd7cddfSDavid du Colombier 	c = a | b;
11537dd7cddfSDavid du Colombier 	if(a & b)
11547dd7cddfSDavid du Colombier 		if((a & b) == BLONG)
11557dd7cddfSDavid du Colombier 			c |= BVLONG;		/* long long => vlong */
11567dd7cddfSDavid du Colombier 		else
11577dd7cddfSDavid du Colombier 			warn(Z, "once is enough: %Q", a & b);
11587dd7cddfSDavid du Colombier 	return c;
11597dd7cddfSDavid du Colombier }
11607dd7cddfSDavid du Colombier 
11613e12c5d1SDavid du Colombier void
diag(Node * n,char * fmt,...)11627dd7cddfSDavid du Colombier diag(Node *n, char *fmt, ...)
11633e12c5d1SDavid du Colombier {
11643e12c5d1SDavid du Colombier 	char buf[STRINGSZ];
11657dd7cddfSDavid du Colombier 	va_list arg;
11663e12c5d1SDavid du Colombier 
11677dd7cddfSDavid du Colombier 	va_start(arg, fmt);
11689a747e4fSDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
11697dd7cddfSDavid du Colombier 	va_end(arg);
117018027f8cSDavid du Colombier 	Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
11713e12c5d1SDavid du Colombier 
117218027f8cSDavid du Colombier 	if(debug['X']){
117318027f8cSDavid du Colombier 		Bflush(&diagbuf);
11743e12c5d1SDavid du Colombier 		abort();
117518027f8cSDavid du Colombier 	}
11763e12c5d1SDavid du Colombier 	if(n != Z)
11773e12c5d1SDavid du Colombier 	if(debug['v'])
11783e12c5d1SDavid du Colombier 		prtree(n, "diagnostic");
11793e12c5d1SDavid du Colombier 
11803e12c5d1SDavid du Colombier 	nerrors++;
11813e12c5d1SDavid du Colombier 	if(nerrors > 10) {
118218027f8cSDavid du Colombier 		Bprint(&diagbuf, "too many errors\n");
11833e12c5d1SDavid du Colombier 		errorexit();
11843e12c5d1SDavid du Colombier 	}
11853e12c5d1SDavid du Colombier }
11863e12c5d1SDavid du Colombier 
11873e12c5d1SDavid du Colombier void
warn(Node * n,char * fmt,...)11887dd7cddfSDavid du Colombier warn(Node *n, char *fmt, ...)
11893e12c5d1SDavid du Colombier {
11903e12c5d1SDavid du Colombier 	char buf[STRINGSZ];
11917dd7cddfSDavid du Colombier 	va_list arg;
11923e12c5d1SDavid du Colombier 
1193178702b1SDavid du Colombier 	if(debug['w'] || debug['W']) {
11947dd7cddfSDavid du Colombier 		va_start(arg, fmt);
11959a747e4fSDavid du Colombier 		vseprint(buf, buf+sizeof(buf), fmt, arg);
11967dd7cddfSDavid du Colombier 		va_end(arg);
1197178702b1SDavid du Colombier 		if(debug['W']) {
1198178702b1SDavid du Colombier 			diag(n, "%s", buf);
1199178702b1SDavid du Colombier 			return;
1200178702b1SDavid du Colombier 		}
1201178702b1SDavid du Colombier 		Bprint(&diagbuf, "warning: %L %s\n", (n==Z)? nearln: n->lineno, buf);
12023e12c5d1SDavid du Colombier 
12033e12c5d1SDavid du Colombier 		if(n != Z)
12043e12c5d1SDavid du Colombier 		if(debug['v'])
12053e12c5d1SDavid du Colombier 			prtree(n, "warning");
12063e12c5d1SDavid du Colombier 	}
12073e12c5d1SDavid du Colombier }
12083e12c5d1SDavid du Colombier 
12093e12c5d1SDavid du Colombier void
yyerror(char * fmt,...)12107dd7cddfSDavid du Colombier yyerror(char *fmt, ...)
12113e12c5d1SDavid du Colombier {
12123e12c5d1SDavid du Colombier 	char buf[STRINGSZ];
12137dd7cddfSDavid du Colombier 	va_list arg;
12143e12c5d1SDavid du Colombier 
12153e12c5d1SDavid du Colombier 	/*
12163e12c5d1SDavid du Colombier 	 * hack to intercept message from yaccpar
12173e12c5d1SDavid du Colombier 	 */
12187dd7cddfSDavid du Colombier 	if(strcmp(fmt, "syntax error") == 0) {
12193e12c5d1SDavid du Colombier 		yyerror("syntax error, last name: %s", symb);
12203e12c5d1SDavid du Colombier 		return;
12213e12c5d1SDavid du Colombier 	}
12227dd7cddfSDavid du Colombier 	va_start(arg, fmt);
12239a747e4fSDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
12247dd7cddfSDavid du Colombier 	va_end(arg);
122518027f8cSDavid du Colombier 	Bprint(&diagbuf, "%L %s\n", lineno, buf);
12263e12c5d1SDavid du Colombier 	nerrors++;
12273e12c5d1SDavid du Colombier 	if(nerrors > 10) {
122818027f8cSDavid du Colombier 		Bprint(&diagbuf, "too many errors\n");
12293e12c5d1SDavid du Colombier 		errorexit();
12303e12c5d1SDavid du Colombier 	}
12313e12c5d1SDavid du Colombier }
12323e12c5d1SDavid du Colombier 
1233375daca8SDavid du Colombier void
fatal(Node * n,char * fmt,...)1234375daca8SDavid du Colombier fatal(Node *n, char *fmt, ...)
1235375daca8SDavid du Colombier {
1236375daca8SDavid du Colombier 	char buf[STRINGSZ];
1237375daca8SDavid du Colombier 	va_list arg;
1238375daca8SDavid du Colombier 
1239375daca8SDavid du Colombier 	va_start(arg, fmt);
1240375daca8SDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
1241375daca8SDavid du Colombier 	va_end(arg);
124218027f8cSDavid du Colombier 	Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1243375daca8SDavid du Colombier 
124418027f8cSDavid du Colombier 	if(debug['X']){
124518027f8cSDavid du Colombier 		Bflush(&diagbuf);
1246375daca8SDavid du Colombier 		abort();
124718027f8cSDavid du Colombier 	}
1248375daca8SDavid du Colombier 	if(n != Z)
1249375daca8SDavid du Colombier 	if(debug['v'])
1250375daca8SDavid du Colombier 		prtree(n, "diagnostic");
1251375daca8SDavid du Colombier 
1252375daca8SDavid du Colombier 	nerrors++;
1253375daca8SDavid du Colombier 	errorexit();
1254375daca8SDavid du Colombier }
1255375daca8SDavid du Colombier 
12567dd7cddfSDavid du Colombier ulong	thash1	= 0x2edab8c9;
12577dd7cddfSDavid du Colombier ulong	thash2	= 0x1dc74fb8;
12587dd7cddfSDavid du Colombier ulong	thash3	= 0x1f241331;
12597dd7cddfSDavid du Colombier ulong	thash[NALLTYPES];
12607dd7cddfSDavid du Colombier Init	thashinit[] =
12613e12c5d1SDavid du Colombier {
12627dd7cddfSDavid du Colombier 	TXXX,		0x17527bbd,	0,
12637dd7cddfSDavid du Colombier 	TCHAR,		0x5cedd32b,	0,
12647dd7cddfSDavid du Colombier 	TUCHAR,		0x552c4454,	0,
12657dd7cddfSDavid du Colombier 	TSHORT,		0x63040b4b,	0,
12667dd7cddfSDavid du Colombier 	TUSHORT,	0x32a45878,	0,
12677dd7cddfSDavid du Colombier 	TINT,		0x4151d5bd,	0,
12687dd7cddfSDavid du Colombier 	TUINT,		0x5ae707d6,	0,
12697dd7cddfSDavid du Colombier 	TLONG,		0x5ef20f47,	0,
12707dd7cddfSDavid du Colombier 	TULONG,		0x36d8eb8f,	0,
12717dd7cddfSDavid du Colombier 	TVLONG,		0x6e5e9590,	0,
12727dd7cddfSDavid du Colombier 	TUVLONG,	0x75910105,	0,
12737dd7cddfSDavid du Colombier 	TFLOAT,		0x25fd7af1,	0,
12747dd7cddfSDavid du Colombier 	TDOUBLE,	0x7c40a1b2,	0,
12757dd7cddfSDavid du Colombier 	TIND,		0x1b832357,	0,
12767dd7cddfSDavid du Colombier 	TFUNC,		0x6babc9cb,	0,
12777dd7cddfSDavid du Colombier 	TARRAY,		0x7c50986d,	0,
12787dd7cddfSDavid du Colombier 	TVOID,		0x44112eff,	0,
12797dd7cddfSDavid du Colombier 	TSTRUCT,	0x7c2da3bf,	0,
12807dd7cddfSDavid du Colombier 	TUNION,		0x3eb25e98,	0,
12817dd7cddfSDavid du Colombier 	TENUM,		0x44b54f61,	0,
12827dd7cddfSDavid du Colombier 	TFILE,		0x19242ac3,	0,
12837dd7cddfSDavid du Colombier 	TOLD,		0x22b15988,	0,
12847dd7cddfSDavid du Colombier 	TDOT,		0x0204f6b3,	0,
12857dd7cddfSDavid du Colombier 	-1,		0,		0,
12863e12c5d1SDavid du Colombier };
12877dd7cddfSDavid du Colombier 
12887dd7cddfSDavid du Colombier char*	bnames[NALIGN];
12897dd7cddfSDavid du Colombier Init	bnamesinit[] =
12903e12c5d1SDavid du Colombier {
12917dd7cddfSDavid du Colombier 	Axxx,	0,	"Axxx",
12927dd7cddfSDavid du Colombier 	Ael1,	0,	"el1",
12937dd7cddfSDavid du Colombier 	Ael2,	0,	"el2",
12947dd7cddfSDavid du Colombier 	Asu2,	0,	"su2",
12957dd7cddfSDavid du Colombier 	Aarg0,	0,	"arg0",
12967dd7cddfSDavid du Colombier 	Aarg1,	0,	"arg1",
12977dd7cddfSDavid du Colombier 	Aarg2,	0,	"arg2",
12987dd7cddfSDavid du Colombier 	Aaut3,	0,	"aut3",
12997dd7cddfSDavid du Colombier 	-1,	0,	0,
13003e12c5d1SDavid du Colombier };
13017dd7cddfSDavid du Colombier 
13027dd7cddfSDavid du Colombier char*	tnames[NALLTYPES];
13037dd7cddfSDavid du Colombier Init	tnamesinit[] =
13043e12c5d1SDavid du Colombier {
13057dd7cddfSDavid du Colombier 	TXXX,		0,	"TXXX",
13067dd7cddfSDavid du Colombier 	TCHAR,		0,	"CHAR",
13077dd7cddfSDavid du Colombier 	TUCHAR,		0,	"UCHAR",
13087dd7cddfSDavid du Colombier 	TSHORT,		0,	"SHORT",
13097dd7cddfSDavid du Colombier 	TUSHORT,	0,	"USHORT",
13107dd7cddfSDavid du Colombier 	TINT,		0,	"INT",
13117dd7cddfSDavid du Colombier 	TUINT,		0,	"UINT",
13127dd7cddfSDavid du Colombier 	TLONG,		0,	"LONG",
13137dd7cddfSDavid du Colombier 	TULONG,		0,	"ULONG",
13147dd7cddfSDavid du Colombier 	TVLONG,		0,	"VLONG",
13157dd7cddfSDavid du Colombier 	TUVLONG,	0,	"UVLONG",
13167dd7cddfSDavid du Colombier 	TFLOAT,		0,	"FLOAT",
13177dd7cddfSDavid du Colombier 	TDOUBLE,	0,	"DOUBLE",
13187dd7cddfSDavid du Colombier 	TIND,		0,	"IND",
13197dd7cddfSDavid du Colombier 	TFUNC,		0,	"FUNC",
13207dd7cddfSDavid du Colombier 	TARRAY,		0,	"ARRAY",
13217dd7cddfSDavid du Colombier 	TVOID,		0,	"VOID",
13227dd7cddfSDavid du Colombier 	TSTRUCT,	0,	"STRUCT",
13237dd7cddfSDavid du Colombier 	TUNION,		0,	"UNION",
13247dd7cddfSDavid du Colombier 	TENUM,		0,	"ENUM",
13257dd7cddfSDavid du Colombier 	TFILE,		0,	"FILE",
13267dd7cddfSDavid du Colombier 	TOLD,		0,	"OLD",
13277dd7cddfSDavid du Colombier 	TDOT,		0,	"DOT",
13287dd7cddfSDavid du Colombier 	-1,		0,	0,
13293e12c5d1SDavid du Colombier };
13307dd7cddfSDavid du Colombier 
13317dd7cddfSDavid du Colombier char*	gnames[NGTYPES];
13327dd7cddfSDavid du Colombier Init	gnamesinit[] =
13333e12c5d1SDavid du Colombier {
13347dd7cddfSDavid du Colombier 	GXXX,			0,	"GXXX",
13357dd7cddfSDavid du Colombier 	GCONSTNT,		0,	"CONST",
13367dd7cddfSDavid du Colombier 	GVOLATILE,		0,	"VOLATILE",
13377dd7cddfSDavid du Colombier 	GVOLATILE|GCONSTNT,	0,	"CONST-VOLATILE",
13387dd7cddfSDavid du Colombier 	-1,			0,	0,
13397dd7cddfSDavid du Colombier };
13407dd7cddfSDavid du Colombier 
13417dd7cddfSDavid du Colombier char*	qnames[NALLTYPES];
13427dd7cddfSDavid du Colombier Init	qnamesinit[] =
13437dd7cddfSDavid du Colombier {
13447dd7cddfSDavid du Colombier 	TXXX,		0,	"TXXX",
13457dd7cddfSDavid du Colombier 	TCHAR,		0,	"CHAR",
13467dd7cddfSDavid du Colombier 	TUCHAR,		0,	"UCHAR",
13477dd7cddfSDavid du Colombier 	TSHORT,		0,	"SHORT",
13487dd7cddfSDavid du Colombier 	TUSHORT,	0,	"USHORT",
13497dd7cddfSDavid du Colombier 	TINT,		0,	"INT",
13507dd7cddfSDavid du Colombier 	TUINT,		0,	"UINT",
13517dd7cddfSDavid du Colombier 	TLONG,		0,	"LONG",
13527dd7cddfSDavid du Colombier 	TULONG,		0,	"ULONG",
13537dd7cddfSDavid du Colombier 	TVLONG,		0,	"VLONG",
13547dd7cddfSDavid du Colombier 	TUVLONG,	0,	"UVLONG",
13557dd7cddfSDavid du Colombier 	TFLOAT,		0,	"FLOAT",
13567dd7cddfSDavid du Colombier 	TDOUBLE,	0,	"DOUBLE",
13577dd7cddfSDavid du Colombier 	TIND,		0,	"IND",
13587dd7cddfSDavid du Colombier 	TFUNC,		0,	"FUNC",
13597dd7cddfSDavid du Colombier 	TARRAY,		0,	"ARRAY",
13607dd7cddfSDavid du Colombier 	TVOID,		0,	"VOID",
13617dd7cddfSDavid du Colombier 	TSTRUCT,	0,	"STRUCT",
13627dd7cddfSDavid du Colombier 	TUNION,		0,	"UNION",
13637dd7cddfSDavid du Colombier 	TENUM,		0,	"ENUM",
13647dd7cddfSDavid du Colombier 
13657dd7cddfSDavid du Colombier 	TAUTO,		0,	"AUTO",
13667dd7cddfSDavid du Colombier 	TEXTERN,	0,	"EXTERN",
13677dd7cddfSDavid du Colombier 	TSTATIC,	0,	"STATIC",
13687dd7cddfSDavid du Colombier 	TTYPEDEF,	0,	"TYPEDEF",
136980ee5cbfSDavid du Colombier 	TTYPESTR,	0,	"TYPESTR",
13707dd7cddfSDavid du Colombier 	TREGISTER,	0,	"REGISTER",
13717dd7cddfSDavid du Colombier 	TCONSTNT,	0,	"CONSTNT",
13727dd7cddfSDavid du Colombier 	TVOLATILE,	0,	"VOLATILE",
13737dd7cddfSDavid du Colombier 	TUNSIGNED,	0,	"UNSIGNED",
13747dd7cddfSDavid du Colombier 	TSIGNED,	0,	"SIGNED",
13757dd7cddfSDavid du Colombier 	TDOT,		0,	"DOT",
13767dd7cddfSDavid du Colombier 	TFILE,		0,	"FILE",
13777dd7cddfSDavid du Colombier 	TOLD,		0,	"OLD",
13787dd7cddfSDavid du Colombier 	-1,		0,	0,
13797dd7cddfSDavid du Colombier };
13807dd7cddfSDavid du Colombier char*	cnames[NCTYPES];
13817dd7cddfSDavid du Colombier Init	cnamesinit[] =
13827dd7cddfSDavid du Colombier {
13837dd7cddfSDavid du Colombier 	CXXX,		0,	"CXXX",
13847dd7cddfSDavid du Colombier 	CAUTO,		0,	"AUTO",
13857dd7cddfSDavid du Colombier 	CEXTERN,	0,	"EXTERN",
13867dd7cddfSDavid du Colombier 	CGLOBL,		0,	"GLOBL",
13877dd7cddfSDavid du Colombier 	CSTATIC,	0,	"STATIC",
13887dd7cddfSDavid du Colombier 	CLOCAL,		0,	"LOCAL",
13897dd7cddfSDavid du Colombier 	CTYPEDEF,	0,	"TYPEDEF",
139080ee5cbfSDavid du Colombier 	CTYPESTR,	0,	"TYPESTR",
13917dd7cddfSDavid du Colombier 	CPARAM,		0,	"PARAM",
13927dd7cddfSDavid du Colombier 	CSELEM,		0,	"SELEM",
13937dd7cddfSDavid du Colombier 	CLABEL,		0,	"LABEL",
13947dd7cddfSDavid du Colombier 	CEXREG,		0,	"EXREG",
13957dd7cddfSDavid du Colombier 	-1,		0,	0,
13967dd7cddfSDavid du Colombier };
13977dd7cddfSDavid du Colombier 
13987dd7cddfSDavid du Colombier char*	onames[OEND+1];
13997dd7cddfSDavid du Colombier Init	onamesinit[] =
14007dd7cddfSDavid du Colombier {
14017dd7cddfSDavid du Colombier 	OXXX,		0,	"OXXX",
14027dd7cddfSDavid du Colombier 	OADD,		0,	"ADD",
14037dd7cddfSDavid du Colombier 	OADDR,		0,	"ADDR",
14047dd7cddfSDavid du Colombier 	OAND,		0,	"AND",
14057dd7cddfSDavid du Colombier 	OANDAND,	0,	"ANDAND",
14067dd7cddfSDavid du Colombier 	OARRAY,		0,	"ARRAY",
14077dd7cddfSDavid du Colombier 	OAS,		0,	"AS",
14087dd7cddfSDavid du Colombier 	OASI,		0,	"ASI",
14097dd7cddfSDavid du Colombier 	OASADD,		0,	"ASADD",
14107dd7cddfSDavid du Colombier 	OASAND,		0,	"ASAND",
14117dd7cddfSDavid du Colombier 	OASASHL,	0,	"ASASHL",
14127dd7cddfSDavid du Colombier 	OASASHR,	0,	"ASASHR",
14137dd7cddfSDavid du Colombier 	OASDIV,		0,	"ASDIV",
14147dd7cddfSDavid du Colombier 	OASHL,		0,	"ASHL",
14157dd7cddfSDavid du Colombier 	OASHR,		0,	"ASHR",
14167dd7cddfSDavid du Colombier 	OASLDIV,	0,	"ASLDIV",
14177dd7cddfSDavid du Colombier 	OASLMOD,	0,	"ASLMOD",
14187dd7cddfSDavid du Colombier 	OASLMUL,	0,	"ASLMUL",
14197dd7cddfSDavid du Colombier 	OASLSHR,	0,	"ASLSHR",
14207dd7cddfSDavid du Colombier 	OASMOD,		0,	"ASMOD",
14217dd7cddfSDavid du Colombier 	OASMUL,		0,	"ASMUL",
14227dd7cddfSDavid du Colombier 	OASOR,		0,	"ASOR",
14237dd7cddfSDavid du Colombier 	OASSUB,		0,	"ASSUB",
14247dd7cddfSDavid du Colombier 	OASXOR,		0,	"ASXOR",
14257dd7cddfSDavid du Colombier 	OBIT,		0,	"BIT",
14267dd7cddfSDavid du Colombier 	OBREAK,		0,	"BREAK",
14277dd7cddfSDavid du Colombier 	OCASE,		0,	"CASE",
14287dd7cddfSDavid du Colombier 	OCAST,		0,	"CAST",
14297dd7cddfSDavid du Colombier 	OCOMMA,		0,	"COMMA",
14307dd7cddfSDavid du Colombier 	OCOND,		0,	"COND",
14317dd7cddfSDavid du Colombier 	OCONST,		0,	"CONST",
14327dd7cddfSDavid du Colombier 	OCONTINUE,	0,	"CONTINUE",
14337dd7cddfSDavid du Colombier 	ODIV,		0,	"DIV",
14347dd7cddfSDavid du Colombier 	ODOT,		0,	"DOT",
14357dd7cddfSDavid du Colombier 	ODOTDOT,	0,	"DOTDOT",
14367dd7cddfSDavid du Colombier 	ODWHILE,	0,	"DWHILE",
14377dd7cddfSDavid du Colombier 	OENUM,		0,	"ENUM",
14387dd7cddfSDavid du Colombier 	OEQ,		0,	"EQ",
14397dd7cddfSDavid du Colombier 	OFOR,		0,	"FOR",
14407dd7cddfSDavid du Colombier 	OFUNC,		0,	"FUNC",
14417dd7cddfSDavid du Colombier 	OGE,		0,	"GE",
14427dd7cddfSDavid du Colombier 	OGOTO,		0,	"GOTO",
14437dd7cddfSDavid du Colombier 	OGT,		0,	"GT",
14447dd7cddfSDavid du Colombier 	OHI,		0,	"HI",
14457dd7cddfSDavid du Colombier 	OHS,		0,	"HS",
14467dd7cddfSDavid du Colombier 	OIF,		0,	"IF",
14477dd7cddfSDavid du Colombier 	OIND,		0,	"IND",
14487dd7cddfSDavid du Colombier 	OINDREG,	0,	"INDREG",
14497dd7cddfSDavid du Colombier 	OINIT,		0,	"INIT",
14507dd7cddfSDavid du Colombier 	OLABEL,		0,	"LABEL",
14517dd7cddfSDavid du Colombier 	OLDIV,		0,	"LDIV",
14527dd7cddfSDavid du Colombier 	OLE,		0,	"LE",
14537dd7cddfSDavid du Colombier 	OLIST,		0,	"LIST",
14547dd7cddfSDavid du Colombier 	OLMOD,		0,	"LMOD",
14557dd7cddfSDavid du Colombier 	OLMUL,		0,	"LMUL",
14567dd7cddfSDavid du Colombier 	OLO,		0,	"LO",
14577dd7cddfSDavid du Colombier 	OLS,		0,	"LS",
14587dd7cddfSDavid du Colombier 	OLSHR,		0,	"LSHR",
14597dd7cddfSDavid du Colombier 	OLT,		0,	"LT",
14607dd7cddfSDavid du Colombier 	OMOD,		0,	"MOD",
14617dd7cddfSDavid du Colombier 	OMUL,		0,	"MUL",
14627dd7cddfSDavid du Colombier 	ONAME,		0,	"NAME",
14637dd7cddfSDavid du Colombier 	ONE,		0,	"NE",
14647dd7cddfSDavid du Colombier 	ONOT,		0,	"NOT",
14657dd7cddfSDavid du Colombier 	OOR,		0,	"OR",
14667dd7cddfSDavid du Colombier 	OOROR,		0,	"OROR",
14677dd7cddfSDavid du Colombier 	OPOSTDEC,	0,	"POSTDEC",
14687dd7cddfSDavid du Colombier 	OPOSTINC,	0,	"POSTINC",
14697dd7cddfSDavid du Colombier 	OPREDEC,	0,	"PREDEC",
14707dd7cddfSDavid du Colombier 	OPREINC,	0,	"PREINC",
14717dd7cddfSDavid du Colombier 	OPROTO,		0,	"PROTO",
14727dd7cddfSDavid du Colombier 	OREGISTER,	0,	"REGISTER",
14737dd7cddfSDavid du Colombier 	ORETURN,	0,	"RETURN",
14747dd7cddfSDavid du Colombier 	OSET,		0,	"SET",
14757dd7cddfSDavid du Colombier 	OSIGN,		0,	"SIGN",
14767dd7cddfSDavid du Colombier 	OSIZE,		0,	"SIZE",
14777dd7cddfSDavid du Colombier 	OSTRING,	0,	"STRING",
14787dd7cddfSDavid du Colombier 	OLSTRING,	0,	"LSTRING",
14797dd7cddfSDavid du Colombier 	OSTRUCT,	0,	"STRUCT",
14807dd7cddfSDavid du Colombier 	OSUB,		0,	"SUB",
14817dd7cddfSDavid du Colombier 	OSWITCH,	0,	"SWITCH",
14827dd7cddfSDavid du Colombier 	OUNION,		0,	"UNION",
14837dd7cddfSDavid du Colombier 	OUSED,		0,	"USED",
14847dd7cddfSDavid du Colombier 	OWHILE,		0,	"WHILE",
14857dd7cddfSDavid du Colombier 	OXOR,		0,	"XOR",
148680ee5cbfSDavid du Colombier 	OPOS,		0,	"POS",
14877dd7cddfSDavid du Colombier 	ONEG,		0,	"NEG",
14887dd7cddfSDavid du Colombier 	OCOM,		0,	"COM",
14897dd7cddfSDavid du Colombier 	OELEM,		0,	"ELEM",
14907dd7cddfSDavid du Colombier 	OTST,		0,	"TST",
14917dd7cddfSDavid du Colombier 	OINDEX,		0,	"INDEX",
14927dd7cddfSDavid du Colombier 	OFAS,		0,	"FAS",
1493da51d93aSDavid du Colombier 	OREGPAIR,	0,	"REGPAIR",
1494d40255d8SDavid du Colombier 	OEXREG,		0,	"EXREG",
14957dd7cddfSDavid du Colombier 	OEND,		0,	"END",
14967dd7cddfSDavid du Colombier 	-1,		0,	0,
14973e12c5d1SDavid du Colombier };
14983e12c5d1SDavid du Colombier 
149922a127bbSDavid du Colombier /*	OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
15003e12c5d1SDavid du Colombier char	comrel[12] =
15013e12c5d1SDavid du Colombier {
15023e12c5d1SDavid du Colombier 	ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
15033e12c5d1SDavid du Colombier };
15043e12c5d1SDavid du Colombier char	invrel[12] =
15053e12c5d1SDavid du Colombier {
15063e12c5d1SDavid du Colombier 	OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
15073e12c5d1SDavid du Colombier };
15083e12c5d1SDavid du Colombier char	logrel[12] =
15093e12c5d1SDavid du Colombier {
15103e12c5d1SDavid du Colombier 	OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
15113e12c5d1SDavid du Colombier };
15123e12c5d1SDavid du Colombier 
15137dd7cddfSDavid du Colombier char	typei[NTYPE];
15147dd7cddfSDavid du Colombier int	typeiinit[] =
15157dd7cddfSDavid du Colombier {
15167dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
15177dd7cddfSDavid du Colombier };
15187dd7cddfSDavid du Colombier char	typeu[NTYPE];
15197dd7cddfSDavid du Colombier int	typeuinit[] =
15207dd7cddfSDavid du Colombier {
15217dd7cddfSDavid du Colombier 	TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
15227dd7cddfSDavid du Colombier };
1523219b2ee8SDavid du Colombier 
15247dd7cddfSDavid du Colombier char	typesuv[NTYPE];
15257dd7cddfSDavid du Colombier int	typesuvinit[] =
15267dd7cddfSDavid du Colombier {
15277dd7cddfSDavid du Colombier 	TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
15287dd7cddfSDavid du Colombier };
15293e12c5d1SDavid du Colombier 
15307dd7cddfSDavid du Colombier char	typeilp[NTYPE];
15317dd7cddfSDavid du Colombier int	typeilpinit[] =
15327dd7cddfSDavid du Colombier {
15337dd7cddfSDavid du Colombier 	TINT, TUINT, TLONG, TULONG, TIND, -1
15347dd7cddfSDavid du Colombier };
1535219b2ee8SDavid du Colombier 
15367dd7cddfSDavid du Colombier char	typechl[NTYPE];
1537da51d93aSDavid du Colombier char	typechlv[NTYPE];
153822a127bbSDavid du Colombier char typechlvp[NTYPE];
15397dd7cddfSDavid du Colombier int	typechlinit[] =
15403e12c5d1SDavid du Colombier {
15417dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
15423e12c5d1SDavid du Colombier };
15437dd7cddfSDavid du Colombier 
15447dd7cddfSDavid du Colombier char	typechlp[NTYPE];
15457dd7cddfSDavid du Colombier int	typechlpinit[] =
15463e12c5d1SDavid du Colombier {
15477dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
15483e12c5d1SDavid du Colombier };
15497dd7cddfSDavid du Colombier 
15507dd7cddfSDavid du Colombier char	typechlpfd[NTYPE];
15517dd7cddfSDavid du Colombier int	typechlpfdinit[] =
15523e12c5d1SDavid du Colombier {
15537dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
15543e12c5d1SDavid du Colombier };
15557dd7cddfSDavid du Colombier 
15567dd7cddfSDavid du Colombier char	typec[NTYPE];
15577dd7cddfSDavid du Colombier int	typecinit[] =
15583e12c5d1SDavid du Colombier {
15597dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, -1
15603e12c5d1SDavid du Colombier };
15617dd7cddfSDavid du Colombier 
15627dd7cddfSDavid du Colombier char	typeh[NTYPE];
15637dd7cddfSDavid du Colombier int	typehinit[] =
15643e12c5d1SDavid du Colombier {
15657dd7cddfSDavid du Colombier 	TSHORT, TUSHORT, -1,
15663e12c5d1SDavid du Colombier };
15677dd7cddfSDavid du Colombier 
15687dd7cddfSDavid du Colombier char	typeil[NTYPE];
15697dd7cddfSDavid du Colombier int	typeilinit[] =
15703e12c5d1SDavid du Colombier {
15717dd7cddfSDavid du Colombier 	TINT, TUINT, TLONG, TULONG, -1,
15723e12c5d1SDavid du Colombier };
15737dd7cddfSDavid du Colombier 
15747dd7cddfSDavid du Colombier char	typev[NTYPE];
15757dd7cddfSDavid du Colombier int	typevinit[] =
15763e12c5d1SDavid du Colombier {
15777dd7cddfSDavid du Colombier 	TVLONG,	TUVLONG, -1,
15783e12c5d1SDavid du Colombier };
15797dd7cddfSDavid du Colombier 
15807dd7cddfSDavid du Colombier char	typefd[NTYPE];
15817dd7cddfSDavid du Colombier int	typefdinit[] =
15823e12c5d1SDavid du Colombier {
15837dd7cddfSDavid du Colombier 	TFLOAT, TDOUBLE, -1,
15843e12c5d1SDavid du Colombier };
15857dd7cddfSDavid du Colombier 
15867dd7cddfSDavid du Colombier char	typeaf[NTYPE];
15877dd7cddfSDavid du Colombier int	typeafinit[] =
15883e12c5d1SDavid du Colombier {
15897dd7cddfSDavid du Colombier 	TFUNC, TARRAY, -1,
15903e12c5d1SDavid du Colombier };
15917dd7cddfSDavid du Colombier 
15927dd7cddfSDavid du Colombier char	typesu[NTYPE];
15937dd7cddfSDavid du Colombier int	typesuinit[] =
15947dd7cddfSDavid du Colombier {
15957dd7cddfSDavid du Colombier 	TSTRUCT, TUNION, -1,
15967dd7cddfSDavid du Colombier };
15977dd7cddfSDavid du Colombier 
15987dd7cddfSDavid du Colombier long	tasign[NTYPE];
15997dd7cddfSDavid du Colombier Init	tasigninit[] =
16007dd7cddfSDavid du Colombier {
16017dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
16027dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
16037dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
16047dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
16057dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
16067dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
16077dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
16087dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
16097dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
16107dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
16117dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16127dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16137dd7cddfSDavid du Colombier 	TIND,		BIND,		0,
16147dd7cddfSDavid du Colombier 	TSTRUCT,	BSTRUCT,	0,
16157dd7cddfSDavid du Colombier 	TUNION,		BUNION,		0,
16167dd7cddfSDavid du Colombier 	-1,		0,		0,
16177dd7cddfSDavid du Colombier };
16187dd7cddfSDavid du Colombier 
16197dd7cddfSDavid du Colombier long	tasadd[NTYPE];
16207dd7cddfSDavid du Colombier Init	tasaddinit[] =
16217dd7cddfSDavid du Colombier {
16227dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
16237dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
16247dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
16257dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
16267dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
16277dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
16287dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
16297dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
16307dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
16317dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
16327dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16337dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16347dd7cddfSDavid du Colombier 	TIND,		BINTEGER,	0,
16357dd7cddfSDavid du Colombier 	-1,		0,		0,
16367dd7cddfSDavid du Colombier };
16377dd7cddfSDavid du Colombier 
16387dd7cddfSDavid du Colombier long	tcast[NTYPE];
16397dd7cddfSDavid du Colombier Init	tcastinit[] =
16407dd7cddfSDavid du Colombier {
16417dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER|BIND|BVOID,	0,
16427dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER|BIND|BVOID,	0,
16437dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER|BIND|BVOID,	0,
16447dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER|BIND|BVOID,	0,
16457dd7cddfSDavid du Colombier 	TINT,		BNUMBER|BIND|BVOID,	0,
16467dd7cddfSDavid du Colombier 	TUINT,		BNUMBER|BIND|BVOID,	0,
16477dd7cddfSDavid du Colombier 	TLONG,		BNUMBER|BIND|BVOID,	0,
16487dd7cddfSDavid du Colombier 	TULONG,		BNUMBER|BIND|BVOID,	0,
16497dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER|BIND|BVOID,	0,
16507dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER|BIND|BVOID,	0,
16517dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER|BVOID,		0,
16527dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER|BVOID,		0,
16537dd7cddfSDavid du Colombier 	TIND,		BINTEGER|BIND|BVOID,	0,
16547dd7cddfSDavid du Colombier 	TVOID,		BVOID,			0,
16557dd7cddfSDavid du Colombier 	TSTRUCT,	BSTRUCT|BVOID,		0,
16567dd7cddfSDavid du Colombier 	TUNION,		BUNION|BVOID,		0,
16577dd7cddfSDavid du Colombier 	-1,		0,			0,
16587dd7cddfSDavid du Colombier };
16597dd7cddfSDavid du Colombier 
16607dd7cddfSDavid du Colombier long	tadd[NTYPE];
16617dd7cddfSDavid du Colombier Init	taddinit[] =
16627dd7cddfSDavid du Colombier {
16637dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER|BIND,	0,
16647dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER|BIND,	0,
16657dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER|BIND,	0,
16667dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER|BIND,	0,
16677dd7cddfSDavid du Colombier 	TINT,		BNUMBER|BIND,	0,
16687dd7cddfSDavid du Colombier 	TUINT,		BNUMBER|BIND,	0,
16697dd7cddfSDavid du Colombier 	TLONG,		BNUMBER|BIND,	0,
16707dd7cddfSDavid du Colombier 	TULONG,		BNUMBER|BIND,	0,
16717dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER|BIND,	0,
16727dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER|BIND,	0,
16737dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16747dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16757dd7cddfSDavid du Colombier 	TIND,		BINTEGER,	0,
16767dd7cddfSDavid du Colombier 	-1,		0,		0,
16777dd7cddfSDavid du Colombier };
16787dd7cddfSDavid du Colombier 
16797dd7cddfSDavid du Colombier long	tsub[NTYPE];
16807dd7cddfSDavid du Colombier Init	tsubinit[] =
16817dd7cddfSDavid du Colombier {
16827dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
16837dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
16847dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
16857dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
16867dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
16877dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
16887dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
16897dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
16907dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
16917dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
16927dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16937dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16947dd7cddfSDavid du Colombier 	TIND,		BINTEGER|BIND,	0,
16957dd7cddfSDavid du Colombier 	-1,		0,		0,
16967dd7cddfSDavid du Colombier };
16977dd7cddfSDavid du Colombier 
16987dd7cddfSDavid du Colombier long	tmul[NTYPE];
16997dd7cddfSDavid du Colombier Init	tmulinit[] =
17007dd7cddfSDavid du Colombier {
17017dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
17027dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
17037dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
17047dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
17057dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
17067dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
17077dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
17087dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
17097dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
17107dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
17117dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
17127dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
17137dd7cddfSDavid du Colombier 	-1,		0,		0,
17147dd7cddfSDavid du Colombier };
17157dd7cddfSDavid du Colombier 
17167dd7cddfSDavid du Colombier long	tand[NTYPE];
17177dd7cddfSDavid du Colombier Init	tandinit[] =
17187dd7cddfSDavid du Colombier {
17197dd7cddfSDavid du Colombier 	TCHAR,		BINTEGER,	0,
17207dd7cddfSDavid du Colombier 	TUCHAR,		BINTEGER,	0,
17217dd7cddfSDavid du Colombier 	TSHORT,		BINTEGER,	0,
17227dd7cddfSDavid du Colombier 	TUSHORT,	BINTEGER,	0,
17237dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
17247dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
17257dd7cddfSDavid du Colombier 	TLONG,		BINTEGER,	0,
17267dd7cddfSDavid du Colombier 	TULONG,		BINTEGER,	0,
17277dd7cddfSDavid du Colombier 	TVLONG,		BINTEGER,	0,
17287dd7cddfSDavid du Colombier 	TUVLONG,	BINTEGER,	0,
17297dd7cddfSDavid du Colombier 	-1,		0,		0,
17307dd7cddfSDavid du Colombier };
17317dd7cddfSDavid du Colombier 
17327dd7cddfSDavid du Colombier long	trel[NTYPE];
17337dd7cddfSDavid du Colombier Init	trelinit[] =
17347dd7cddfSDavid du Colombier {
17357dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
17367dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
17377dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
17387dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
17397dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
17407dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
17417dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
17427dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
17437dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
17447dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
17457dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
17467dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
17477dd7cddfSDavid du Colombier 	TIND,		BIND,		0,
17487dd7cddfSDavid du Colombier 	-1,		0,		0,
17497dd7cddfSDavid du Colombier };
17507dd7cddfSDavid du Colombier 
17513e12c5d1SDavid du Colombier long	tfunct[1] =
17523e12c5d1SDavid du Colombier {
17537dd7cddfSDavid du Colombier 	BFUNC,
17543e12c5d1SDavid du Colombier };
17557dd7cddfSDavid du Colombier 
17563e12c5d1SDavid du Colombier long	tindir[1] =
17573e12c5d1SDavid du Colombier {
17587dd7cddfSDavid du Colombier 	BIND,
17593e12c5d1SDavid du Colombier };
17607dd7cddfSDavid du Colombier 
17613e12c5d1SDavid du Colombier long	tdot[1] =
17623e12c5d1SDavid du Colombier {
17637dd7cddfSDavid du Colombier 	BSTRUCT|BUNION,
17643e12c5d1SDavid du Colombier };
17657dd7cddfSDavid du Colombier 
17663e12c5d1SDavid du Colombier long	tnot[1] =
17673e12c5d1SDavid du Colombier {
17687dd7cddfSDavid du Colombier 	BNUMBER|BIND,
17693e12c5d1SDavid du Colombier };
17707dd7cddfSDavid du Colombier 
17713e12c5d1SDavid du Colombier long	targ[1] =
17723e12c5d1SDavid du Colombier {
17737dd7cddfSDavid du Colombier 	BNUMBER|BIND|BSTRUCT|BUNION,
17743e12c5d1SDavid du Colombier };
17753e12c5d1SDavid du Colombier 
17763e12c5d1SDavid du Colombier char	tab[NTYPE][NTYPE] =
17773e12c5d1SDavid du Colombier {
17787dd7cddfSDavid du Colombier /*TXXX*/	{ 0,
17797dd7cddfSDavid du Colombier 		},
17807dd7cddfSDavid du Colombier 
17817dd7cddfSDavid du Colombier /*TCHAR*/	{ 0,	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
17827dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17837dd7cddfSDavid du Colombier 		},
17847dd7cddfSDavid du Colombier /*TUCHAR*/	{ 0,	TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
17857dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17867dd7cddfSDavid du Colombier 		},
17877dd7cddfSDavid du Colombier /*TSHORT*/	{ 0,	TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
17887dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17897dd7cddfSDavid du Colombier 		},
17907dd7cddfSDavid du Colombier /*TUSHORT*/	{ 0,	TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
17917dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17927dd7cddfSDavid du Colombier 		},
17937dd7cddfSDavid du Colombier /*TINT*/	{ 0,	TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
17947dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17957dd7cddfSDavid du Colombier 		},
17967dd7cddfSDavid du Colombier /*TUINT*/	{ 0,	TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
17977dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17987dd7cddfSDavid du Colombier 		},
17997dd7cddfSDavid du Colombier /*TLONG*/	{ 0,	TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
18007dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18017dd7cddfSDavid du Colombier 		},
18027dd7cddfSDavid du Colombier /*TULONG*/	{ 0,	TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
18037dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18047dd7cddfSDavid du Colombier 		},
18057dd7cddfSDavid du Colombier /*TVLONG*/	{ 0,	TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
18067dd7cddfSDavid du Colombier 			TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18077dd7cddfSDavid du Colombier 		},
18087dd7cddfSDavid du Colombier /*TUVLONG*/	{ 0,	TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
18097dd7cddfSDavid du Colombier 			TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
18107dd7cddfSDavid du Colombier 		},
18117dd7cddfSDavid du Colombier /*TFLOAT*/	{ 0,	TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
18127dd7cddfSDavid du Colombier 			TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
18137dd7cddfSDavid du Colombier 		},
18147dd7cddfSDavid du Colombier /*TDOUBLE*/	{ 0,	TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
18157dd7cddfSDavid du Colombier 			TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
18167dd7cddfSDavid du Colombier 		},
18177dd7cddfSDavid du Colombier /*TIND*/	{ 0,	TIND, TIND, TIND, TIND, TIND, TIND, TIND,
18187dd7cddfSDavid du Colombier 			 TIND, TIND, TIND, TIND, TIND, TIND,
18197dd7cddfSDavid du Colombier 		},
18203e12c5d1SDavid du Colombier };
18217dd7cddfSDavid du Colombier 
18227dd7cddfSDavid du Colombier void
urk(char * name,int max,int i)18237dd7cddfSDavid du Colombier urk(char *name, int max, int i)
18247dd7cddfSDavid du Colombier {
18257dd7cddfSDavid du Colombier 	if(i >= max) {
18267dd7cddfSDavid du Colombier 		fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
18277dd7cddfSDavid du Colombier 		exits("init");
18287dd7cddfSDavid du Colombier 	}
18297dd7cddfSDavid du Colombier }
18307dd7cddfSDavid du Colombier 
18317dd7cddfSDavid du Colombier void
tinit(void)18327dd7cddfSDavid du Colombier tinit(void)
18337dd7cddfSDavid du Colombier {
18344ac975e2SDavid du Colombier 	int *ip;
18357dd7cddfSDavid du Colombier 	Init *p;
18367dd7cddfSDavid du Colombier 
18377dd7cddfSDavid du Colombier 	for(p=thashinit; p->code >= 0; p++) {
18387dd7cddfSDavid du Colombier 		urk("thash", nelem(thash), p->code);
18397dd7cddfSDavid du Colombier 		thash[p->code] = p->value;
18407dd7cddfSDavid du Colombier 	}
18417dd7cddfSDavid du Colombier 	for(p=bnamesinit; p->code >= 0; p++) {
18427dd7cddfSDavid du Colombier 		urk("bnames", nelem(bnames), p->code);
18437dd7cddfSDavid du Colombier 		bnames[p->code] = p->s;
18447dd7cddfSDavid du Colombier 	}
18457dd7cddfSDavid du Colombier 	for(p=tnamesinit; p->code >= 0; p++) {
18467dd7cddfSDavid du Colombier 		urk("tnames", nelem(tnames), p->code);
18477dd7cddfSDavid du Colombier 		tnames[p->code] = p->s;
18487dd7cddfSDavid du Colombier 	}
18497dd7cddfSDavid du Colombier 	for(p=gnamesinit; p->code >= 0; p++) {
18507dd7cddfSDavid du Colombier 		urk("gnames", nelem(gnames), p->code);
18517dd7cddfSDavid du Colombier 		gnames[p->code] = p->s;
18527dd7cddfSDavid du Colombier 	}
18537dd7cddfSDavid du Colombier 	for(p=qnamesinit; p->code >= 0; p++) {
18547dd7cddfSDavid du Colombier 		urk("qnames", nelem(qnames), p->code);
18557dd7cddfSDavid du Colombier 		qnames[p->code] = p->s;
18567dd7cddfSDavid du Colombier 	}
18577dd7cddfSDavid du Colombier 	for(p=cnamesinit; p->code >= 0; p++) {
18587dd7cddfSDavid du Colombier 		urk("cnames", nelem(cnames), p->code);
18597dd7cddfSDavid du Colombier 		cnames[p->code] = p->s;
18607dd7cddfSDavid du Colombier 	}
18617dd7cddfSDavid du Colombier 	for(p=onamesinit; p->code >= 0; p++) {
18627dd7cddfSDavid du Colombier 		urk("onames", nelem(onames), p->code);
18637dd7cddfSDavid du Colombier 		onames[p->code] = p->s;
18647dd7cddfSDavid du Colombier 	}
18654ac975e2SDavid du Colombier 	for(ip=typeiinit; *ip>=0; ip++) {
18664ac975e2SDavid du Colombier 		urk("typei", nelem(typei), *ip);
18674ac975e2SDavid du Colombier 		typei[*ip] = 1;
18687dd7cddfSDavid du Colombier 	}
18694ac975e2SDavid du Colombier 	for(ip=typeuinit; *ip>=0; ip++) {
18704ac975e2SDavid du Colombier 		urk("typeu", nelem(typeu), *ip);
18714ac975e2SDavid du Colombier 		typeu[*ip] = 1;
18727dd7cddfSDavid du Colombier 	}
18734ac975e2SDavid du Colombier 	for(ip=typesuvinit; *ip>=0; ip++) {
18744ac975e2SDavid du Colombier 		urk("typesuv", nelem(typesuv), *ip);
18754ac975e2SDavid du Colombier 		typesuv[*ip] = 1;
18767dd7cddfSDavid du Colombier 	}
18774ac975e2SDavid du Colombier 	for(ip=typeilpinit; *ip>=0; ip++) {
18784ac975e2SDavid du Colombier 		urk("typeilp", nelem(typeilp), *ip);
18794ac975e2SDavid du Colombier 		typeilp[*ip] = 1;
18807dd7cddfSDavid du Colombier 	}
18814ac975e2SDavid du Colombier 	for(ip=typechlinit; *ip>=0; ip++) {
18824ac975e2SDavid du Colombier 		urk("typechl", nelem(typechl), *ip);
18834ac975e2SDavid du Colombier 		typechl[*ip] = 1;
18844ac975e2SDavid du Colombier 		typechlv[*ip] = 1;
18854ac975e2SDavid du Colombier 		typechlvp[*ip] = 1;
18867dd7cddfSDavid du Colombier 	}
18874ac975e2SDavid du Colombier 	for(ip=typechlpinit; *ip>=0; ip++) {
18884ac975e2SDavid du Colombier 		urk("typechlp", nelem(typechlp), *ip);
18894ac975e2SDavid du Colombier 		typechlp[*ip] = 1;
18904ac975e2SDavid du Colombier 		typechlvp[*ip] = 1;
18917dd7cddfSDavid du Colombier 	}
18924ac975e2SDavid du Colombier 	for(ip=typechlpfdinit; *ip>=0; ip++) {
18934ac975e2SDavid du Colombier 		urk("typechlpfd", nelem(typechlpfd), *ip);
18944ac975e2SDavid du Colombier 		typechlpfd[*ip] = 1;
18957dd7cddfSDavid du Colombier 	}
18964ac975e2SDavid du Colombier 	for(ip=typecinit; *ip>=0; ip++) {
18974ac975e2SDavid du Colombier 		urk("typec", nelem(typec), *ip);
18984ac975e2SDavid du Colombier 		typec[*ip] = 1;
18997dd7cddfSDavid du Colombier 	}
19004ac975e2SDavid du Colombier 	for(ip=typehinit; *ip>=0; ip++) {
19014ac975e2SDavid du Colombier 		urk("typeh", nelem(typeh), *ip);
19024ac975e2SDavid du Colombier 		typeh[*ip] = 1;
19037dd7cddfSDavid du Colombier 	}
19044ac975e2SDavid du Colombier 	for(ip=typeilinit; *ip>=0; ip++) {
19054ac975e2SDavid du Colombier 		urk("typeil", nelem(typeil), *ip);
19064ac975e2SDavid du Colombier 		typeil[*ip] = 1;
19077dd7cddfSDavid du Colombier 	}
19084ac975e2SDavid du Colombier 	for(ip=typevinit; *ip>=0; ip++) {
19094ac975e2SDavid du Colombier 		urk("typev", nelem(typev), *ip);
19104ac975e2SDavid du Colombier 		typev[*ip] = 1;
19114ac975e2SDavid du Colombier 		typechlv[*ip] = 1;
19124ac975e2SDavid du Colombier 		typechlvp[*ip] = 1;
19137dd7cddfSDavid du Colombier 	}
19144ac975e2SDavid du Colombier 	for(ip=typefdinit; *ip>=0; ip++) {
19154ac975e2SDavid du Colombier 		urk("typefd", nelem(typefd), *ip);
19164ac975e2SDavid du Colombier 		typefd[*ip] = 1;
19177dd7cddfSDavid du Colombier 	}
19184ac975e2SDavid du Colombier 	for(ip=typeafinit; *ip>=0; ip++) {
19194ac975e2SDavid du Colombier 		urk("typeaf", nelem(typeaf), *ip);
19204ac975e2SDavid du Colombier 		typeaf[*ip] = 1;
19217dd7cddfSDavid du Colombier 	}
19224ac975e2SDavid du Colombier 	for(ip=typesuinit; *ip >= 0; ip++) {
19234ac975e2SDavid du Colombier 		urk("typesu", nelem(typesu), *ip);
19244ac975e2SDavid du Colombier 		typesu[*ip] = 1;
19257dd7cddfSDavid du Colombier 	}
19267dd7cddfSDavid du Colombier 	for(p=tasigninit; p->code >= 0; p++) {
19277dd7cddfSDavid du Colombier 		urk("tasign", nelem(tasign), p->code);
19287dd7cddfSDavid du Colombier 		tasign[p->code] = p->value;
19297dd7cddfSDavid du Colombier 	}
19307dd7cddfSDavid du Colombier 	for(p=tasaddinit; p->code >= 0; p++) {
19317dd7cddfSDavid du Colombier 		urk("tasadd", nelem(tasadd), p->code);
19327dd7cddfSDavid du Colombier 		tasadd[p->code] = p->value;
19337dd7cddfSDavid du Colombier 	}
19347dd7cddfSDavid du Colombier 	for(p=tcastinit; p->code >= 0; p++) {
19357dd7cddfSDavid du Colombier 		urk("tcast", nelem(tcast), p->code);
19367dd7cddfSDavid du Colombier 		tcast[p->code] = p->value;
19377dd7cddfSDavid du Colombier 	}
19387dd7cddfSDavid du Colombier 	for(p=taddinit; p->code >= 0; p++) {
19397dd7cddfSDavid du Colombier 		urk("tadd", nelem(tadd), p->code);
19407dd7cddfSDavid du Colombier 		tadd[p->code] = p->value;
19417dd7cddfSDavid du Colombier 	}
19427dd7cddfSDavid du Colombier 	for(p=tsubinit; p->code >= 0; p++) {
19437dd7cddfSDavid du Colombier 		urk("tsub", nelem(tsub), p->code);
19447dd7cddfSDavid du Colombier 		tsub[p->code] = p->value;
19457dd7cddfSDavid du Colombier 	}
19467dd7cddfSDavid du Colombier 	for(p=tmulinit; p->code >= 0; p++) {
19477dd7cddfSDavid du Colombier 		urk("tmul", nelem(tmul), p->code);
19487dd7cddfSDavid du Colombier 		tmul[p->code] = p->value;
19497dd7cddfSDavid du Colombier 	}
19507dd7cddfSDavid du Colombier 	for(p=tandinit; p->code >= 0; p++) {
19517dd7cddfSDavid du Colombier 		urk("tand", nelem(tand), p->code);
19527dd7cddfSDavid du Colombier 		tand[p->code] = p->value;
19537dd7cddfSDavid du Colombier 	}
19547dd7cddfSDavid du Colombier 	for(p=trelinit; p->code >= 0; p++) {
19557dd7cddfSDavid du Colombier 		urk("trel", nelem(trel), p->code);
19567dd7cddfSDavid du Colombier 		trel[p->code] = p->value;
19577dd7cddfSDavid du Colombier 	}
19584ac975e2SDavid du Colombier 
19594ac975e2SDavid du Colombier 	/* 32-bit defaults */
19604ac975e2SDavid du Colombier 	typeword = typechlp;
19613a276d32SDavid du Colombier 	typeswitch = typechl;
19624ac975e2SDavid du Colombier 	typecmplx = typesuv;
19637dd7cddfSDavid du Colombier }
19649a747e4fSDavid du Colombier 
19654ac975e2SDavid du Colombier /*
19664ac975e2SDavid du Colombier  * return 1 if it is impossible to jump into the middle of n.
19674ac975e2SDavid du Colombier  */
19689a747e4fSDavid du Colombier static int
deadhead(Node * n,int caseok)19699a747e4fSDavid du Colombier deadhead(Node *n, int caseok)
19709a747e4fSDavid du Colombier {
19719a747e4fSDavid du Colombier loop:
19729a747e4fSDavid du Colombier 	if(n == Z)
19739a747e4fSDavid du Colombier 		return 1;
19749a747e4fSDavid du Colombier 	switch(n->op) {
19759a747e4fSDavid du Colombier 	case OLIST:
19769a747e4fSDavid du Colombier 		if(!deadhead(n->left, caseok))
19779a747e4fSDavid du Colombier 			return 0;
19789a747e4fSDavid du Colombier 	rloop:
19799a747e4fSDavid du Colombier 		n = n->right;
19809a747e4fSDavid du Colombier 		goto loop;
19819a747e4fSDavid du Colombier 
19829a747e4fSDavid du Colombier 	case ORETURN:
19839a747e4fSDavid du Colombier 		break;
19849a747e4fSDavid du Colombier 
19859a747e4fSDavid du Colombier 	case OLABEL:
19869a747e4fSDavid du Colombier 		return 0;
19879a747e4fSDavid du Colombier 
19889a747e4fSDavid du Colombier 	case OGOTO:
19899a747e4fSDavid du Colombier 		break;
19909a747e4fSDavid du Colombier 
19919a747e4fSDavid du Colombier 	case OCASE:
19929a747e4fSDavid du Colombier 		if(!caseok)
19939a747e4fSDavid du Colombier 			return 0;
19949a747e4fSDavid du Colombier 		goto rloop;
19959a747e4fSDavid du Colombier 
19969a747e4fSDavid du Colombier 	case OSWITCH:
19979a747e4fSDavid du Colombier 		return deadhead(n->right, 1);
19989a747e4fSDavid du Colombier 
19999a747e4fSDavid du Colombier 	case OWHILE:
20009a747e4fSDavid du Colombier 	case ODWHILE:
20019a747e4fSDavid du Colombier 		goto rloop;
20029a747e4fSDavid du Colombier 
20039a747e4fSDavid du Colombier 	case OFOR:
20049a747e4fSDavid du Colombier 		goto rloop;
20059a747e4fSDavid du Colombier 
20069a747e4fSDavid du Colombier 	case OCONTINUE:
20079a747e4fSDavid du Colombier 		break;
20089a747e4fSDavid du Colombier 
20099a747e4fSDavid du Colombier 	case OBREAK:
20109a747e4fSDavid du Colombier 		break;
20119a747e4fSDavid du Colombier 
20129a747e4fSDavid du Colombier 	case OIF:
20139a747e4fSDavid du Colombier 		return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
20149a747e4fSDavid du Colombier 
20159a747e4fSDavid du Colombier 	case OSET:
20169a747e4fSDavid du Colombier 	case OUSED:
20179a747e4fSDavid du Colombier 		break;
20189a747e4fSDavid du Colombier 	}
20199a747e4fSDavid du Colombier 	return 1;
20209a747e4fSDavid du Colombier }
20219a747e4fSDavid du Colombier 
20229a747e4fSDavid du Colombier int
deadheads(Node * c)20239a747e4fSDavid du Colombier deadheads(Node *c)
20249a747e4fSDavid du Colombier {
20259a747e4fSDavid du Colombier 	return deadhead(c->left, 0) && deadhead(c->right, 0);
20269a747e4fSDavid du Colombier }
2027ce941d97SDavid du Colombier 
2028ce941d97SDavid du Colombier int
mixedasop(Type * l,Type * r)2029ce941d97SDavid du Colombier mixedasop(Type *l, Type *r)
2030ce941d97SDavid du Colombier {
2031ce941d97SDavid du Colombier 	return !typefd[l->etype] && typefd[r->etype];
2032ce941d97SDavid du Colombier }
2033