xref: /plan9/sys/src/cmd/cc/sub.c (revision 4ac975e2e38b792d24bc60de7fce5e6173f046ea)
13e12c5d1SDavid du Colombier #include	"cc.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier Node*
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;
123e12c5d1SDavid du Colombier 	n->lineno = lineno;
133e12c5d1SDavid du Colombier 	newflag = 1;
143e12c5d1SDavid du Colombier 	return n;
153e12c5d1SDavid du Colombier }
163e12c5d1SDavid du Colombier 
173e12c5d1SDavid du Colombier Node*
183e12c5d1SDavid du Colombier new1(int o, Node *l, Node *r)
193e12c5d1SDavid du Colombier {
203e12c5d1SDavid du Colombier 	Node *n;
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier 	n = new(o, l, r);
233e12c5d1SDavid du Colombier 	n->lineno = nearln;
243e12c5d1SDavid du Colombier 	return n;
253e12c5d1SDavid du Colombier }
263e12c5d1SDavid du Colombier 
273e12c5d1SDavid du Colombier void
283e12c5d1SDavid du Colombier prtree(Node *n, char *s)
293e12c5d1SDavid du Colombier {
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier 	print(" == %s ==\n", s);
323e12c5d1SDavid du Colombier 	prtree1(n, 0, 0);
333e12c5d1SDavid du Colombier 	print("\n");
343e12c5d1SDavid du Colombier }
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier void
373e12c5d1SDavid du Colombier prtree1(Node *n, int d, int f)
383e12c5d1SDavid du Colombier {
393e12c5d1SDavid du Colombier 	int i;
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier 	if(f)
423e12c5d1SDavid du Colombier 	for(i=0; i<d; i++)
433e12c5d1SDavid du Colombier 		print("   ");
443e12c5d1SDavid du Colombier 	if(n == Z) {
453e12c5d1SDavid du Colombier 		print("Z\n");
463e12c5d1SDavid du Colombier 		return;
473e12c5d1SDavid du Colombier 	}
483e12c5d1SDavid du Colombier 	if(n->op == OLIST) {
493e12c5d1SDavid du Colombier 		prtree1(n->left, d, 0);
503e12c5d1SDavid du Colombier 		prtree1(n->right, d, 1);
513e12c5d1SDavid du Colombier 		return;
523e12c5d1SDavid du Colombier 	}
533e12c5d1SDavid du Colombier 	d++;
543e12c5d1SDavid du Colombier 	print("%O", n->op);
553e12c5d1SDavid du Colombier 	i = 3;
563e12c5d1SDavid du Colombier 	switch(n->op)
573e12c5d1SDavid du Colombier 	{
583e12c5d1SDavid du Colombier 	case ONAME:
59219b2ee8SDavid du Colombier 		print(" \"%F\"", n);
60219b2ee8SDavid du Colombier 		print(" %ld", n->xoffset);
613e12c5d1SDavid du Colombier 		i = 0;
623e12c5d1SDavid du Colombier 		break;
633e12c5d1SDavid du Colombier 
643e12c5d1SDavid du Colombier 	case OINDREG:
65219b2ee8SDavid du Colombier 		print(" %ld(R%d)", n->xoffset, n->reg);
663e12c5d1SDavid du Colombier 		i = 0;
673e12c5d1SDavid du Colombier 		break;
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier 	case OREGISTER:
70219b2ee8SDavid du Colombier 		if(n->xoffset)
71219b2ee8SDavid du Colombier 			print(" %ld+R%d", n->xoffset, n->reg);
723e12c5d1SDavid du Colombier 		else
733e12c5d1SDavid du Colombier 			print(" R%d", n->reg);
743e12c5d1SDavid du Colombier 		i = 0;
753e12c5d1SDavid du Colombier 		break;
763e12c5d1SDavid du Colombier 
773e12c5d1SDavid du Colombier 	case OSTRING:
78219b2ee8SDavid du Colombier 		print(" \"%s\"", n->cstring);
793e12c5d1SDavid du Colombier 		i = 0;
803e12c5d1SDavid du Colombier 		break;
813e12c5d1SDavid du Colombier 
823e12c5d1SDavid du Colombier 	case OLSTRING:
83219b2ee8SDavid du Colombier 		print(" \"%S\"", n->rstring);
843e12c5d1SDavid du Colombier 		i = 0;
853e12c5d1SDavid du Colombier 		break;
863e12c5d1SDavid du Colombier 
873e12c5d1SDavid du Colombier 	case ODOT:
88219b2ee8SDavid du Colombier 	case OELEM:
89219b2ee8SDavid du Colombier 		print(" \"%F\"", n);
903e12c5d1SDavid du Colombier 		break;
913e12c5d1SDavid du Colombier 
923e12c5d1SDavid du Colombier 	case OCONST:
93219b2ee8SDavid du Colombier 		if(typefd[n->type->etype])
94219b2ee8SDavid du Colombier 			print(" \"%.8e\"", n->fconst);
953e12c5d1SDavid du Colombier 		else
96219b2ee8SDavid du Colombier 			print(" \"%lld\"", n->vconst);
973e12c5d1SDavid du Colombier 		i = 0;
983e12c5d1SDavid du Colombier 		break;
993e12c5d1SDavid du Colombier 	}
1003e12c5d1SDavid du Colombier 	if(n->addable != 0)
1013e12c5d1SDavid du Colombier 		print(" <%d>", n->addable);
1023e12c5d1SDavid du Colombier 	if(n->type != T)
1033e12c5d1SDavid du Colombier 		print(" %T", n->type);
1043e12c5d1SDavid du Colombier 	if(n->complex != 0)
1053e12c5d1SDavid du Colombier 		print(" (%d)", n->complex);
1063e12c5d1SDavid du Colombier 	print("\n");
1073e12c5d1SDavid du Colombier 	if(i & 2)
1083e12c5d1SDavid du Colombier 		prtree1(n->left, d, 1);
1093e12c5d1SDavid du Colombier 	if(i & 1)
1103e12c5d1SDavid du Colombier 		prtree1(n->right, d, 1);
1113e12c5d1SDavid du Colombier }
1123e12c5d1SDavid du Colombier 
1133e12c5d1SDavid du Colombier Type*
1143e12c5d1SDavid du Colombier typ(int et, Type *d)
1153e12c5d1SDavid du Colombier {
1163e12c5d1SDavid du Colombier 	Type *t;
1173e12c5d1SDavid du Colombier 
1187dd7cddfSDavid du Colombier 	t = alloc(sizeof(*t));
1193e12c5d1SDavid du Colombier 	t->etype = et;
1203e12c5d1SDavid du Colombier 	t->link = d;
1213e12c5d1SDavid du Colombier 	t->down = T;
1223e12c5d1SDavid du Colombier 	t->sym = S;
1233e12c5d1SDavid du Colombier 	t->width = ewidth[et];
1243e12c5d1SDavid du Colombier 	t->offset = 0;
1253e12c5d1SDavid du Colombier 	t->shift = 0;
1263e12c5d1SDavid du Colombier 	t->nbits = 0;
1277dd7cddfSDavid du Colombier 	t->garb = 0;
1283e12c5d1SDavid du Colombier 	return t;
1293e12c5d1SDavid du Colombier }
1303e12c5d1SDavid du Colombier 
1317dd7cddfSDavid du Colombier Type*
13280ee5cbfSDavid du Colombier copytyp(Type *t)
13380ee5cbfSDavid du Colombier {
13480ee5cbfSDavid du Colombier 	Type *nt;
13580ee5cbfSDavid du Colombier 
13680ee5cbfSDavid du Colombier 	nt = typ(TXXX, T);
13780ee5cbfSDavid du Colombier 	*nt = *t;
13880ee5cbfSDavid du Colombier 	return nt;
13980ee5cbfSDavid du Colombier }
14080ee5cbfSDavid du Colombier 
14180ee5cbfSDavid du Colombier Type*
1427dd7cddfSDavid du Colombier garbt(Type *t, long b)
1437dd7cddfSDavid du Colombier {
1447dd7cddfSDavid du Colombier 	Type *t1;
1457dd7cddfSDavid du Colombier 
1467dd7cddfSDavid du Colombier 	if(b & BGARB) {
14780ee5cbfSDavid du Colombier 		t1 = copytyp(t);
1487dd7cddfSDavid du Colombier 		t1->garb = simpleg(b);
1497dd7cddfSDavid du Colombier 		return t1;
1507dd7cddfSDavid du Colombier 	}
1517dd7cddfSDavid du Colombier 	return t;
1527dd7cddfSDavid du Colombier }
1537dd7cddfSDavid du Colombier 
1547dd7cddfSDavid du Colombier int
1557dd7cddfSDavid du Colombier simpleg(long b)
1567dd7cddfSDavid du Colombier {
1577dd7cddfSDavid du Colombier 
1587dd7cddfSDavid du Colombier 	b &= BGARB;
1597dd7cddfSDavid du Colombier 	switch(b) {
1607dd7cddfSDavid du Colombier 	case BCONSTNT:
1617dd7cddfSDavid du Colombier 		return GCONSTNT;
1627dd7cddfSDavid du Colombier 	case BVOLATILE:
1637dd7cddfSDavid du Colombier 		return GVOLATILE;
1647dd7cddfSDavid du Colombier 	case BVOLATILE|BCONSTNT:
1657dd7cddfSDavid du Colombier 		return GCONSTNT|GVOLATILE;
1667dd7cddfSDavid du Colombier 	}
1677dd7cddfSDavid du Colombier 	return GXXX;
1687dd7cddfSDavid du Colombier }
1697dd7cddfSDavid du Colombier 
1703e12c5d1SDavid du Colombier int
1713e12c5d1SDavid du Colombier simplec(long b)
1723e12c5d1SDavid du Colombier {
1733e12c5d1SDavid du Colombier 
1743e12c5d1SDavid du Colombier 	b &= BCLASS;
1753e12c5d1SDavid du Colombier 	switch(b) {
1763e12c5d1SDavid du Colombier 	case 0:
1773e12c5d1SDavid du Colombier 	case BREGISTER:
1783e12c5d1SDavid du Colombier 		return CXXX;
1793e12c5d1SDavid du Colombier 	case BAUTO:
1803e12c5d1SDavid du Colombier 	case BAUTO|BREGISTER:
1813e12c5d1SDavid du Colombier 		return CAUTO;
1823e12c5d1SDavid du Colombier 	case BEXTERN:
1833e12c5d1SDavid du Colombier 		return CEXTERN;
1843e12c5d1SDavid du Colombier 	case BEXTERN|BREGISTER:
1853e12c5d1SDavid du Colombier 		return CEXREG;
1863e12c5d1SDavid du Colombier 	case BSTATIC:
1873e12c5d1SDavid du Colombier 		return CSTATIC;
1883e12c5d1SDavid du Colombier 	case BTYPEDEF:
1893e12c5d1SDavid du Colombier 		return CTYPEDEF;
19080ee5cbfSDavid du Colombier 	case BTYPESTR:
19180ee5cbfSDavid du Colombier 		return CTYPESTR;
1923e12c5d1SDavid du Colombier 	}
1933e12c5d1SDavid du Colombier 	diag(Z, "illegal combination of classes %Q", b);
1943e12c5d1SDavid du Colombier 	return CXXX;
1953e12c5d1SDavid du Colombier }
1963e12c5d1SDavid du Colombier 
1973e12c5d1SDavid du Colombier Type*
1983e12c5d1SDavid du Colombier simplet(long b)
1993e12c5d1SDavid du Colombier {
2003e12c5d1SDavid du Colombier 
2017dd7cddfSDavid du Colombier 	b &= ~BCLASS & ~BGARB;
2023e12c5d1SDavid du Colombier 	switch(b) {
2033e12c5d1SDavid du Colombier 	case BCHAR:
2043e12c5d1SDavid du Colombier 	case BCHAR|BSIGNED:
2053e12c5d1SDavid du Colombier 		return types[TCHAR];
2063e12c5d1SDavid du Colombier 
2073e12c5d1SDavid du Colombier 	case BCHAR|BUNSIGNED:
2083e12c5d1SDavid du Colombier 		return types[TUCHAR];
2093e12c5d1SDavid du Colombier 
2103e12c5d1SDavid du Colombier 	case BSHORT:
2113e12c5d1SDavid du Colombier 	case BSHORT|BINT:
2123e12c5d1SDavid du Colombier 	case BSHORT|BSIGNED:
2133e12c5d1SDavid du Colombier 	case BSHORT|BINT|BSIGNED:
2143e12c5d1SDavid du Colombier 		return types[TSHORT];
2153e12c5d1SDavid du Colombier 
2163e12c5d1SDavid du Colombier 	case BUNSIGNED|BSHORT:
2173e12c5d1SDavid du Colombier 	case BUNSIGNED|BSHORT|BINT:
2183e12c5d1SDavid du Colombier 		return types[TUSHORT];
2193e12c5d1SDavid du Colombier 
2203e12c5d1SDavid du Colombier 	case 0:
2213e12c5d1SDavid du Colombier 	case BINT:
2223e12c5d1SDavid du Colombier 	case BINT|BSIGNED:
2233e12c5d1SDavid du Colombier 	case BSIGNED:
2247dd7cddfSDavid du Colombier 		return types[TINT];
2253e12c5d1SDavid du Colombier 
2263e12c5d1SDavid du Colombier 	case BUNSIGNED:
2273e12c5d1SDavid du Colombier 	case BUNSIGNED|BINT:
2287dd7cddfSDavid du Colombier 		return types[TUINT];
2293e12c5d1SDavid du Colombier 
2303e12c5d1SDavid du Colombier 	case BLONG:
2313e12c5d1SDavid du Colombier 	case BLONG|BINT:
2323e12c5d1SDavid du Colombier 	case BLONG|BSIGNED:
2333e12c5d1SDavid du Colombier 	case BLONG|BINT|BSIGNED:
2343e12c5d1SDavid du Colombier 		return types[TLONG];
2353e12c5d1SDavid du Colombier 
2363e12c5d1SDavid du Colombier 	case BUNSIGNED|BLONG:
2373e12c5d1SDavid du Colombier 	case BUNSIGNED|BLONG|BINT:
2383e12c5d1SDavid du Colombier 		return types[TULONG];
2393e12c5d1SDavid du Colombier 
2403e12c5d1SDavid du Colombier 	case BVLONG|BLONG:
2413e12c5d1SDavid du Colombier 	case BVLONG|BLONG|BINT:
2423e12c5d1SDavid du Colombier 	case BVLONG|BLONG|BSIGNED:
2433e12c5d1SDavid du Colombier 	case BVLONG|BLONG|BINT|BSIGNED:
2443e12c5d1SDavid du Colombier 		return types[TVLONG];
2453e12c5d1SDavid du Colombier 
246219b2ee8SDavid du Colombier 	case BVLONG|BLONG|BUNSIGNED:
247219b2ee8SDavid du Colombier 	case BVLONG|BLONG|BINT|BUNSIGNED:
248219b2ee8SDavid du Colombier 		return types[TUVLONG];
249219b2ee8SDavid du Colombier 
2503e12c5d1SDavid du Colombier 	case BFLOAT:
2513e12c5d1SDavid du Colombier 		return types[TFLOAT];
2523e12c5d1SDavid du Colombier 
2533e12c5d1SDavid du Colombier 	case BDOUBLE:
2543e12c5d1SDavid du Colombier 	case BDOUBLE|BLONG:
2553e12c5d1SDavid du Colombier 	case BFLOAT|BLONG:
2563e12c5d1SDavid du Colombier 		return types[TDOUBLE];
2573e12c5d1SDavid du Colombier 
2583e12c5d1SDavid du Colombier 	case BVOID:
2593e12c5d1SDavid du Colombier 		return types[TVOID];
2603e12c5d1SDavid du Colombier 	}
2613e12c5d1SDavid du Colombier 
2623e12c5d1SDavid du Colombier 	diag(Z, "illegal combination of types %Q", b);
2637dd7cddfSDavid du Colombier 	return types[TINT];
2643e12c5d1SDavid du Colombier }
2653e12c5d1SDavid du Colombier 
2663e12c5d1SDavid du Colombier int
2673e12c5d1SDavid du Colombier stcompat(Node *n, Type *t1, Type *t2, long ttab[])
2683e12c5d1SDavid du Colombier {
2697dd7cddfSDavid du Colombier 	int i;
2707dd7cddfSDavid du Colombier 	ulong b;
2713e12c5d1SDavid du Colombier 
2723e12c5d1SDavid du Colombier 	i = 0;
2733e12c5d1SDavid du Colombier 	if(t2 != T)
2743e12c5d1SDavid du Colombier 		i = t2->etype;
2753e12c5d1SDavid du Colombier 	b = 1L << i;
2763e12c5d1SDavid du Colombier 	i = 0;
2773e12c5d1SDavid du Colombier 	if(t1 != T)
2783e12c5d1SDavid du Colombier 		i = t1->etype;
2793e12c5d1SDavid du Colombier 	if(b & ttab[i]) {
2803e12c5d1SDavid du Colombier 		if(ttab == tasign)
2813e12c5d1SDavid du Colombier 			if(b == BSTRUCT || b == BUNION)
2823e12c5d1SDavid du Colombier 				if(!sametype(t1, t2))
2833e12c5d1SDavid du Colombier 					return 1;
2843e12c5d1SDavid du Colombier 		if(n->op != OCAST)
2853e12c5d1SDavid du Colombier 		 	if(b == BIND && i == TIND)
2863e12c5d1SDavid du Colombier 				if(!sametype(t1, t2))
2873e12c5d1SDavid du Colombier 					return 1;
2883e12c5d1SDavid du Colombier 		return 0;
2893e12c5d1SDavid du Colombier 	}
2903e12c5d1SDavid du Colombier 	return 1;
2913e12c5d1SDavid du Colombier }
2923e12c5d1SDavid du Colombier 
2933e12c5d1SDavid du Colombier int
2943e12c5d1SDavid du Colombier tcompat(Node *n, Type *t1, Type *t2, long ttab[])
2953e12c5d1SDavid du Colombier {
2963e12c5d1SDavid du Colombier 
2973e12c5d1SDavid du Colombier 	if(stcompat(n, t1, t2, ttab)) {
2983e12c5d1SDavid du Colombier 		if(t1 == T)
2993e12c5d1SDavid du Colombier 			diag(n, "incompatible type: \"%T\" for op \"%O\"",
3003e12c5d1SDavid du Colombier 				t2, n->op);
3013e12c5d1SDavid du Colombier 		else
3023e12c5d1SDavid du Colombier 			diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
3033e12c5d1SDavid du Colombier 				t1, t2, n->op);
3043e12c5d1SDavid du Colombier 		return 1;
3053e12c5d1SDavid du Colombier 	}
3063e12c5d1SDavid du Colombier 	return 0;
3073e12c5d1SDavid du Colombier }
3083e12c5d1SDavid du Colombier 
3093e12c5d1SDavid du Colombier void
3103e12c5d1SDavid du Colombier makedot(Node *n, Type *t, long o)
3113e12c5d1SDavid du Colombier {
3123e12c5d1SDavid du Colombier 	Node *n1, *n2;
3133e12c5d1SDavid du Colombier 
3143e12c5d1SDavid du Colombier 	if(t->nbits) {
3153e12c5d1SDavid du Colombier 		n1 = new(OXXX, Z, Z);
3163e12c5d1SDavid du Colombier 		*n1 = *n;
3173e12c5d1SDavid du Colombier 		n->op = OBIT;
3183e12c5d1SDavid du Colombier 		n->left = n1;
3193e12c5d1SDavid du Colombier 		n->right = Z;
3203e12c5d1SDavid du Colombier 		n->type = t;
3213e12c5d1SDavid du Colombier 		n->addable = n1->left->addable;
3223e12c5d1SDavid du Colombier 		n = n1;
3233e12c5d1SDavid du Colombier 	}
3243e12c5d1SDavid du Colombier 	n->addable = n->left->addable;
3253e12c5d1SDavid du Colombier 	if(n->addable == 0) {
3263e12c5d1SDavid du Colombier 		n1 = new1(OCONST, Z, Z);
327219b2ee8SDavid du Colombier 		n1->vconst = o;
3283e12c5d1SDavid du Colombier 		n1->type = types[TLONG];
3293e12c5d1SDavid du Colombier 		n->right = n1;
3303e12c5d1SDavid du Colombier 		n->type = t;
3313e12c5d1SDavid du Colombier 		return;
3323e12c5d1SDavid du Colombier 	}
3333e12c5d1SDavid du Colombier 	n->left->type = t;
3343e12c5d1SDavid du Colombier 	if(o == 0) {
3353e12c5d1SDavid du Colombier 		*n = *n->left;
3363e12c5d1SDavid du Colombier 		return;
3373e12c5d1SDavid du Colombier 	}
3383e12c5d1SDavid du Colombier 	n->type = t;
3393e12c5d1SDavid du Colombier 	n1 = new1(OCONST, Z, Z);
340219b2ee8SDavid du Colombier 	n1->vconst = o;
3413e12c5d1SDavid du Colombier 	t = typ(TIND, t);
3423e12c5d1SDavid du Colombier 	t->width = types[TIND]->width;
3433e12c5d1SDavid du Colombier 	n1->type = t;
3443e12c5d1SDavid du Colombier 
3453e12c5d1SDavid du Colombier 	n2 = new1(OADDR, n->left, Z);
3463e12c5d1SDavid du Colombier 	n2->type = t;
3473e12c5d1SDavid du Colombier 
3483e12c5d1SDavid du Colombier 	n1 = new1(OADD, n1, n2);
3493e12c5d1SDavid du Colombier 	n1->type = t;
3503e12c5d1SDavid du Colombier 
3513e12c5d1SDavid du Colombier 	n->op = OIND;
3523e12c5d1SDavid du Colombier 	n->left = n1;
3533e12c5d1SDavid du Colombier 	n->right = Z;
3543e12c5d1SDavid du Colombier }
3553e12c5d1SDavid du Colombier 
3563e12c5d1SDavid du Colombier Type*
35780ee5cbfSDavid du Colombier dotsearch(Sym *s, Type *t, Node *n, long *off)
3583e12c5d1SDavid du Colombier {
35980ee5cbfSDavid du Colombier 	Type *t1, *xt, *rt;
3603e12c5d1SDavid du Colombier 
3613e12c5d1SDavid du Colombier 	xt = T;
3623e12c5d1SDavid du Colombier 
3633e12c5d1SDavid du Colombier 	/*
3643e12c5d1SDavid du Colombier 	 * look it up by name
3653e12c5d1SDavid du Colombier 	 */
3663e12c5d1SDavid du Colombier 	for(t1 = t; t1 != T; t1 = t1->down)
3673e12c5d1SDavid du Colombier 		if(t1->sym == s) {
3683e12c5d1SDavid du Colombier 			if(xt != T)
3693e12c5d1SDavid du Colombier 				goto ambig;
3703e12c5d1SDavid du Colombier 			xt = t1;
3713e12c5d1SDavid du Colombier 		}
3723e12c5d1SDavid du Colombier 
3733e12c5d1SDavid du Colombier 	/*
3743e12c5d1SDavid du Colombier 	 * look it up by type
3753e12c5d1SDavid du Colombier 	 */
37680ee5cbfSDavid du Colombier 	if(s->class == CTYPEDEF || s->class == CTYPESTR)
3773e12c5d1SDavid du Colombier 		for(t1 = t; t1 != T; t1 = t1->down)
3783e12c5d1SDavid du Colombier 			if(t1->sym == S && typesu[t1->etype])
3793e12c5d1SDavid du Colombier 				if(sametype(s->type, t1)) {
3803e12c5d1SDavid du Colombier 					if(xt != T)
3813e12c5d1SDavid du Colombier 						goto ambig;
3823e12c5d1SDavid du Colombier 					xt = t1;
3833e12c5d1SDavid du Colombier 				}
38480ee5cbfSDavid du Colombier 	if(xt != T) {
38580ee5cbfSDavid du Colombier 		*off = xt->offset;
3863e12c5d1SDavid du Colombier 		return xt;
38780ee5cbfSDavid du Colombier 	}
3883e12c5d1SDavid du Colombier 
3893e12c5d1SDavid du Colombier 	/*
3903e12c5d1SDavid du Colombier 	 * look it up in unnamed substructures
3913e12c5d1SDavid du Colombier 	 */
3923e12c5d1SDavid du Colombier 	for(t1 = t; t1 != T; t1 = t1->down)
39380ee5cbfSDavid du Colombier 		if(t1->sym == S && typesu[t1->etype]){
39480ee5cbfSDavid du Colombier 			rt = dotsearch(s, t1->link, n, off);
39580ee5cbfSDavid du Colombier 			if(rt != T) {
3963e12c5d1SDavid du Colombier 				if(xt != T)
3973e12c5d1SDavid du Colombier 					goto ambig;
39880ee5cbfSDavid du Colombier 				xt = rt;
39980ee5cbfSDavid du Colombier 				*off += t1->offset;
40080ee5cbfSDavid du Colombier 			}
4013e12c5d1SDavid du Colombier 		}
4023e12c5d1SDavid du Colombier 	return xt;
4033e12c5d1SDavid du Colombier 
4043e12c5d1SDavid du Colombier ambig:
4053e12c5d1SDavid du Colombier 	diag(n, "ambiguous structure element: %s", s->name);
4063e12c5d1SDavid du Colombier 	return xt;
4073e12c5d1SDavid du Colombier }
4083e12c5d1SDavid du Colombier 
4093e12c5d1SDavid du Colombier long
4103e12c5d1SDavid du Colombier dotoffset(Type *st, Type *lt, Node *n)
4113e12c5d1SDavid du Colombier {
4123e12c5d1SDavid du Colombier 	Type *t;
4133e12c5d1SDavid du Colombier 	Sym *g;
4143e12c5d1SDavid du Colombier 	long o, o1;
4153e12c5d1SDavid du Colombier 
4163e12c5d1SDavid du Colombier 	o = -1;
4173e12c5d1SDavid du Colombier 	/*
4183e12c5d1SDavid du Colombier 	 * first try matching at the top level
4193e12c5d1SDavid du Colombier 	 * for matching tag names
4203e12c5d1SDavid du Colombier 	 */
4213e12c5d1SDavid du Colombier 	g = st->tag;
4223e12c5d1SDavid du Colombier 	if(g != S)
4233e12c5d1SDavid du Colombier 		for(t=lt->link; t!=T; t=t->down)
4243e12c5d1SDavid du Colombier 			if(t->sym == S)
4253e12c5d1SDavid du Colombier 				if(g == t->tag) {
4263e12c5d1SDavid du Colombier 					if(o >= 0)
4273e12c5d1SDavid du Colombier 						goto ambig;
4283e12c5d1SDavid du Colombier 					o = t->offset;
4293e12c5d1SDavid du Colombier 				}
4303e12c5d1SDavid du Colombier 	if(o >= 0)
4313e12c5d1SDavid du Colombier 		return o;
4323e12c5d1SDavid du Colombier 
4333e12c5d1SDavid du Colombier 	/*
4343e12c5d1SDavid du Colombier 	 * second try matching at the top level
4353e12c5d1SDavid du Colombier 	 * for similar types
4363e12c5d1SDavid du Colombier 	 */
4373e12c5d1SDavid du Colombier 	for(t=lt->link; t!=T; t=t->down)
4383e12c5d1SDavid du Colombier 		if(t->sym == S)
4393e12c5d1SDavid du Colombier 			if(sametype(st, t)) {
4403e12c5d1SDavid du Colombier 				if(o >= 0)
4413e12c5d1SDavid du Colombier 					goto ambig;
4423e12c5d1SDavid du Colombier 				o = t->offset;
4433e12c5d1SDavid du Colombier 			}
4443e12c5d1SDavid du Colombier 	if(o >= 0)
4453e12c5d1SDavid du Colombier 		return o;
4463e12c5d1SDavid du Colombier 
4473e12c5d1SDavid du Colombier 	/*
4483e12c5d1SDavid du Colombier 	 * last try matching sub-levels
4493e12c5d1SDavid du Colombier 	 */
4503e12c5d1SDavid du Colombier 	for(t=lt->link; t!=T; t=t->down)
4513e12c5d1SDavid du Colombier 		if(t->sym == S)
4523e12c5d1SDavid du Colombier 		if(typesu[t->etype]) {
4533e12c5d1SDavid du Colombier 			o1 = dotoffset(st, t, n);
4543e12c5d1SDavid du Colombier 			if(o1 >= 0) {
4553e12c5d1SDavid du Colombier 				if(o >= 0)
4563e12c5d1SDavid du Colombier 					goto ambig;
4573e12c5d1SDavid du Colombier 				o = o1 + t->offset;
4583e12c5d1SDavid du Colombier 			}
4593e12c5d1SDavid du Colombier 		}
4603e12c5d1SDavid du Colombier 	return o;
4613e12c5d1SDavid du Colombier 
4623e12c5d1SDavid du Colombier ambig:
4633e12c5d1SDavid du Colombier 	diag(n, "ambiguous unnamed structure element");
4643e12c5d1SDavid du Colombier 	return o;
4653e12c5d1SDavid du Colombier }
4663e12c5d1SDavid du Colombier 
467219b2ee8SDavid du Colombier /*
468219b2ee8SDavid du Colombier  * look into tree for floating point constant expressions
469219b2ee8SDavid du Colombier  */
470219b2ee8SDavid du Colombier int
471219b2ee8SDavid du Colombier allfloat(Node *n, int flag)
472219b2ee8SDavid du Colombier {
473219b2ee8SDavid du Colombier 
474219b2ee8SDavid du Colombier 	if(n != Z) {
475219b2ee8SDavid du Colombier 		if(n->type->etype != TDOUBLE)
476219b2ee8SDavid du Colombier 			return 1;
477219b2ee8SDavid du Colombier 		switch(n->op) {
478219b2ee8SDavid du Colombier 		case OCONST:
479219b2ee8SDavid du Colombier 			if(flag)
480219b2ee8SDavid du Colombier 				n->type = types[TFLOAT];
481219b2ee8SDavid du Colombier 			return 1;
482219b2ee8SDavid du Colombier 		case OADD:	/* no need to get more exotic than this */
483219b2ee8SDavid du Colombier 		case OSUB:
484219b2ee8SDavid du Colombier 		case OMUL:
485219b2ee8SDavid du Colombier 		case ODIV:
486219b2ee8SDavid du Colombier 			if(!allfloat(n->right, flag))
487219b2ee8SDavid du Colombier 				break;
488219b2ee8SDavid du Colombier 		case OCAST:
489219b2ee8SDavid du Colombier 			if(!allfloat(n->left, flag))
490219b2ee8SDavid du Colombier 				break;
491219b2ee8SDavid du Colombier 			if(flag)
492219b2ee8SDavid du Colombier 				n->type = types[TFLOAT];
493219b2ee8SDavid du Colombier 			return 1;
494219b2ee8SDavid du Colombier 		}
495219b2ee8SDavid du Colombier 	}
496219b2ee8SDavid du Colombier 	return 0;
497219b2ee8SDavid du Colombier }
498219b2ee8SDavid du Colombier 
499219b2ee8SDavid du Colombier void
5007dd7cddfSDavid du Colombier constas(Node *n, Type *il, Type *ir)
5017dd7cddfSDavid du Colombier {
5027dd7cddfSDavid du Colombier 	Type *l, *r;
5037dd7cddfSDavid du Colombier 
5047dd7cddfSDavid du Colombier 	l = il;
5057dd7cddfSDavid du Colombier 	r = ir;
5067dd7cddfSDavid du Colombier 
5077dd7cddfSDavid du Colombier 	if(l == T)
5087dd7cddfSDavid du Colombier 		return;
5097dd7cddfSDavid du Colombier 	if(l->garb & GCONSTNT) {
5107dd7cddfSDavid du Colombier 		warn(n, "assignment to a constant type (%T)", il);
5117dd7cddfSDavid du Colombier 		return;
5127dd7cddfSDavid du Colombier 	}
5137dd7cddfSDavid du Colombier 	if(r == T)
5147dd7cddfSDavid du Colombier 		return;
5157dd7cddfSDavid du Colombier 	for(;;) {
5167dd7cddfSDavid du Colombier 		if(l->etype != TIND || r->etype != TIND)
5177dd7cddfSDavid du Colombier 			break;
5187dd7cddfSDavid du Colombier 		l = l->link;
5197dd7cddfSDavid du Colombier 		r = r->link;
5207dd7cddfSDavid du Colombier 		if(l == T || r == T)
5217dd7cddfSDavid du Colombier 			break;
5227dd7cddfSDavid du Colombier 		if(r->garb & GCONSTNT)
5237dd7cddfSDavid du Colombier 			if(!(l->garb & GCONSTNT)) {
5247dd7cddfSDavid du Colombier 				warn(n, "assignment of a constant pointer type (%T)", ir);
5257dd7cddfSDavid du Colombier 				break;
5267dd7cddfSDavid du Colombier 			}
5277dd7cddfSDavid du Colombier 	}
5287dd7cddfSDavid du Colombier }
5297dd7cddfSDavid du Colombier 
5307dd7cddfSDavid du Colombier void
531219b2ee8SDavid du Colombier typeext1(Type *st, Node *l)
532219b2ee8SDavid du Colombier {
533219b2ee8SDavid du Colombier 	if(st->etype == TFLOAT && allfloat(l, 0))
534219b2ee8SDavid du Colombier 		allfloat(l, 1);
535219b2ee8SDavid du Colombier }
536219b2ee8SDavid du Colombier 
5373e12c5d1SDavid du Colombier void
5383e12c5d1SDavid du Colombier typeext(Type *st, Node *l)
5393e12c5d1SDavid du Colombier {
5403e12c5d1SDavid du Colombier 	Type *lt;
5413e12c5d1SDavid du Colombier 	Node *n1, *n2;
5423e12c5d1SDavid du Colombier 	long o;
5433e12c5d1SDavid du Colombier 
5443e12c5d1SDavid du Colombier 	lt = l->type;
5453e12c5d1SDavid du Colombier 	if(lt == T)
5463e12c5d1SDavid du Colombier 		return;
5473e12c5d1SDavid du Colombier 	if(st->etype == TIND && vconst(l) == 0) {
5483e12c5d1SDavid du Colombier 		l->type = st;
549219b2ee8SDavid du Colombier 		l->vconst = 0;
5503e12c5d1SDavid du Colombier 		return;
5513e12c5d1SDavid du Colombier 	}
552219b2ee8SDavid du Colombier 	typeext1(st, l);
5533e12c5d1SDavid du Colombier 
5543e12c5d1SDavid du Colombier 	/*
5553e12c5d1SDavid du Colombier 	 * extension of C
5563e12c5d1SDavid du Colombier 	 * if assign of struct containing unnamed sub-struct
5573e12c5d1SDavid du Colombier 	 * to type of sub-struct, insert the DOT.
5583e12c5d1SDavid du Colombier 	 * if assign of *struct containing unnamed substruct
5593e12c5d1SDavid du Colombier 	 * to type of *sub-struct, insert the add-offset
5603e12c5d1SDavid du Colombier 	 */
5613e12c5d1SDavid du Colombier 	if(typesu[st->etype] && typesu[lt->etype]) {
5623e12c5d1SDavid du Colombier 		o = dotoffset(st, lt, l);
5633e12c5d1SDavid du Colombier 		if(o >= 0) {
5643e12c5d1SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
5653e12c5d1SDavid du Colombier 			*n1 = *l;
5663e12c5d1SDavid du Colombier 			l->op = ODOT;
5673e12c5d1SDavid du Colombier 			l->left = n1;
5683e12c5d1SDavid du Colombier 			l->right = Z;
5693e12c5d1SDavid du Colombier 			makedot(l, st, o);
5703e12c5d1SDavid du Colombier 		}
5713e12c5d1SDavid du Colombier 		return;
5723e12c5d1SDavid du Colombier 	}
5733e12c5d1SDavid du Colombier 	if(st->etype == TIND && typesu[st->link->etype])
5743e12c5d1SDavid du Colombier 	if(lt->etype == TIND && typesu[lt->link->etype]) {
5753e12c5d1SDavid du Colombier 		o = dotoffset(st->link, lt->link, l);
5763e12c5d1SDavid du Colombier 		if(o >= 0) {
5773e12c5d1SDavid du Colombier 			l->type = st;
5783e12c5d1SDavid du Colombier 			if(o == 0)
5793e12c5d1SDavid du Colombier 				return;
5803e12c5d1SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
5813e12c5d1SDavid du Colombier 			*n1 = *l;
5823e12c5d1SDavid du Colombier 			n2 = new1(OCONST, Z, Z);
583219b2ee8SDavid du Colombier 			n2->vconst = o;
5843e12c5d1SDavid du Colombier 			n2->type = st;
5853e12c5d1SDavid du Colombier 			l->op = OADD;
5863e12c5d1SDavid du Colombier 			l->left = n1;
5873e12c5d1SDavid du Colombier 			l->right = n2;
5883e12c5d1SDavid du Colombier 		}
5893e12c5d1SDavid du Colombier 		return;
5903e12c5d1SDavid du Colombier 	}
5913e12c5d1SDavid du Colombier }
5923e12c5d1SDavid du Colombier 
5933e12c5d1SDavid du Colombier /*
5943e12c5d1SDavid du Colombier  * a cast that generates no code
5953e12c5d1SDavid du Colombier  * (same size move)
5963e12c5d1SDavid du Colombier  */
5973e12c5d1SDavid du Colombier int
5983e12c5d1SDavid du Colombier nocast(Type *t1, Type *t2)
5993e12c5d1SDavid du Colombier {
6003e12c5d1SDavid du Colombier 	int i, b;
6013e12c5d1SDavid du Colombier 
6023e12c5d1SDavid du Colombier 	if(t1->nbits)
6033e12c5d1SDavid du Colombier 		return 0;
6043e12c5d1SDavid du Colombier 	i = 0;
6053e12c5d1SDavid du Colombier 	if(t2 != T)
6063e12c5d1SDavid du Colombier 		i = t2->etype;
6073e12c5d1SDavid du Colombier 	b = 1<<i;
6083e12c5d1SDavid du Colombier 	i = 0;
6093e12c5d1SDavid du Colombier 	if(t1 != T)
6103e12c5d1SDavid du Colombier 		i = t1->etype;
6113e12c5d1SDavid du Colombier 	if(b & ncast[i])
6123e12c5d1SDavid du Colombier 		return 1;
6133e12c5d1SDavid du Colombier 	return 0;
6143e12c5d1SDavid du Colombier }
6153e12c5d1SDavid du Colombier 
6163e12c5d1SDavid du Colombier /*
6173e12c5d1SDavid du Colombier  * a cast that has a noop semantic
6183e12c5d1SDavid du Colombier  * (small to large, convert)
6193e12c5d1SDavid du Colombier  */
6203e12c5d1SDavid du Colombier int
6213e12c5d1SDavid du Colombier nilcast(Type *t1, Type *t2)
6223e12c5d1SDavid du Colombier {
6237dd7cddfSDavid du Colombier 	int et1, et2;
6243e12c5d1SDavid du Colombier 
6257dd7cddfSDavid du Colombier 	if(t1 == T)
6267dd7cddfSDavid du Colombier 		return 0;
6273e12c5d1SDavid du Colombier 	if(t1->nbits)
6283e12c5d1SDavid du Colombier 		return 0;
6297dd7cddfSDavid du Colombier 	if(t2 == T)
6307dd7cddfSDavid du Colombier 		return 0;
6317dd7cddfSDavid du Colombier 	et1 = t1->etype;
6327dd7cddfSDavid du Colombier 	et2 = t2->etype;
6337dd7cddfSDavid du Colombier 	if(et1 == et2)
6343e12c5d1SDavid du Colombier 		return 1;
6357dd7cddfSDavid du Colombier 	if(typefd[et1] && typefd[et2]) {
6367dd7cddfSDavid du Colombier 		if(ewidth[et1] < ewidth[et2])
6377dd7cddfSDavid du Colombier 			return 1;
6387dd7cddfSDavid du Colombier 		return 0;
6397dd7cddfSDavid du Colombier 	}
6407dd7cddfSDavid du Colombier 	if(typechlp[et1] && typechlp[et2]) {
6417dd7cddfSDavid du Colombier 		if(ewidth[et1] < ewidth[et2])
6427dd7cddfSDavid du Colombier 			return 1;
6437dd7cddfSDavid du Colombier 		return 0;
6447dd7cddfSDavid du Colombier 	}
6453e12c5d1SDavid du Colombier 	return 0;
6463e12c5d1SDavid du Colombier }
6473e12c5d1SDavid du Colombier 
6483e12c5d1SDavid du Colombier /*
6493e12c5d1SDavid du Colombier  * "the usual arithmetic conversions are performed"
6503e12c5d1SDavid du Colombier  */
6513e12c5d1SDavid du Colombier void
6523e12c5d1SDavid du Colombier arith(Node *n, int f)
6533e12c5d1SDavid du Colombier {
6543e12c5d1SDavid du Colombier 	Type *t1, *t2;
6553e12c5d1SDavid du Colombier 	int i, j, k;
6563e12c5d1SDavid du Colombier 	Node *n1;
6573e12c5d1SDavid du Colombier 	long w;
6583e12c5d1SDavid du Colombier 
6593e12c5d1SDavid du Colombier 	t1 = n->left->type;
6603e12c5d1SDavid du Colombier 	if(n->right == Z)
6613e12c5d1SDavid du Colombier 		t2 = t1;
6623e12c5d1SDavid du Colombier 	else
6633e12c5d1SDavid du Colombier 		t2 = n->right->type;
6643e12c5d1SDavid du Colombier 	i = TXXX;
6653e12c5d1SDavid du Colombier 	if(t1 != T)
6663e12c5d1SDavid du Colombier 		i = t1->etype;
6673e12c5d1SDavid du Colombier 	j = TXXX;
6683e12c5d1SDavid du Colombier 	if(t2 != T)
6693e12c5d1SDavid du Colombier 		j = t2->etype;
6703e12c5d1SDavid du Colombier 	k = tab[i][j];
6713e12c5d1SDavid du Colombier 	if(k == TIND) {
6723e12c5d1SDavid du Colombier 		if(i == TIND)
6733e12c5d1SDavid du Colombier 			n->type = t1;
6743e12c5d1SDavid du Colombier 		else
6753e12c5d1SDavid du Colombier 		if(j == TIND)
6763e12c5d1SDavid du Colombier 			n->type = t2;
6773e12c5d1SDavid du Colombier 	} else {
6783e12c5d1SDavid du Colombier 		/* convert up to at least int */
6793e12c5d1SDavid du Colombier 		if(f == 1)
6807dd7cddfSDavid du Colombier 		while(k < TINT)
6813e12c5d1SDavid du Colombier 			k += 2;
6823e12c5d1SDavid du Colombier 		n->type = types[k];
6833e12c5d1SDavid du Colombier 	}
6843e12c5d1SDavid du Colombier 	if(n->op == OSUB)
6853e12c5d1SDavid du Colombier 	if(i == TIND && j == TIND) {
6863e12c5d1SDavid du Colombier 		w = n->right->type->link->width;
6872cca75a1SDavid du Colombier 		if(w < 1 || n->left->type->link == T || n->left->type->link->width < 1)
6883e12c5d1SDavid du Colombier 			goto bad;
6897bd483b0SDavid du Colombier 		n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG];
6907bd483b0SDavid du Colombier 		if(1 && ewidth[TIND] > ewidth[TLONG]){
6917bd483b0SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
6927bd483b0SDavid du Colombier 			*n1 = *n;
6937bd483b0SDavid du Colombier 			n->op = OCAST;
6947bd483b0SDavid du Colombier 			n->left = n1;
6957bd483b0SDavid du Colombier 			n->right = Z;
6967bd483b0SDavid du Colombier 			n->type = types[TLONG];
6977bd483b0SDavid du Colombier 		}
6983e12c5d1SDavid du Colombier 		if(w > 1) {
6993e12c5d1SDavid du Colombier 			n1 = new1(OXXX, Z, Z);
7003e12c5d1SDavid du Colombier 			*n1 = *n;
7013e12c5d1SDavid du Colombier 			n->op = ODIV;
7023e12c5d1SDavid du Colombier 			n->left = n1;
7033e12c5d1SDavid du Colombier 			n1 = new1(OCONST, Z, Z);
70480ee5cbfSDavid du Colombier 			n1->vconst = w;
7053e12c5d1SDavid du Colombier 			n1->type = n->type;
7063e12c5d1SDavid du Colombier 			n->right = n1;
70780ee5cbfSDavid du Colombier 			w = vlog(n1);
70880ee5cbfSDavid du Colombier 			if(w >= 0) {
70980ee5cbfSDavid du Colombier 				n->op = OASHR;
71080ee5cbfSDavid du Colombier 				n1->vconst = w;
71180ee5cbfSDavid du Colombier 			}
7123e12c5d1SDavid du Colombier 		}
7133e12c5d1SDavid du Colombier 		return;
7143e12c5d1SDavid du Colombier 	}
7153e12c5d1SDavid du Colombier 	if(!sametype(n->type, n->left->type)) {
7163e12c5d1SDavid du Colombier 		n->left = new1(OCAST, n->left, Z);
7173e12c5d1SDavid du Colombier 		n->left->type = n->type;
7183e12c5d1SDavid du Colombier 		if(n->type->etype == TIND) {
7193e12c5d1SDavid du Colombier 			w = n->type->link->width;
7207dd7cddfSDavid du Colombier 			if(w < 1) {
7217dd7cddfSDavid du Colombier 				snap(n->type->link);
7227dd7cddfSDavid du Colombier 				w = n->type->link->width;
7233e12c5d1SDavid du Colombier 				if(w < 1)
7243e12c5d1SDavid du Colombier 					goto bad;
7257dd7cddfSDavid du Colombier 			}
7263e12c5d1SDavid du Colombier 			if(w > 1) {
7273e12c5d1SDavid du Colombier 				n1 = new1(OCONST, Z, Z);
728219b2ee8SDavid du Colombier 				n1->vconst = w;
7293e12c5d1SDavid du Colombier 				n1->type = n->type;
7303e12c5d1SDavid du Colombier 				n->left = new1(OMUL, n->left, n1);
7313e12c5d1SDavid du Colombier 				n->left->type = n->type;
7323e12c5d1SDavid du Colombier 			}
7333e12c5d1SDavid du Colombier 		}
7343e12c5d1SDavid du Colombier 	}
7353e12c5d1SDavid du Colombier 	if(n->right != Z)
7363e12c5d1SDavid du Colombier 	if(!sametype(n->type, n->right->type)) {
7373e12c5d1SDavid du Colombier 		n->right = new1(OCAST, n->right, Z);
7383e12c5d1SDavid du Colombier 		n->right->type = n->type;
7393e12c5d1SDavid du Colombier 		if(n->type->etype == TIND) {
7403e12c5d1SDavid du Colombier 			w = n->type->link->width;
7417dd7cddfSDavid du Colombier 			if(w < 1) {
7427dd7cddfSDavid du Colombier 				snap(n->type->link);
7437dd7cddfSDavid du Colombier 				w = n->type->link->width;
7443e12c5d1SDavid du Colombier 				if(w < 1)
7453e12c5d1SDavid du Colombier 					goto bad;
7467dd7cddfSDavid du Colombier 			}
7473e12c5d1SDavid du Colombier 			if(w != 1) {
7483e12c5d1SDavid du Colombier 				n1 = new1(OCONST, Z, Z);
749219b2ee8SDavid du Colombier 				n1->vconst = w;
7503e12c5d1SDavid du Colombier 				n1->type = n->type;
7513e12c5d1SDavid du Colombier 				n->right = new1(OMUL, n->right, n1);
7523e12c5d1SDavid du Colombier 				n->right->type = n->type;
7533e12c5d1SDavid du Colombier 			}
7543e12c5d1SDavid du Colombier 		}
7553e12c5d1SDavid du Colombier 	}
7563e12c5d1SDavid du Colombier 	return;
7573e12c5d1SDavid du Colombier bad:
7587dd7cddfSDavid du Colombier 	diag(n, "pointer addition not fully declared: %T", n->type->link);
7593e12c5d1SDavid du Colombier }
7603e12c5d1SDavid du Colombier 
761375daca8SDavid du Colombier /*
762375daca8SDavid du Colombier  * try to rewrite shift & mask
763375daca8SDavid du Colombier  */
764375daca8SDavid du Colombier void
765375daca8SDavid du Colombier simplifyshift(Node *n)
766375daca8SDavid du Colombier {
767375daca8SDavid du Colombier 	ulong c3;
768375daca8SDavid du Colombier 	int o, s1, s2, c1, c2;
769375daca8SDavid du Colombier 
770375daca8SDavid du Colombier 	if(!typechlp[n->type->etype])
771375daca8SDavid du Colombier 		return;
772375daca8SDavid du Colombier 	switch(n->op) {
773375daca8SDavid du Colombier 	default:
774375daca8SDavid du Colombier 		return;
775375daca8SDavid du Colombier 	case OASHL:
776375daca8SDavid du Colombier 		s1 = 0;
777375daca8SDavid du Colombier 		break;
778375daca8SDavid du Colombier 	case OLSHR:
779375daca8SDavid du Colombier 		s1 = 1;
780375daca8SDavid du Colombier 		break;
781375daca8SDavid du Colombier 	case OASHR:
782375daca8SDavid du Colombier 		s1 = 2;
783375daca8SDavid du Colombier 		break;
784375daca8SDavid du Colombier 	}
785375daca8SDavid du Colombier 	if(n->right->op != OCONST)
786375daca8SDavid du Colombier 		return;
787375daca8SDavid du Colombier 	if(n->left->op != OAND)
788375daca8SDavid du Colombier 		return;
789375daca8SDavid du Colombier 	if(n->left->right->op != OCONST)
790375daca8SDavid du Colombier 		return;
791375daca8SDavid du Colombier 	switch(n->left->left->op) {
792375daca8SDavid du Colombier 	default:
793375daca8SDavid du Colombier 		return;
794375daca8SDavid du Colombier 	case OASHL:
795375daca8SDavid du Colombier 		s2 = 0;
796375daca8SDavid du Colombier 		break;
797375daca8SDavid du Colombier 	case OLSHR:
798375daca8SDavid du Colombier 		s2 = 1;
799375daca8SDavid du Colombier 		break;
800375daca8SDavid du Colombier 	case OASHR:
801375daca8SDavid du Colombier 		s2 = 2;
802375daca8SDavid du Colombier 		break;
803375daca8SDavid du Colombier 	}
804375daca8SDavid du Colombier 	if(n->left->left->right->op != OCONST)
805375daca8SDavid du Colombier 		return;
806375daca8SDavid du Colombier 
807375daca8SDavid du Colombier 	c1 = n->right->vconst;
808375daca8SDavid du Colombier 	c2 = n->left->left->right->vconst;
809375daca8SDavid du Colombier 	c3 = n->left->right->vconst;
810375daca8SDavid du Colombier 
811375daca8SDavid du Colombier /*
812375daca8SDavid du Colombier 	if(debug['h'])
813375daca8SDavid du Colombier 		print("%.3o %ld %ld %d #%.lux\n",
814375daca8SDavid du Colombier 			(s1<<3)|s2, c1, c2, topbit(c3), c3);
815375daca8SDavid du Colombier */
816375daca8SDavid du Colombier 
817375daca8SDavid du Colombier 	o = n->op;
818375daca8SDavid du Colombier 	switch((s1<<3)|s2) {
819375daca8SDavid du Colombier 	case 000:	/* (((e <<u c2) & c3) <<u c1) */
820375daca8SDavid du Colombier 		c3 >>= c2;
821375daca8SDavid du Colombier 		c1 += c2;
822375daca8SDavid du Colombier 		if(c1 >= 32)
823375daca8SDavid du Colombier 			break;
824375daca8SDavid du Colombier 		goto rewrite1;
825375daca8SDavid du Colombier 
826375daca8SDavid du Colombier 	case 002:	/* (((e >>s c2) & c3) <<u c1) */
827375daca8SDavid du Colombier 		if(topbit(c3) >= (32-c2))
828375daca8SDavid du Colombier 			break;
829375daca8SDavid du Colombier 	case 001:	/* (((e >>u c2) & c3) <<u c1) */
830375daca8SDavid du Colombier 		if(c1 > c2) {
831375daca8SDavid du Colombier 			c3 <<= c2;
832375daca8SDavid du Colombier 			c1 -= c2;
833375daca8SDavid du Colombier 			o = OASHL;
834375daca8SDavid du Colombier 			goto rewrite1;
835375daca8SDavid du Colombier 		}
836375daca8SDavid du Colombier 		c3 <<= c1;
837375daca8SDavid du Colombier 		if(c1 == c2)
838375daca8SDavid du Colombier 			goto rewrite0;
839375daca8SDavid du Colombier 		c1 = c2-c1;
840375daca8SDavid du Colombier 		o = OLSHR;
841375daca8SDavid du Colombier 		goto rewrite2;
842375daca8SDavid du Colombier 
843375daca8SDavid du Colombier 	case 022:	/* (((e >>s c2) & c3) >>s c1) */
844375daca8SDavid du Colombier 		if(c2 <= 0)
845375daca8SDavid du Colombier 			break;
846375daca8SDavid du Colombier 	case 012:	/* (((e >>s c2) & c3) >>u c1) */
847375daca8SDavid du Colombier 		if(topbit(c3) >= (32-c2))
848375daca8SDavid du Colombier 			break;
849375daca8SDavid du Colombier 		goto s11;
850375daca8SDavid du Colombier 	case 021:	/* (((e >>u c2) & c3) >>s c1) */
851375daca8SDavid du Colombier 		if(topbit(c3) >= 31 && c2 <= 0)
852375daca8SDavid du Colombier 			break;
853375daca8SDavid du Colombier 		goto s11;
854375daca8SDavid du Colombier 	case 011:	/* (((e >>u c2) & c3) >>u c1) */
855375daca8SDavid du Colombier 	s11:
856375daca8SDavid du Colombier 		c3 <<= c2;
857375daca8SDavid du Colombier 		c1 += c2;
858375daca8SDavid du Colombier 		if(c1 >= 32)
859375daca8SDavid du Colombier 			break;
860375daca8SDavid du Colombier 		o = OLSHR;
861375daca8SDavid du Colombier 		goto rewrite1;
862375daca8SDavid du Colombier 
863375daca8SDavid du Colombier 	case 020:	/* (((e <<u c2) & c3) >>s c1) */
864375daca8SDavid du Colombier 		if(topbit(c3) >= 31)
865375daca8SDavid du Colombier 			break;
866375daca8SDavid du Colombier 	case 010:	/* (((e <<u c2) & c3) >>u c1) */
867375daca8SDavid du Colombier 		c3 >>= c1;
868375daca8SDavid du Colombier 		if(c1 == c2)
869375daca8SDavid du Colombier 			goto rewrite0;
870375daca8SDavid du Colombier 		if(c1 > c2) {
871375daca8SDavid du Colombier 			c1 -= c2;
872375daca8SDavid du Colombier 			goto rewrite2;
873375daca8SDavid du Colombier 		}
874375daca8SDavid du Colombier 		c1 = c2 - c1;
875375daca8SDavid du Colombier 		o = OASHL;
876375daca8SDavid du Colombier 		goto rewrite2;
877375daca8SDavid du Colombier 	}
878375daca8SDavid du Colombier 	return;
879375daca8SDavid du Colombier 
880375daca8SDavid du Colombier rewrite0:	/* get rid of both shifts */
881375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite0");
882375daca8SDavid du Colombier 	*n = *n->left;
883375daca8SDavid du Colombier 	n->left = n->left->left;
884375daca8SDavid du Colombier 	n->right->vconst = c3;
885375daca8SDavid du Colombier 	return;
886375daca8SDavid du Colombier rewrite1:	/* get rid of lower shift */
887375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite1");
888375daca8SDavid du Colombier 	n->left->left = n->left->left->left;
889375daca8SDavid du Colombier 	n->left->right->vconst = c3;
890375daca8SDavid du Colombier 	n->right->vconst = c1;
891375daca8SDavid du Colombier 	n->op = o;
892375daca8SDavid du Colombier 	return;
893375daca8SDavid du Colombier rewrite2:	/* get rid of upper shift */
894375daca8SDavid du Colombier if(debug['<'])prtree(n, "rewrite2");
895375daca8SDavid du Colombier 	*n = *n->left;
896375daca8SDavid du Colombier 	n->right->vconst = c3;
897375daca8SDavid du Colombier 	n->left->right->vconst = c1;
898375daca8SDavid du Colombier 	n->left->op = o;
899375daca8SDavid du Colombier }
900375daca8SDavid du Colombier 
9013e12c5d1SDavid du Colombier int
9023e12c5d1SDavid du Colombier side(Node *n)
9033e12c5d1SDavid du Colombier {
9043e12c5d1SDavid du Colombier 
9053e12c5d1SDavid du Colombier loop:
9063e12c5d1SDavid du Colombier 	if(n != Z)
9073e12c5d1SDavid du Colombier 	switch(n->op) {
9083e12c5d1SDavid du Colombier 	case OCAST:
9093e12c5d1SDavid du Colombier 	case ONOT:
9103e12c5d1SDavid du Colombier 	case OADDR:
9113e12c5d1SDavid du Colombier 	case OIND:
9123e12c5d1SDavid du Colombier 		n = n->left;
9133e12c5d1SDavid du Colombier 		goto loop;
9143e12c5d1SDavid du Colombier 
9153e12c5d1SDavid du Colombier 	case OCOND:
9163e12c5d1SDavid du Colombier 		if(side(n->left))
9173e12c5d1SDavid du Colombier 			break;
9183e12c5d1SDavid du Colombier 		n = n->right;
9193e12c5d1SDavid du Colombier 
9203e12c5d1SDavid du Colombier 	case OEQ:
9213e12c5d1SDavid du Colombier 	case ONE:
9223e12c5d1SDavid du Colombier 	case OLT:
9233e12c5d1SDavid du Colombier 	case OGE:
9243e12c5d1SDavid du Colombier 	case OGT:
9253e12c5d1SDavid du Colombier 	case OLE:
9263e12c5d1SDavid du Colombier 	case OADD:
9273e12c5d1SDavid du Colombier 	case OSUB:
9283e12c5d1SDavid du Colombier 	case OMUL:
9293e12c5d1SDavid du Colombier 	case OLMUL:
9303e12c5d1SDavid du Colombier 	case ODIV:
9313e12c5d1SDavid du Colombier 	case OLDIV:
9323e12c5d1SDavid du Colombier 	case OLSHR:
9333e12c5d1SDavid du Colombier 	case OASHL:
9343e12c5d1SDavid du Colombier 	case OASHR:
9353e12c5d1SDavid du Colombier 	case OAND:
9363e12c5d1SDavid du Colombier 	case OOR:
9373e12c5d1SDavid du Colombier 	case OXOR:
9383e12c5d1SDavid du Colombier 	case OMOD:
9393e12c5d1SDavid du Colombier 	case OLMOD:
9403e12c5d1SDavid du Colombier 	case OANDAND:
9413e12c5d1SDavid du Colombier 	case OOROR:
9423e12c5d1SDavid du Colombier 	case OCOMMA:
9433e12c5d1SDavid du Colombier 	case ODOT:
9443e12c5d1SDavid du Colombier 		if(side(n->left))
9453e12c5d1SDavid du Colombier 			break;
9463e12c5d1SDavid du Colombier 		n = n->right;
9473e12c5d1SDavid du Colombier 		goto loop;
9483e12c5d1SDavid du Colombier 
9497dd7cddfSDavid du Colombier 	case OSIGN:
9503e12c5d1SDavid du Colombier 	case OSIZE:
9513e12c5d1SDavid du Colombier 	case OCONST:
9523e12c5d1SDavid du Colombier 	case OSTRING:
9533e12c5d1SDavid du Colombier 	case OLSTRING:
9543e12c5d1SDavid du Colombier 	case ONAME:
9553e12c5d1SDavid du Colombier 		return 0;
9563e12c5d1SDavid du Colombier 	}
9573e12c5d1SDavid du Colombier 	return 1;
9583e12c5d1SDavid du Colombier }
9593e12c5d1SDavid du Colombier 
9603e12c5d1SDavid du Colombier int
9613e12c5d1SDavid du Colombier vconst(Node *n)
9623e12c5d1SDavid du Colombier {
9633e12c5d1SDavid du Colombier 	int i;
9643e12c5d1SDavid du Colombier 
9653e12c5d1SDavid du Colombier 	if(n == Z)
9663e12c5d1SDavid du Colombier 		goto no;
9673e12c5d1SDavid du Colombier 	if(n->op != OCONST)
9683e12c5d1SDavid du Colombier 		goto no;
9693e12c5d1SDavid du Colombier 	if(n->type == T)
9703e12c5d1SDavid du Colombier 		goto no;
9713e12c5d1SDavid du Colombier 	switch(n->type->etype)
9723e12c5d1SDavid du Colombier 	{
9733e12c5d1SDavid du Colombier 	case TFLOAT:
9743e12c5d1SDavid du Colombier 	case TDOUBLE:
9753e12c5d1SDavid du Colombier 		i = 100;
976219b2ee8SDavid du Colombier 		if(n->fconst > i || n->fconst < -i)
9773e12c5d1SDavid du Colombier 			goto no;
978219b2ee8SDavid du Colombier 		i = n->fconst;
979219b2ee8SDavid du Colombier 		if(i != n->fconst)
980219b2ee8SDavid du Colombier 			goto no;
981219b2ee8SDavid du Colombier 		return i;
982219b2ee8SDavid du Colombier 
983219b2ee8SDavid du Colombier 	case TVLONG:
984219b2ee8SDavid du Colombier 	case TUVLONG:
985219b2ee8SDavid du Colombier 		i = n->vconst;
986219b2ee8SDavid du Colombier 		if(i != n->vconst)
9873e12c5d1SDavid du Colombier 			goto no;
9883e12c5d1SDavid du Colombier 		return i;
9893e12c5d1SDavid du Colombier 
9903e12c5d1SDavid du Colombier 	case TCHAR:
9913e12c5d1SDavid du Colombier 	case TUCHAR:
9923e12c5d1SDavid du Colombier 	case TSHORT:
9933e12c5d1SDavid du Colombier 	case TUSHORT:
9947dd7cddfSDavid du Colombier 	case TINT:
9957dd7cddfSDavid du Colombier 	case TUINT:
9963e12c5d1SDavid du Colombier 	case TLONG:
9973e12c5d1SDavid du Colombier 	case TULONG:
9983e12c5d1SDavid du Colombier 	case TIND:
999219b2ee8SDavid du Colombier 		i = n->vconst;
1000219b2ee8SDavid du Colombier 		if(i != n->vconst)
10013e12c5d1SDavid du Colombier 			goto no;
10023e12c5d1SDavid du Colombier 		return i;
10033e12c5d1SDavid du Colombier 	}
10043e12c5d1SDavid du Colombier no:
10053e12c5d1SDavid du Colombier 	return -159;	/* first uninteresting constant */
10063e12c5d1SDavid du Colombier }
10073e12c5d1SDavid du Colombier 
10083e12c5d1SDavid du Colombier /*
10097dd7cddfSDavid du Colombier  * return log(n) if n is a power of 2 constant
10107dd7cddfSDavid du Colombier  */
10117dd7cddfSDavid du Colombier int
1012282e677fSDavid du Colombier log2(uvlong v)
10137dd7cddfSDavid du Colombier {
10147dd7cddfSDavid du Colombier 	int s, i;
1015282e677fSDavid du Colombier 	uvlong m;
10167dd7cddfSDavid du Colombier 
10177dd7cddfSDavid du Colombier 	s = 0;
10187dd7cddfSDavid du Colombier 	m = MASK(8*sizeof(uvlong));
10197dd7cddfSDavid du Colombier 	for(i=32; i; i>>=1) {
10207dd7cddfSDavid du Colombier 		m >>= i;
10217dd7cddfSDavid du Colombier 		if(!(v & m)) {
10227dd7cddfSDavid du Colombier 			v >>= i;
10237dd7cddfSDavid du Colombier 			s += i;
10247dd7cddfSDavid du Colombier 		}
10257dd7cddfSDavid du Colombier 	}
10267dd7cddfSDavid du Colombier 	if(v == 1)
10277dd7cddfSDavid du Colombier 		return s;
1028282e677fSDavid du Colombier 	return -1;
1029282e677fSDavid du Colombier }
1030282e677fSDavid du Colombier 
1031282e677fSDavid du Colombier int
1032282e677fSDavid du Colombier vlog(Node *n)
1033282e677fSDavid du Colombier {
1034282e677fSDavid du Colombier 	if(n->op != OCONST)
1035282e677fSDavid du Colombier 		goto bad;
1036282e677fSDavid du Colombier 	if(typefd[n->type->etype])
1037282e677fSDavid du Colombier 		goto bad;
1038282e677fSDavid du Colombier 
1039282e677fSDavid du Colombier 	return log2(n->vconst);
10407dd7cddfSDavid du Colombier 
10417dd7cddfSDavid du Colombier bad:
10427dd7cddfSDavid du Colombier 	return -1;
10437dd7cddfSDavid du Colombier }
10447dd7cddfSDavid du Colombier 
10457dd7cddfSDavid du Colombier int
10467dd7cddfSDavid du Colombier topbit(ulong v)
10477dd7cddfSDavid du Colombier {
10487dd7cddfSDavid du Colombier 	int i;
10497dd7cddfSDavid du Colombier 
10507dd7cddfSDavid du Colombier 	for(i = -1; v; i++)
10517dd7cddfSDavid du Colombier 		v >>= 1;
10527dd7cddfSDavid du Colombier 	return i;
10537dd7cddfSDavid du Colombier }
10547dd7cddfSDavid du Colombier 
10557dd7cddfSDavid du Colombier /*
10563e12c5d1SDavid du Colombier  * try to cast a constant down
10573e12c5d1SDavid du Colombier  * rather than cast a variable up
10583e12c5d1SDavid du Colombier  * example:
10593e12c5d1SDavid du Colombier  *	if(c == 'a')
10603e12c5d1SDavid du Colombier  */
10613e12c5d1SDavid du Colombier void
10623e12c5d1SDavid du Colombier relcon(Node *l, Node *r)
10633e12c5d1SDavid du Colombier {
1064219b2ee8SDavid du Colombier 	vlong v;
10653e12c5d1SDavid du Colombier 
10663e12c5d1SDavid du Colombier 	if(l->op != OCONST)
10673e12c5d1SDavid du Colombier 		return;
10683e12c5d1SDavid du Colombier 	if(r->op != OCAST)
10693e12c5d1SDavid du Colombier 		return;
10703e12c5d1SDavid du Colombier 	if(!nilcast(r->left->type, r->type))
10713e12c5d1SDavid du Colombier 		return;
10723e12c5d1SDavid du Colombier 	switch(r->type->etype) {
10733e12c5d1SDavid du Colombier 	default:
10743e12c5d1SDavid du Colombier 		return;
10753e12c5d1SDavid du Colombier 	case TCHAR:
10763e12c5d1SDavid du Colombier 	case TUCHAR:
10773e12c5d1SDavid du Colombier 	case TSHORT:
10783e12c5d1SDavid du Colombier 	case TUSHORT:
1079219b2ee8SDavid du Colombier 		v = convvtox(l->vconst, r->type->etype);
1080219b2ee8SDavid du Colombier 		if(v != l->vconst)
10813e12c5d1SDavid du Colombier 			return;
10823e12c5d1SDavid du Colombier 		break;
10833e12c5d1SDavid du Colombier 	}
10843e12c5d1SDavid du Colombier 	l->type = r->left->type;
10853e12c5d1SDavid du Colombier 	*r = *r->left;
10863e12c5d1SDavid du Colombier }
10873e12c5d1SDavid du Colombier 
10883e12c5d1SDavid du Colombier int
10893e12c5d1SDavid du Colombier relindex(int o)
10903e12c5d1SDavid du Colombier {
10913e12c5d1SDavid du Colombier 
10923e12c5d1SDavid du Colombier 	switch(o) {
10933e12c5d1SDavid du Colombier 	default:
10943e12c5d1SDavid du Colombier 		diag(Z, "bad in relindex: %O", o);
10953e12c5d1SDavid du Colombier 	case OEQ: return 0;
10963e12c5d1SDavid du Colombier 	case ONE: return 1;
10973e12c5d1SDavid du Colombier 	case OLE: return 2;
10983e12c5d1SDavid du Colombier 	case OLS: return 3;
10993e12c5d1SDavid du Colombier 	case OLT: return 4;
11003e12c5d1SDavid du Colombier 	case OLO: return 5;
11013e12c5d1SDavid du Colombier 	case OGE: return 6;
11023e12c5d1SDavid du Colombier 	case OHS: return 7;
11033e12c5d1SDavid du Colombier 	case OGT: return 8;
11043e12c5d1SDavid du Colombier 	case OHI: return 9;
11053e12c5d1SDavid du Colombier 	}
11063e12c5d1SDavid du Colombier }
11073e12c5d1SDavid du Colombier 
11083e12c5d1SDavid du Colombier Node*
11093e12c5d1SDavid du Colombier invert(Node *n)
11103e12c5d1SDavid du Colombier {
11113e12c5d1SDavid du Colombier 	Node *i;
11123e12c5d1SDavid du Colombier 
11133e12c5d1SDavid du Colombier 	if(n == Z || n->op != OLIST)
11143e12c5d1SDavid du Colombier 		return n;
11153e12c5d1SDavid du Colombier 	i = n;
11163e12c5d1SDavid du Colombier 	for(n = n->left; n != Z; n = n->left) {
11173e12c5d1SDavid du Colombier 		if(n->op != OLIST)
11183e12c5d1SDavid du Colombier 			break;
11193e12c5d1SDavid du Colombier 		i->left = n->right;
11203e12c5d1SDavid du Colombier 		n->right = i;
11213e12c5d1SDavid du Colombier 		i = n;
11223e12c5d1SDavid du Colombier 	}
11233e12c5d1SDavid du Colombier 	i->left = n;
11243e12c5d1SDavid du Colombier 	return i;
11253e12c5d1SDavid du Colombier }
11263e12c5d1SDavid du Colombier 
11273e12c5d1SDavid du Colombier int
11283e12c5d1SDavid du Colombier bitno(long b)
11293e12c5d1SDavid du Colombier {
11303e12c5d1SDavid du Colombier 	int i;
11313e12c5d1SDavid du Colombier 
11323e12c5d1SDavid du Colombier 	for(i=0; i<32; i++)
11333e12c5d1SDavid du Colombier 		if(b & (1L<<i))
11343e12c5d1SDavid du Colombier 			return i;
11353e12c5d1SDavid du Colombier 	diag(Z, "bad in bitno");
11363e12c5d1SDavid du Colombier 	return 0;
11373e12c5d1SDavid du Colombier }
11383e12c5d1SDavid du Colombier 
11397dd7cddfSDavid du Colombier long
11407dd7cddfSDavid du Colombier typebitor(long a, long b)
11417dd7cddfSDavid du Colombier {
11427dd7cddfSDavid du Colombier 	long c;
11437dd7cddfSDavid du Colombier 
11447dd7cddfSDavid du Colombier 	c = a | b;
11457dd7cddfSDavid du Colombier 	if(a & b)
11467dd7cddfSDavid du Colombier 		if((a & b) == BLONG)
11477dd7cddfSDavid du Colombier 			c |= BVLONG;		/* long long => vlong */
11487dd7cddfSDavid du Colombier 		else
11497dd7cddfSDavid du Colombier 			warn(Z, "once is enough: %Q", a & b);
11507dd7cddfSDavid du Colombier 	return c;
11517dd7cddfSDavid du Colombier }
11527dd7cddfSDavid du Colombier 
11533e12c5d1SDavid du Colombier void
11547dd7cddfSDavid du Colombier diag(Node *n, char *fmt, ...)
11553e12c5d1SDavid du Colombier {
11563e12c5d1SDavid du Colombier 	char buf[STRINGSZ];
11577dd7cddfSDavid du Colombier 	va_list arg;
11583e12c5d1SDavid du Colombier 
11597dd7cddfSDavid du Colombier 	va_start(arg, fmt);
11609a747e4fSDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
11617dd7cddfSDavid du Colombier 	va_end(arg);
116218027f8cSDavid du Colombier 	Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
11633e12c5d1SDavid du Colombier 
116418027f8cSDavid du Colombier 	if(debug['X']){
116518027f8cSDavid du Colombier 		Bflush(&diagbuf);
11663e12c5d1SDavid du Colombier 		abort();
116718027f8cSDavid du Colombier 	}
11683e12c5d1SDavid du Colombier 	if(n != Z)
11693e12c5d1SDavid du Colombier 	if(debug['v'])
11703e12c5d1SDavid du Colombier 		prtree(n, "diagnostic");
11713e12c5d1SDavid du Colombier 
11723e12c5d1SDavid du Colombier 	nerrors++;
11733e12c5d1SDavid du Colombier 	if(nerrors > 10) {
117418027f8cSDavid du Colombier 		Bprint(&diagbuf, "too many errors\n");
11753e12c5d1SDavid du Colombier 		errorexit();
11763e12c5d1SDavid du Colombier 	}
11773e12c5d1SDavid du Colombier }
11783e12c5d1SDavid du Colombier 
11793e12c5d1SDavid du Colombier void
11807dd7cddfSDavid du Colombier warn(Node *n, char *fmt, ...)
11813e12c5d1SDavid du Colombier {
11823e12c5d1SDavid du Colombier 	char buf[STRINGSZ];
11837dd7cddfSDavid du Colombier 	va_list arg;
11843e12c5d1SDavid du Colombier 
11853e12c5d1SDavid du Colombier 	if(debug['w']) {
118618027f8cSDavid du Colombier 		Bprint(&diagbuf, "warning: ");
11877dd7cddfSDavid du Colombier 		va_start(arg, fmt);
11889a747e4fSDavid du Colombier 		vseprint(buf, buf+sizeof(buf), fmt, arg);
11897dd7cddfSDavid du Colombier 		va_end(arg);
119018027f8cSDavid du Colombier 		Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
11913e12c5d1SDavid du Colombier 
11923e12c5d1SDavid du Colombier 		if(n != Z)
11933e12c5d1SDavid du Colombier 		if(debug['v'])
11943e12c5d1SDavid du Colombier 			prtree(n, "warning");
11953e12c5d1SDavid du Colombier 	}
11963e12c5d1SDavid du Colombier }
11973e12c5d1SDavid du Colombier 
11983e12c5d1SDavid du Colombier void
11997dd7cddfSDavid du Colombier yyerror(char *fmt, ...)
12003e12c5d1SDavid du Colombier {
12013e12c5d1SDavid du Colombier 	char buf[STRINGSZ];
12027dd7cddfSDavid du Colombier 	va_list arg;
12033e12c5d1SDavid du Colombier 
12043e12c5d1SDavid du Colombier 	/*
12053e12c5d1SDavid du Colombier 	 * hack to intercept message from yaccpar
12063e12c5d1SDavid du Colombier 	 */
12077dd7cddfSDavid du Colombier 	if(strcmp(fmt, "syntax error") == 0) {
12083e12c5d1SDavid du Colombier 		yyerror("syntax error, last name: %s", symb);
12093e12c5d1SDavid du Colombier 		return;
12103e12c5d1SDavid du Colombier 	}
12117dd7cddfSDavid du Colombier 	va_start(arg, fmt);
12129a747e4fSDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
12137dd7cddfSDavid du Colombier 	va_end(arg);
121418027f8cSDavid du Colombier 	Bprint(&diagbuf, "%L %s\n", lineno, buf);
12153e12c5d1SDavid du Colombier 	nerrors++;
12163e12c5d1SDavid du Colombier 	if(nerrors > 10) {
121718027f8cSDavid du Colombier 		Bprint(&diagbuf, "too many errors\n");
12183e12c5d1SDavid du Colombier 		errorexit();
12193e12c5d1SDavid du Colombier 	}
12203e12c5d1SDavid du Colombier }
12213e12c5d1SDavid du Colombier 
1222375daca8SDavid du Colombier void
1223375daca8SDavid du Colombier fatal(Node *n, char *fmt, ...)
1224375daca8SDavid du Colombier {
1225375daca8SDavid du Colombier 	char buf[STRINGSZ];
1226375daca8SDavid du Colombier 	va_list arg;
1227375daca8SDavid du Colombier 
1228375daca8SDavid du Colombier 	va_start(arg, fmt);
1229375daca8SDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
1230375daca8SDavid du Colombier 	va_end(arg);
123118027f8cSDavid du Colombier 	Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1232375daca8SDavid du Colombier 
123318027f8cSDavid du Colombier 	if(debug['X']){
123418027f8cSDavid du Colombier 		Bflush(&diagbuf);
1235375daca8SDavid du Colombier 		abort();
123618027f8cSDavid du Colombier 	}
1237375daca8SDavid du Colombier 	if(n != Z)
1238375daca8SDavid du Colombier 	if(debug['v'])
1239375daca8SDavid du Colombier 		prtree(n, "diagnostic");
1240375daca8SDavid du Colombier 
1241375daca8SDavid du Colombier 	nerrors++;
1242375daca8SDavid du Colombier 	errorexit();
1243375daca8SDavid du Colombier }
1244375daca8SDavid du Colombier 
12457dd7cddfSDavid du Colombier ulong	thash1	= 0x2edab8c9;
12467dd7cddfSDavid du Colombier ulong	thash2	= 0x1dc74fb8;
12477dd7cddfSDavid du Colombier ulong	thash3	= 0x1f241331;
12487dd7cddfSDavid du Colombier ulong	thash[NALLTYPES];
12497dd7cddfSDavid du Colombier Init	thashinit[] =
12503e12c5d1SDavid du Colombier {
12517dd7cddfSDavid du Colombier 	TXXX,		0x17527bbd,	0,
12527dd7cddfSDavid du Colombier 	TCHAR,		0x5cedd32b,	0,
12537dd7cddfSDavid du Colombier 	TUCHAR,		0x552c4454,	0,
12547dd7cddfSDavid du Colombier 	TSHORT,		0x63040b4b,	0,
12557dd7cddfSDavid du Colombier 	TUSHORT,	0x32a45878,	0,
12567dd7cddfSDavid du Colombier 	TINT,		0x4151d5bd,	0,
12577dd7cddfSDavid du Colombier 	TUINT,		0x5ae707d6,	0,
12587dd7cddfSDavid du Colombier 	TLONG,		0x5ef20f47,	0,
12597dd7cddfSDavid du Colombier 	TULONG,		0x36d8eb8f,	0,
12607dd7cddfSDavid du Colombier 	TVLONG,		0x6e5e9590,	0,
12617dd7cddfSDavid du Colombier 	TUVLONG,	0x75910105,	0,
12627dd7cddfSDavid du Colombier 	TFLOAT,		0x25fd7af1,	0,
12637dd7cddfSDavid du Colombier 	TDOUBLE,	0x7c40a1b2,	0,
12647dd7cddfSDavid du Colombier 	TIND,		0x1b832357,	0,
12657dd7cddfSDavid du Colombier 	TFUNC,		0x6babc9cb,	0,
12667dd7cddfSDavid du Colombier 	TARRAY,		0x7c50986d,	0,
12677dd7cddfSDavid du Colombier 	TVOID,		0x44112eff,	0,
12687dd7cddfSDavid du Colombier 	TSTRUCT,	0x7c2da3bf,	0,
12697dd7cddfSDavid du Colombier 	TUNION,		0x3eb25e98,	0,
12707dd7cddfSDavid du Colombier 	TENUM,		0x44b54f61,	0,
12717dd7cddfSDavid du Colombier 	TFILE,		0x19242ac3,	0,
12727dd7cddfSDavid du Colombier 	TOLD,		0x22b15988,	0,
12737dd7cddfSDavid du Colombier 	TDOT,		0x0204f6b3,	0,
12747dd7cddfSDavid du Colombier 	-1,		0,		0,
12753e12c5d1SDavid du Colombier };
12767dd7cddfSDavid du Colombier 
12777dd7cddfSDavid du Colombier char*	bnames[NALIGN];
12787dd7cddfSDavid du Colombier Init	bnamesinit[] =
12793e12c5d1SDavid du Colombier {
12807dd7cddfSDavid du Colombier 	Axxx,	0,	"Axxx",
12817dd7cddfSDavid du Colombier 	Ael1,	0,	"el1",
12827dd7cddfSDavid du Colombier 	Ael2,	0,	"el2",
12837dd7cddfSDavid du Colombier 	Asu2,	0,	"su2",
12847dd7cddfSDavid du Colombier 	Aarg0,	0,	"arg0",
12857dd7cddfSDavid du Colombier 	Aarg1,	0,	"arg1",
12867dd7cddfSDavid du Colombier 	Aarg2,	0,	"arg2",
12877dd7cddfSDavid du Colombier 	Aaut3,	0,	"aut3",
12887dd7cddfSDavid du Colombier 	-1,	0,	0,
12893e12c5d1SDavid du Colombier };
12907dd7cddfSDavid du Colombier 
12917dd7cddfSDavid du Colombier char*	tnames[NALLTYPES];
12927dd7cddfSDavid du Colombier Init	tnamesinit[] =
12933e12c5d1SDavid du Colombier {
12947dd7cddfSDavid du Colombier 	TXXX,		0,	"TXXX",
12957dd7cddfSDavid du Colombier 	TCHAR,		0,	"CHAR",
12967dd7cddfSDavid du Colombier 	TUCHAR,		0,	"UCHAR",
12977dd7cddfSDavid du Colombier 	TSHORT,		0,	"SHORT",
12987dd7cddfSDavid du Colombier 	TUSHORT,	0,	"USHORT",
12997dd7cddfSDavid du Colombier 	TINT,		0,	"INT",
13007dd7cddfSDavid du Colombier 	TUINT,		0,	"UINT",
13017dd7cddfSDavid du Colombier 	TLONG,		0,	"LONG",
13027dd7cddfSDavid du Colombier 	TULONG,		0,	"ULONG",
13037dd7cddfSDavid du Colombier 	TVLONG,		0,	"VLONG",
13047dd7cddfSDavid du Colombier 	TUVLONG,	0,	"UVLONG",
13057dd7cddfSDavid du Colombier 	TFLOAT,		0,	"FLOAT",
13067dd7cddfSDavid du Colombier 	TDOUBLE,	0,	"DOUBLE",
13077dd7cddfSDavid du Colombier 	TIND,		0,	"IND",
13087dd7cddfSDavid du Colombier 	TFUNC,		0,	"FUNC",
13097dd7cddfSDavid du Colombier 	TARRAY,		0,	"ARRAY",
13107dd7cddfSDavid du Colombier 	TVOID,		0,	"VOID",
13117dd7cddfSDavid du Colombier 	TSTRUCT,	0,	"STRUCT",
13127dd7cddfSDavid du Colombier 	TUNION,		0,	"UNION",
13137dd7cddfSDavid du Colombier 	TENUM,		0,	"ENUM",
13147dd7cddfSDavid du Colombier 	TFILE,		0,	"FILE",
13157dd7cddfSDavid du Colombier 	TOLD,		0,	"OLD",
13167dd7cddfSDavid du Colombier 	TDOT,		0,	"DOT",
13177dd7cddfSDavid du Colombier 	-1,		0,	0,
13183e12c5d1SDavid du Colombier };
13197dd7cddfSDavid du Colombier 
13207dd7cddfSDavid du Colombier char*	gnames[NGTYPES];
13217dd7cddfSDavid du Colombier Init	gnamesinit[] =
13223e12c5d1SDavid du Colombier {
13237dd7cddfSDavid du Colombier 	GXXX,			0,	"GXXX",
13247dd7cddfSDavid du Colombier 	GCONSTNT,		0,	"CONST",
13257dd7cddfSDavid du Colombier 	GVOLATILE,		0,	"VOLATILE",
13267dd7cddfSDavid du Colombier 	GVOLATILE|GCONSTNT,	0,	"CONST-VOLATILE",
13277dd7cddfSDavid du Colombier 	-1,			0,	0,
13287dd7cddfSDavid du Colombier };
13297dd7cddfSDavid du Colombier 
13307dd7cddfSDavid du Colombier char*	qnames[NALLTYPES];
13317dd7cddfSDavid du Colombier Init	qnamesinit[] =
13327dd7cddfSDavid du Colombier {
13337dd7cddfSDavid du Colombier 	TXXX,		0,	"TXXX",
13347dd7cddfSDavid du Colombier 	TCHAR,		0,	"CHAR",
13357dd7cddfSDavid du Colombier 	TUCHAR,		0,	"UCHAR",
13367dd7cddfSDavid du Colombier 	TSHORT,		0,	"SHORT",
13377dd7cddfSDavid du Colombier 	TUSHORT,	0,	"USHORT",
13387dd7cddfSDavid du Colombier 	TINT,		0,	"INT",
13397dd7cddfSDavid du Colombier 	TUINT,		0,	"UINT",
13407dd7cddfSDavid du Colombier 	TLONG,		0,	"LONG",
13417dd7cddfSDavid du Colombier 	TULONG,		0,	"ULONG",
13427dd7cddfSDavid du Colombier 	TVLONG,		0,	"VLONG",
13437dd7cddfSDavid du Colombier 	TUVLONG,	0,	"UVLONG",
13447dd7cddfSDavid du Colombier 	TFLOAT,		0,	"FLOAT",
13457dd7cddfSDavid du Colombier 	TDOUBLE,	0,	"DOUBLE",
13467dd7cddfSDavid du Colombier 	TIND,		0,	"IND",
13477dd7cddfSDavid du Colombier 	TFUNC,		0,	"FUNC",
13487dd7cddfSDavid du Colombier 	TARRAY,		0,	"ARRAY",
13497dd7cddfSDavid du Colombier 	TVOID,		0,	"VOID",
13507dd7cddfSDavid du Colombier 	TSTRUCT,	0,	"STRUCT",
13517dd7cddfSDavid du Colombier 	TUNION,		0,	"UNION",
13527dd7cddfSDavid du Colombier 	TENUM,		0,	"ENUM",
13537dd7cddfSDavid du Colombier 
13547dd7cddfSDavid du Colombier 	TAUTO,		0,	"AUTO",
13557dd7cddfSDavid du Colombier 	TEXTERN,	0,	"EXTERN",
13567dd7cddfSDavid du Colombier 	TSTATIC,	0,	"STATIC",
13577dd7cddfSDavid du Colombier 	TTYPEDEF,	0,	"TYPEDEF",
135880ee5cbfSDavid du Colombier 	TTYPESTR,	0,	"TYPESTR",
13597dd7cddfSDavid du Colombier 	TREGISTER,	0,	"REGISTER",
13607dd7cddfSDavid du Colombier 	TCONSTNT,	0,	"CONSTNT",
13617dd7cddfSDavid du Colombier 	TVOLATILE,	0,	"VOLATILE",
13627dd7cddfSDavid du Colombier 	TUNSIGNED,	0,	"UNSIGNED",
13637dd7cddfSDavid du Colombier 	TSIGNED,	0,	"SIGNED",
13647dd7cddfSDavid du Colombier 	TDOT,		0,	"DOT",
13657dd7cddfSDavid du Colombier 	TFILE,		0,	"FILE",
13667dd7cddfSDavid du Colombier 	TOLD,		0,	"OLD",
13677dd7cddfSDavid du Colombier 	-1,		0,	0,
13687dd7cddfSDavid du Colombier };
13697dd7cddfSDavid du Colombier char*	cnames[NCTYPES];
13707dd7cddfSDavid du Colombier Init	cnamesinit[] =
13717dd7cddfSDavid du Colombier {
13727dd7cddfSDavid du Colombier 	CXXX,		0,	"CXXX",
13737dd7cddfSDavid du Colombier 	CAUTO,		0,	"AUTO",
13747dd7cddfSDavid du Colombier 	CEXTERN,	0,	"EXTERN",
13757dd7cddfSDavid du Colombier 	CGLOBL,		0,	"GLOBL",
13767dd7cddfSDavid du Colombier 	CSTATIC,	0,	"STATIC",
13777dd7cddfSDavid du Colombier 	CLOCAL,		0,	"LOCAL",
13787dd7cddfSDavid du Colombier 	CTYPEDEF,	0,	"TYPEDEF",
137980ee5cbfSDavid du Colombier 	CTYPESTR,	0,	"TYPESTR",
13807dd7cddfSDavid du Colombier 	CPARAM,		0,	"PARAM",
13817dd7cddfSDavid du Colombier 	CSELEM,		0,	"SELEM",
13827dd7cddfSDavid du Colombier 	CLABEL,		0,	"LABEL",
13837dd7cddfSDavid du Colombier 	CEXREG,		0,	"EXREG",
13847dd7cddfSDavid du Colombier 	-1,		0,	0,
13857dd7cddfSDavid du Colombier };
13867dd7cddfSDavid du Colombier 
13877dd7cddfSDavid du Colombier char*	onames[OEND+1];
13887dd7cddfSDavid du Colombier Init	onamesinit[] =
13897dd7cddfSDavid du Colombier {
13907dd7cddfSDavid du Colombier 	OXXX,		0,	"OXXX",
13917dd7cddfSDavid du Colombier 	OADD,		0,	"ADD",
13927dd7cddfSDavid du Colombier 	OADDR,		0,	"ADDR",
13937dd7cddfSDavid du Colombier 	OAND,		0,	"AND",
13947dd7cddfSDavid du Colombier 	OANDAND,	0,	"ANDAND",
13957dd7cddfSDavid du Colombier 	OARRAY,		0,	"ARRAY",
13967dd7cddfSDavid du Colombier 	OAS,		0,	"AS",
13977dd7cddfSDavid du Colombier 	OASI,		0,	"ASI",
13987dd7cddfSDavid du Colombier 	OASADD,		0,	"ASADD",
13997dd7cddfSDavid du Colombier 	OASAND,		0,	"ASAND",
14007dd7cddfSDavid du Colombier 	OASASHL,	0,	"ASASHL",
14017dd7cddfSDavid du Colombier 	OASASHR,	0,	"ASASHR",
14027dd7cddfSDavid du Colombier 	OASDIV,		0,	"ASDIV",
14037dd7cddfSDavid du Colombier 	OASHL,		0,	"ASHL",
14047dd7cddfSDavid du Colombier 	OASHR,		0,	"ASHR",
14057dd7cddfSDavid du Colombier 	OASLDIV,	0,	"ASLDIV",
14067dd7cddfSDavid du Colombier 	OASLMOD,	0,	"ASLMOD",
14077dd7cddfSDavid du Colombier 	OASLMUL,	0,	"ASLMUL",
14087dd7cddfSDavid du Colombier 	OASLSHR,	0,	"ASLSHR",
14097dd7cddfSDavid du Colombier 	OASMOD,		0,	"ASMOD",
14107dd7cddfSDavid du Colombier 	OASMUL,		0,	"ASMUL",
14117dd7cddfSDavid du Colombier 	OASOR,		0,	"ASOR",
14127dd7cddfSDavid du Colombier 	OASSUB,		0,	"ASSUB",
14137dd7cddfSDavid du Colombier 	OASXOR,		0,	"ASXOR",
14147dd7cddfSDavid du Colombier 	OBIT,		0,	"BIT",
14157dd7cddfSDavid du Colombier 	OBREAK,		0,	"BREAK",
14167dd7cddfSDavid du Colombier 	OCASE,		0,	"CASE",
14177dd7cddfSDavid du Colombier 	OCAST,		0,	"CAST",
14187dd7cddfSDavid du Colombier 	OCOMMA,		0,	"COMMA",
14197dd7cddfSDavid du Colombier 	OCOND,		0,	"COND",
14207dd7cddfSDavid du Colombier 	OCONST,		0,	"CONST",
14217dd7cddfSDavid du Colombier 	OCONTINUE,	0,	"CONTINUE",
14227dd7cddfSDavid du Colombier 	ODIV,		0,	"DIV",
14237dd7cddfSDavid du Colombier 	ODOT,		0,	"DOT",
14247dd7cddfSDavid du Colombier 	ODOTDOT,	0,	"DOTDOT",
14257dd7cddfSDavid du Colombier 	ODWHILE,	0,	"DWHILE",
14267dd7cddfSDavid du Colombier 	OENUM,		0,	"ENUM",
14277dd7cddfSDavid du Colombier 	OEQ,		0,	"EQ",
14287dd7cddfSDavid du Colombier 	OFOR,		0,	"FOR",
14297dd7cddfSDavid du Colombier 	OFUNC,		0,	"FUNC",
14307dd7cddfSDavid du Colombier 	OGE,		0,	"GE",
14317dd7cddfSDavid du Colombier 	OGOTO,		0,	"GOTO",
14327dd7cddfSDavid du Colombier 	OGT,		0,	"GT",
14337dd7cddfSDavid du Colombier 	OHI,		0,	"HI",
14347dd7cddfSDavid du Colombier 	OHS,		0,	"HS",
14357dd7cddfSDavid du Colombier 	OIF,		0,	"IF",
14367dd7cddfSDavid du Colombier 	OIND,		0,	"IND",
14377dd7cddfSDavid du Colombier 	OINDREG,	0,	"INDREG",
14387dd7cddfSDavid du Colombier 	OINIT,		0,	"INIT",
14397dd7cddfSDavid du Colombier 	OLABEL,		0,	"LABEL",
14407dd7cddfSDavid du Colombier 	OLDIV,		0,	"LDIV",
14417dd7cddfSDavid du Colombier 	OLE,		0,	"LE",
14427dd7cddfSDavid du Colombier 	OLIST,		0,	"LIST",
14437dd7cddfSDavid du Colombier 	OLMOD,		0,	"LMOD",
14447dd7cddfSDavid du Colombier 	OLMUL,		0,	"LMUL",
14457dd7cddfSDavid du Colombier 	OLO,		0,	"LO",
14467dd7cddfSDavid du Colombier 	OLS,		0,	"LS",
14477dd7cddfSDavid du Colombier 	OLSHR,		0,	"LSHR",
14487dd7cddfSDavid du Colombier 	OLT,		0,	"LT",
14497dd7cddfSDavid du Colombier 	OMOD,		0,	"MOD",
14507dd7cddfSDavid du Colombier 	OMUL,		0,	"MUL",
14517dd7cddfSDavid du Colombier 	ONAME,		0,	"NAME",
14527dd7cddfSDavid du Colombier 	ONE,		0,	"NE",
14537dd7cddfSDavid du Colombier 	ONOT,		0,	"NOT",
14547dd7cddfSDavid du Colombier 	OOR,		0,	"OR",
14557dd7cddfSDavid du Colombier 	OOROR,		0,	"OROR",
14567dd7cddfSDavid du Colombier 	OPOSTDEC,	0,	"POSTDEC",
14577dd7cddfSDavid du Colombier 	OPOSTINC,	0,	"POSTINC",
14587dd7cddfSDavid du Colombier 	OPREDEC,	0,	"PREDEC",
14597dd7cddfSDavid du Colombier 	OPREINC,	0,	"PREINC",
14607dd7cddfSDavid du Colombier 	OPROTO,		0,	"PROTO",
14617dd7cddfSDavid du Colombier 	OREGISTER,	0,	"REGISTER",
14627dd7cddfSDavid du Colombier 	ORETURN,	0,	"RETURN",
14637dd7cddfSDavid du Colombier 	OSET,		0,	"SET",
14647dd7cddfSDavid du Colombier 	OSIGN,		0,	"SIGN",
14657dd7cddfSDavid du Colombier 	OSIZE,		0,	"SIZE",
14667dd7cddfSDavid du Colombier 	OSTRING,	0,	"STRING",
14677dd7cddfSDavid du Colombier 	OLSTRING,	0,	"LSTRING",
14687dd7cddfSDavid du Colombier 	OSTRUCT,	0,	"STRUCT",
14697dd7cddfSDavid du Colombier 	OSUB,		0,	"SUB",
14707dd7cddfSDavid du Colombier 	OSWITCH,	0,	"SWITCH",
14717dd7cddfSDavid du Colombier 	OUNION,		0,	"UNION",
14727dd7cddfSDavid du Colombier 	OUSED,		0,	"USED",
14737dd7cddfSDavid du Colombier 	OWHILE,		0,	"WHILE",
14747dd7cddfSDavid du Colombier 	OXOR,		0,	"XOR",
147580ee5cbfSDavid du Colombier 	OPOS,		0,	"POS",
14767dd7cddfSDavid du Colombier 	ONEG,		0,	"NEG",
14777dd7cddfSDavid du Colombier 	OCOM,		0,	"COM",
14787dd7cddfSDavid du Colombier 	OELEM,		0,	"ELEM",
14797dd7cddfSDavid du Colombier 	OTST,		0,	"TST",
14807dd7cddfSDavid du Colombier 	OINDEX,		0,	"INDEX",
14817dd7cddfSDavid du Colombier 	OFAS,		0,	"FAS",
1482da51d93aSDavid du Colombier 	OREGPAIR,	0,	"REGPAIR",
14837dd7cddfSDavid du Colombier 	OEND,		0,	"END",
14847dd7cddfSDavid du Colombier 	-1,		0,	0,
14853e12c5d1SDavid du Colombier };
14863e12c5d1SDavid du Colombier 
148722a127bbSDavid du Colombier /*	OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
14883e12c5d1SDavid du Colombier char	comrel[12] =
14893e12c5d1SDavid du Colombier {
14903e12c5d1SDavid du Colombier 	ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
14913e12c5d1SDavid du Colombier };
14923e12c5d1SDavid du Colombier char	invrel[12] =
14933e12c5d1SDavid du Colombier {
14943e12c5d1SDavid du Colombier 	OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
14953e12c5d1SDavid du Colombier };
14963e12c5d1SDavid du Colombier char	logrel[12] =
14973e12c5d1SDavid du Colombier {
14983e12c5d1SDavid du Colombier 	OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
14993e12c5d1SDavid du Colombier };
15003e12c5d1SDavid du Colombier 
15017dd7cddfSDavid du Colombier char	typei[NTYPE];
15027dd7cddfSDavid du Colombier int	typeiinit[] =
15037dd7cddfSDavid du Colombier {
15047dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
15057dd7cddfSDavid du Colombier };
15067dd7cddfSDavid du Colombier char	typeu[NTYPE];
15077dd7cddfSDavid du Colombier int	typeuinit[] =
15087dd7cddfSDavid du Colombier {
15097dd7cddfSDavid du Colombier 	TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
15107dd7cddfSDavid du Colombier };
1511219b2ee8SDavid du Colombier 
15127dd7cddfSDavid du Colombier char	typesuv[NTYPE];
15137dd7cddfSDavid du Colombier int	typesuvinit[] =
15147dd7cddfSDavid du Colombier {
15157dd7cddfSDavid du Colombier 	TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
15167dd7cddfSDavid du Colombier };
15173e12c5d1SDavid du Colombier 
15187dd7cddfSDavid du Colombier char	typeilp[NTYPE];
15197dd7cddfSDavid du Colombier int	typeilpinit[] =
15207dd7cddfSDavid du Colombier {
15217dd7cddfSDavid du Colombier 	TINT, TUINT, TLONG, TULONG, TIND, -1
15227dd7cddfSDavid du Colombier };
1523219b2ee8SDavid du Colombier 
15247dd7cddfSDavid du Colombier char	typechl[NTYPE];
1525da51d93aSDavid du Colombier char	typechlv[NTYPE];
152622a127bbSDavid du Colombier char typechlvp[NTYPE];
15277dd7cddfSDavid du Colombier int	typechlinit[] =
15283e12c5d1SDavid du Colombier {
15297dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
15303e12c5d1SDavid du Colombier };
15317dd7cddfSDavid du Colombier 
15327dd7cddfSDavid du Colombier char	typechlp[NTYPE];
15337dd7cddfSDavid du Colombier int	typechlpinit[] =
15343e12c5d1SDavid du Colombier {
15357dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
15363e12c5d1SDavid du Colombier };
15377dd7cddfSDavid du Colombier 
15387dd7cddfSDavid du Colombier char	typechlpfd[NTYPE];
15397dd7cddfSDavid du Colombier int	typechlpfdinit[] =
15403e12c5d1SDavid du Colombier {
15417dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
15423e12c5d1SDavid du Colombier };
15437dd7cddfSDavid du Colombier 
15447dd7cddfSDavid du Colombier char	typec[NTYPE];
15457dd7cddfSDavid du Colombier int	typecinit[] =
15463e12c5d1SDavid du Colombier {
15477dd7cddfSDavid du Colombier 	TCHAR, TUCHAR, -1
15483e12c5d1SDavid du Colombier };
15497dd7cddfSDavid du Colombier 
15507dd7cddfSDavid du Colombier char	typeh[NTYPE];
15517dd7cddfSDavid du Colombier int	typehinit[] =
15523e12c5d1SDavid du Colombier {
15537dd7cddfSDavid du Colombier 	TSHORT, TUSHORT, -1,
15543e12c5d1SDavid du Colombier };
15557dd7cddfSDavid du Colombier 
15567dd7cddfSDavid du Colombier char	typeil[NTYPE];
15577dd7cddfSDavid du Colombier int	typeilinit[] =
15583e12c5d1SDavid du Colombier {
15597dd7cddfSDavid du Colombier 	TINT, TUINT, TLONG, TULONG, -1,
15603e12c5d1SDavid du Colombier };
15617dd7cddfSDavid du Colombier 
15627dd7cddfSDavid du Colombier char	typev[NTYPE];
15637dd7cddfSDavid du Colombier int	typevinit[] =
15643e12c5d1SDavid du Colombier {
15657dd7cddfSDavid du Colombier 	TVLONG,	TUVLONG, -1,
15663e12c5d1SDavid du Colombier };
15677dd7cddfSDavid du Colombier 
15687dd7cddfSDavid du Colombier char	typefd[NTYPE];
15697dd7cddfSDavid du Colombier int	typefdinit[] =
15703e12c5d1SDavid du Colombier {
15717dd7cddfSDavid du Colombier 	TFLOAT, TDOUBLE, -1,
15723e12c5d1SDavid du Colombier };
15737dd7cddfSDavid du Colombier 
15747dd7cddfSDavid du Colombier char	typeaf[NTYPE];
15757dd7cddfSDavid du Colombier int	typeafinit[] =
15763e12c5d1SDavid du Colombier {
15777dd7cddfSDavid du Colombier 	TFUNC, TARRAY, -1,
15783e12c5d1SDavid du Colombier };
15797dd7cddfSDavid du Colombier 
15807dd7cddfSDavid du Colombier char	typesu[NTYPE];
15817dd7cddfSDavid du Colombier int	typesuinit[] =
15827dd7cddfSDavid du Colombier {
15837dd7cddfSDavid du Colombier 	TSTRUCT, TUNION, -1,
15847dd7cddfSDavid du Colombier };
15857dd7cddfSDavid du Colombier 
15867dd7cddfSDavid du Colombier long	tasign[NTYPE];
15877dd7cddfSDavid du Colombier Init	tasigninit[] =
15887dd7cddfSDavid du Colombier {
15897dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
15907dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
15917dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
15927dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
15937dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
15947dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
15957dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
15967dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
15977dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
15987dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
15997dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16007dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16017dd7cddfSDavid du Colombier 	TIND,		BIND,		0,
16027dd7cddfSDavid du Colombier 	TSTRUCT,	BSTRUCT,	0,
16037dd7cddfSDavid du Colombier 	TUNION,		BUNION,		0,
16047dd7cddfSDavid du Colombier 	-1,		0,		0,
16057dd7cddfSDavid du Colombier };
16067dd7cddfSDavid du Colombier 
16077dd7cddfSDavid du Colombier long	tasadd[NTYPE];
16087dd7cddfSDavid du Colombier Init	tasaddinit[] =
16097dd7cddfSDavid du Colombier {
16107dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
16117dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
16127dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
16137dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
16147dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
16157dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
16167dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
16177dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
16187dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
16197dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
16207dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16217dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16227dd7cddfSDavid du Colombier 	TIND,		BINTEGER,	0,
16237dd7cddfSDavid du Colombier 	-1,		0,		0,
16247dd7cddfSDavid du Colombier };
16257dd7cddfSDavid du Colombier 
16267dd7cddfSDavid du Colombier long	tcast[NTYPE];
16277dd7cddfSDavid du Colombier Init	tcastinit[] =
16287dd7cddfSDavid du Colombier {
16297dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER|BIND|BVOID,	0,
16307dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER|BIND|BVOID,	0,
16317dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER|BIND|BVOID,	0,
16327dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER|BIND|BVOID,	0,
16337dd7cddfSDavid du Colombier 	TINT,		BNUMBER|BIND|BVOID,	0,
16347dd7cddfSDavid du Colombier 	TUINT,		BNUMBER|BIND|BVOID,	0,
16357dd7cddfSDavid du Colombier 	TLONG,		BNUMBER|BIND|BVOID,	0,
16367dd7cddfSDavid du Colombier 	TULONG,		BNUMBER|BIND|BVOID,	0,
16377dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER|BIND|BVOID,	0,
16387dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER|BIND|BVOID,	0,
16397dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER|BVOID,		0,
16407dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER|BVOID,		0,
16417dd7cddfSDavid du Colombier 	TIND,		BINTEGER|BIND|BVOID,	0,
16427dd7cddfSDavid du Colombier 	TVOID,		BVOID,			0,
16437dd7cddfSDavid du Colombier 	TSTRUCT,	BSTRUCT|BVOID,		0,
16447dd7cddfSDavid du Colombier 	TUNION,		BUNION|BVOID,		0,
16457dd7cddfSDavid du Colombier 	-1,		0,			0,
16467dd7cddfSDavid du Colombier };
16477dd7cddfSDavid du Colombier 
16487dd7cddfSDavid du Colombier long	tadd[NTYPE];
16497dd7cddfSDavid du Colombier Init	taddinit[] =
16507dd7cddfSDavid du Colombier {
16517dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER|BIND,	0,
16527dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER|BIND,	0,
16537dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER|BIND,	0,
16547dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER|BIND,	0,
16557dd7cddfSDavid du Colombier 	TINT,		BNUMBER|BIND,	0,
16567dd7cddfSDavid du Colombier 	TUINT,		BNUMBER|BIND,	0,
16577dd7cddfSDavid du Colombier 	TLONG,		BNUMBER|BIND,	0,
16587dd7cddfSDavid du Colombier 	TULONG,		BNUMBER|BIND,	0,
16597dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER|BIND,	0,
16607dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER|BIND,	0,
16617dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16627dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16637dd7cddfSDavid du Colombier 	TIND,		BINTEGER,	0,
16647dd7cddfSDavid du Colombier 	-1,		0,		0,
16657dd7cddfSDavid du Colombier };
16667dd7cddfSDavid du Colombier 
16677dd7cddfSDavid du Colombier long	tsub[NTYPE];
16687dd7cddfSDavid du Colombier Init	tsubinit[] =
16697dd7cddfSDavid du Colombier {
16707dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
16717dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
16727dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
16737dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
16747dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
16757dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
16767dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
16777dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
16787dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
16797dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
16807dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
16817dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
16827dd7cddfSDavid du Colombier 	TIND,		BINTEGER|BIND,	0,
16837dd7cddfSDavid du Colombier 	-1,		0,		0,
16847dd7cddfSDavid du Colombier };
16857dd7cddfSDavid du Colombier 
16867dd7cddfSDavid du Colombier long	tmul[NTYPE];
16877dd7cddfSDavid du Colombier Init	tmulinit[] =
16887dd7cddfSDavid du Colombier {
16897dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
16907dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
16917dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
16927dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
16937dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
16947dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
16957dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
16967dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
16977dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
16987dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
16997dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
17007dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
17017dd7cddfSDavid du Colombier 	-1,		0,		0,
17027dd7cddfSDavid du Colombier };
17037dd7cddfSDavid du Colombier 
17047dd7cddfSDavid du Colombier long	tand[NTYPE];
17057dd7cddfSDavid du Colombier Init	tandinit[] =
17067dd7cddfSDavid du Colombier {
17077dd7cddfSDavid du Colombier 	TCHAR,		BINTEGER,	0,
17087dd7cddfSDavid du Colombier 	TUCHAR,		BINTEGER,	0,
17097dd7cddfSDavid du Colombier 	TSHORT,		BINTEGER,	0,
17107dd7cddfSDavid du Colombier 	TUSHORT,	BINTEGER,	0,
17117dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
17127dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
17137dd7cddfSDavid du Colombier 	TLONG,		BINTEGER,	0,
17147dd7cddfSDavid du Colombier 	TULONG,		BINTEGER,	0,
17157dd7cddfSDavid du Colombier 	TVLONG,		BINTEGER,	0,
17167dd7cddfSDavid du Colombier 	TUVLONG,	BINTEGER,	0,
17177dd7cddfSDavid du Colombier 	-1,		0,		0,
17187dd7cddfSDavid du Colombier };
17197dd7cddfSDavid du Colombier 
17207dd7cddfSDavid du Colombier long	trel[NTYPE];
17217dd7cddfSDavid du Colombier Init	trelinit[] =
17227dd7cddfSDavid du Colombier {
17237dd7cddfSDavid du Colombier 	TCHAR,		BNUMBER,	0,
17247dd7cddfSDavid du Colombier 	TUCHAR,		BNUMBER,	0,
17257dd7cddfSDavid du Colombier 	TSHORT,		BNUMBER,	0,
17267dd7cddfSDavid du Colombier 	TUSHORT,	BNUMBER,	0,
17277dd7cddfSDavid du Colombier 	TINT,		BNUMBER,	0,
17287dd7cddfSDavid du Colombier 	TUINT,		BNUMBER,	0,
17297dd7cddfSDavid du Colombier 	TLONG,		BNUMBER,	0,
17307dd7cddfSDavid du Colombier 	TULONG,		BNUMBER,	0,
17317dd7cddfSDavid du Colombier 	TVLONG,		BNUMBER,	0,
17327dd7cddfSDavid du Colombier 	TUVLONG,	BNUMBER,	0,
17337dd7cddfSDavid du Colombier 	TFLOAT,		BNUMBER,	0,
17347dd7cddfSDavid du Colombier 	TDOUBLE,	BNUMBER,	0,
17357dd7cddfSDavid du Colombier 	TIND,		BIND,		0,
17367dd7cddfSDavid du Colombier 	-1,		0,		0,
17377dd7cddfSDavid du Colombier };
17387dd7cddfSDavid du Colombier 
17393e12c5d1SDavid du Colombier long	tfunct[1] =
17403e12c5d1SDavid du Colombier {
17417dd7cddfSDavid du Colombier 	BFUNC,
17423e12c5d1SDavid du Colombier };
17437dd7cddfSDavid du Colombier 
17443e12c5d1SDavid du Colombier long	tindir[1] =
17453e12c5d1SDavid du Colombier {
17467dd7cddfSDavid du Colombier 	BIND,
17473e12c5d1SDavid du Colombier };
17487dd7cddfSDavid du Colombier 
17493e12c5d1SDavid du Colombier long	tdot[1] =
17503e12c5d1SDavid du Colombier {
17517dd7cddfSDavid du Colombier 	BSTRUCT|BUNION,
17523e12c5d1SDavid du Colombier };
17537dd7cddfSDavid du Colombier 
17543e12c5d1SDavid du Colombier long	tnot[1] =
17553e12c5d1SDavid du Colombier {
17567dd7cddfSDavid du Colombier 	BNUMBER|BIND,
17573e12c5d1SDavid du Colombier };
17587dd7cddfSDavid du Colombier 
17593e12c5d1SDavid du Colombier long	targ[1] =
17603e12c5d1SDavid du Colombier {
17617dd7cddfSDavid du Colombier 	BNUMBER|BIND|BSTRUCT|BUNION,
17623e12c5d1SDavid du Colombier };
17633e12c5d1SDavid du Colombier 
17643e12c5d1SDavid du Colombier char	tab[NTYPE][NTYPE] =
17653e12c5d1SDavid du Colombier {
17667dd7cddfSDavid du Colombier /*TXXX*/	{ 0,
17677dd7cddfSDavid du Colombier 		},
17687dd7cddfSDavid du Colombier 
17697dd7cddfSDavid du Colombier /*TCHAR*/	{ 0,	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
17707dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17717dd7cddfSDavid du Colombier 		},
17727dd7cddfSDavid du Colombier /*TUCHAR*/	{ 0,	TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
17737dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17747dd7cddfSDavid du Colombier 		},
17757dd7cddfSDavid du Colombier /*TSHORT*/	{ 0,	TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
17767dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17777dd7cddfSDavid du Colombier 		},
17787dd7cddfSDavid du Colombier /*TUSHORT*/	{ 0,	TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
17797dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17807dd7cddfSDavid du Colombier 		},
17817dd7cddfSDavid du Colombier /*TINT*/	{ 0,	TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
17827dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17837dd7cddfSDavid du Colombier 		},
17847dd7cddfSDavid du Colombier /*TUINT*/	{ 0,	TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
17857dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17867dd7cddfSDavid du Colombier 		},
17877dd7cddfSDavid du Colombier /*TLONG*/	{ 0,	TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
17887dd7cddfSDavid du Colombier 			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17897dd7cddfSDavid du Colombier 		},
17907dd7cddfSDavid du Colombier /*TULONG*/	{ 0,	TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
17917dd7cddfSDavid du Colombier 			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17927dd7cddfSDavid du Colombier 		},
17937dd7cddfSDavid du Colombier /*TVLONG*/	{ 0,	TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
17947dd7cddfSDavid du Colombier 			TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17957dd7cddfSDavid du Colombier 		},
17967dd7cddfSDavid du Colombier /*TUVLONG*/	{ 0,	TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
17977dd7cddfSDavid du Colombier 			TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
17987dd7cddfSDavid du Colombier 		},
17997dd7cddfSDavid du Colombier /*TFLOAT*/	{ 0,	TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
18007dd7cddfSDavid du Colombier 			TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
18017dd7cddfSDavid du Colombier 		},
18027dd7cddfSDavid du Colombier /*TDOUBLE*/	{ 0,	TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
18037dd7cddfSDavid du Colombier 			TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
18047dd7cddfSDavid du Colombier 		},
18057dd7cddfSDavid du Colombier /*TIND*/	{ 0,	TIND, TIND, TIND, TIND, TIND, TIND, TIND,
18067dd7cddfSDavid du Colombier 			 TIND, TIND, TIND, TIND, TIND, TIND,
18077dd7cddfSDavid du Colombier 		},
18083e12c5d1SDavid du Colombier };
18097dd7cddfSDavid du Colombier 
18107dd7cddfSDavid du Colombier void
18117dd7cddfSDavid du Colombier urk(char *name, int max, int i)
18127dd7cddfSDavid du Colombier {
18137dd7cddfSDavid du Colombier 	if(i >= max) {
18147dd7cddfSDavid du Colombier 		fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
18157dd7cddfSDavid du Colombier 		exits("init");
18167dd7cddfSDavid du Colombier 	}
18177dd7cddfSDavid du Colombier }
18187dd7cddfSDavid du Colombier 
18197dd7cddfSDavid du Colombier void
18207dd7cddfSDavid du Colombier tinit(void)
18217dd7cddfSDavid du Colombier {
1822*4ac975e2SDavid du Colombier 	int *ip;
18237dd7cddfSDavid du Colombier 	Init *p;
18247dd7cddfSDavid du Colombier 
18257dd7cddfSDavid du Colombier 	for(p=thashinit; p->code >= 0; p++) {
18267dd7cddfSDavid du Colombier 		urk("thash", nelem(thash), p->code);
18277dd7cddfSDavid du Colombier 		thash[p->code] = p->value;
18287dd7cddfSDavid du Colombier 	}
18297dd7cddfSDavid du Colombier 	for(p=bnamesinit; p->code >= 0; p++) {
18307dd7cddfSDavid du Colombier 		urk("bnames", nelem(bnames), p->code);
18317dd7cddfSDavid du Colombier 		bnames[p->code] = p->s;
18327dd7cddfSDavid du Colombier 	}
18337dd7cddfSDavid du Colombier 	for(p=tnamesinit; p->code >= 0; p++) {
18347dd7cddfSDavid du Colombier 		urk("tnames", nelem(tnames), p->code);
18357dd7cddfSDavid du Colombier 		tnames[p->code] = p->s;
18367dd7cddfSDavid du Colombier 	}
18377dd7cddfSDavid du Colombier 	for(p=gnamesinit; p->code >= 0; p++) {
18387dd7cddfSDavid du Colombier 		urk("gnames", nelem(gnames), p->code);
18397dd7cddfSDavid du Colombier 		gnames[p->code] = p->s;
18407dd7cddfSDavid du Colombier 	}
18417dd7cddfSDavid du Colombier 	for(p=qnamesinit; p->code >= 0; p++) {
18427dd7cddfSDavid du Colombier 		urk("qnames", nelem(qnames), p->code);
18437dd7cddfSDavid du Colombier 		qnames[p->code] = p->s;
18447dd7cddfSDavid du Colombier 	}
18457dd7cddfSDavid du Colombier 	for(p=cnamesinit; p->code >= 0; p++) {
18467dd7cddfSDavid du Colombier 		urk("cnames", nelem(cnames), p->code);
18477dd7cddfSDavid du Colombier 		cnames[p->code] = p->s;
18487dd7cddfSDavid du Colombier 	}
18497dd7cddfSDavid du Colombier 	for(p=onamesinit; p->code >= 0; p++) {
18507dd7cddfSDavid du Colombier 		urk("onames", nelem(onames), p->code);
18517dd7cddfSDavid du Colombier 		onames[p->code] = p->s;
18527dd7cddfSDavid du Colombier 	}
1853*4ac975e2SDavid du Colombier 	for(ip=typeiinit; *ip>=0; ip++) {
1854*4ac975e2SDavid du Colombier 		urk("typei", nelem(typei), *ip);
1855*4ac975e2SDavid du Colombier 		typei[*ip] = 1;
18567dd7cddfSDavid du Colombier 	}
1857*4ac975e2SDavid du Colombier 	for(ip=typeuinit; *ip>=0; ip++) {
1858*4ac975e2SDavid du Colombier 		urk("typeu", nelem(typeu), *ip);
1859*4ac975e2SDavid du Colombier 		typeu[*ip] = 1;
18607dd7cddfSDavid du Colombier 	}
1861*4ac975e2SDavid du Colombier 	for(ip=typesuvinit; *ip>=0; ip++) {
1862*4ac975e2SDavid du Colombier 		urk("typesuv", nelem(typesuv), *ip);
1863*4ac975e2SDavid du Colombier 		typesuv[*ip] = 1;
18647dd7cddfSDavid du Colombier 	}
1865*4ac975e2SDavid du Colombier 	for(ip=typeilpinit; *ip>=0; ip++) {
1866*4ac975e2SDavid du Colombier 		urk("typeilp", nelem(typeilp), *ip);
1867*4ac975e2SDavid du Colombier 		typeilp[*ip] = 1;
18687dd7cddfSDavid du Colombier 	}
1869*4ac975e2SDavid du Colombier 	for(ip=typechlinit; *ip>=0; ip++) {
1870*4ac975e2SDavid du Colombier 		urk("typechl", nelem(typechl), *ip);
1871*4ac975e2SDavid du Colombier 		typechl[*ip] = 1;
1872*4ac975e2SDavid du Colombier 		typechlv[*ip] = 1;
1873*4ac975e2SDavid du Colombier 		typechlvp[*ip] = 1;
18747dd7cddfSDavid du Colombier 	}
1875*4ac975e2SDavid du Colombier 	for(ip=typechlpinit; *ip>=0; ip++) {
1876*4ac975e2SDavid du Colombier 		urk("typechlp", nelem(typechlp), *ip);
1877*4ac975e2SDavid du Colombier 		typechlp[*ip] = 1;
1878*4ac975e2SDavid du Colombier 		typechlvp[*ip] = 1;
18797dd7cddfSDavid du Colombier 	}
1880*4ac975e2SDavid du Colombier 	for(ip=typechlpfdinit; *ip>=0; ip++) {
1881*4ac975e2SDavid du Colombier 		urk("typechlpfd", nelem(typechlpfd), *ip);
1882*4ac975e2SDavid du Colombier 		typechlpfd[*ip] = 1;
18837dd7cddfSDavid du Colombier 	}
1884*4ac975e2SDavid du Colombier 	for(ip=typecinit; *ip>=0; ip++) {
1885*4ac975e2SDavid du Colombier 		urk("typec", nelem(typec), *ip);
1886*4ac975e2SDavid du Colombier 		typec[*ip] = 1;
18877dd7cddfSDavid du Colombier 	}
1888*4ac975e2SDavid du Colombier 	for(ip=typehinit; *ip>=0; ip++) {
1889*4ac975e2SDavid du Colombier 		urk("typeh", nelem(typeh), *ip);
1890*4ac975e2SDavid du Colombier 		typeh[*ip] = 1;
18917dd7cddfSDavid du Colombier 	}
1892*4ac975e2SDavid du Colombier 	for(ip=typeilinit; *ip>=0; ip++) {
1893*4ac975e2SDavid du Colombier 		urk("typeil", nelem(typeil), *ip);
1894*4ac975e2SDavid du Colombier 		typeil[*ip] = 1;
18957dd7cddfSDavid du Colombier 	}
1896*4ac975e2SDavid du Colombier 	for(ip=typevinit; *ip>=0; ip++) {
1897*4ac975e2SDavid du Colombier 		urk("typev", nelem(typev), *ip);
1898*4ac975e2SDavid du Colombier 		typev[*ip] = 1;
1899*4ac975e2SDavid du Colombier 		typechlv[*ip] = 1;
1900*4ac975e2SDavid du Colombier 		typechlvp[*ip] = 1;
19017dd7cddfSDavid du Colombier 	}
1902*4ac975e2SDavid du Colombier 	for(ip=typefdinit; *ip>=0; ip++) {
1903*4ac975e2SDavid du Colombier 		urk("typefd", nelem(typefd), *ip);
1904*4ac975e2SDavid du Colombier 		typefd[*ip] = 1;
19057dd7cddfSDavid du Colombier 	}
1906*4ac975e2SDavid du Colombier 	for(ip=typeafinit; *ip>=0; ip++) {
1907*4ac975e2SDavid du Colombier 		urk("typeaf", nelem(typeaf), *ip);
1908*4ac975e2SDavid du Colombier 		typeaf[*ip] = 1;
19097dd7cddfSDavid du Colombier 	}
1910*4ac975e2SDavid du Colombier 	for(ip=typesuinit; *ip >= 0; ip++) {
1911*4ac975e2SDavid du Colombier 		urk("typesu", nelem(typesu), *ip);
1912*4ac975e2SDavid du Colombier 		typesu[*ip] = 1;
19137dd7cddfSDavid du Colombier 	}
19147dd7cddfSDavid du Colombier 	for(p=tasigninit; p->code >= 0; p++) {
19157dd7cddfSDavid du Colombier 		urk("tasign", nelem(tasign), p->code);
19167dd7cddfSDavid du Colombier 		tasign[p->code] = p->value;
19177dd7cddfSDavid du Colombier 	}
19187dd7cddfSDavid du Colombier 	for(p=tasaddinit; p->code >= 0; p++) {
19197dd7cddfSDavid du Colombier 		urk("tasadd", nelem(tasadd), p->code);
19207dd7cddfSDavid du Colombier 		tasadd[p->code] = p->value;
19217dd7cddfSDavid du Colombier 	}
19227dd7cddfSDavid du Colombier 	for(p=tcastinit; p->code >= 0; p++) {
19237dd7cddfSDavid du Colombier 		urk("tcast", nelem(tcast), p->code);
19247dd7cddfSDavid du Colombier 		tcast[p->code] = p->value;
19257dd7cddfSDavid du Colombier 	}
19267dd7cddfSDavid du Colombier 	for(p=taddinit; p->code >= 0; p++) {
19277dd7cddfSDavid du Colombier 		urk("tadd", nelem(tadd), p->code);
19287dd7cddfSDavid du Colombier 		tadd[p->code] = p->value;
19297dd7cddfSDavid du Colombier 	}
19307dd7cddfSDavid du Colombier 	for(p=tsubinit; p->code >= 0; p++) {
19317dd7cddfSDavid du Colombier 		urk("tsub", nelem(tsub), p->code);
19327dd7cddfSDavid du Colombier 		tsub[p->code] = p->value;
19337dd7cddfSDavid du Colombier 	}
19347dd7cddfSDavid du Colombier 	for(p=tmulinit; p->code >= 0; p++) {
19357dd7cddfSDavid du Colombier 		urk("tmul", nelem(tmul), p->code);
19367dd7cddfSDavid du Colombier 		tmul[p->code] = p->value;
19377dd7cddfSDavid du Colombier 	}
19387dd7cddfSDavid du Colombier 	for(p=tandinit; p->code >= 0; p++) {
19397dd7cddfSDavid du Colombier 		urk("tand", nelem(tand), p->code);
19407dd7cddfSDavid du Colombier 		tand[p->code] = p->value;
19417dd7cddfSDavid du Colombier 	}
19427dd7cddfSDavid du Colombier 	for(p=trelinit; p->code >= 0; p++) {
19437dd7cddfSDavid du Colombier 		urk("trel", nelem(trel), p->code);
19447dd7cddfSDavid du Colombier 		trel[p->code] = p->value;
19457dd7cddfSDavid du Colombier 	}
1946*4ac975e2SDavid du Colombier 
1947*4ac975e2SDavid du Colombier 	/* 32-bit defaults */
1948*4ac975e2SDavid du Colombier 	typeword = typechlp;
1949*4ac975e2SDavid du Colombier 	typecmplx = typesuv;
19507dd7cddfSDavid du Colombier }
19519a747e4fSDavid du Colombier 
1952*4ac975e2SDavid du Colombier /*
1953*4ac975e2SDavid du Colombier  * return 1 if it is impossible to jump into the middle of n.
1954*4ac975e2SDavid du Colombier  */
19559a747e4fSDavid du Colombier static int
19569a747e4fSDavid du Colombier deadhead(Node *n, int caseok)
19579a747e4fSDavid du Colombier {
19589a747e4fSDavid du Colombier loop:
19599a747e4fSDavid du Colombier 	if(n == Z)
19609a747e4fSDavid du Colombier 		return 1;
19619a747e4fSDavid du Colombier 	switch(n->op) {
19629a747e4fSDavid du Colombier 	case OLIST:
19639a747e4fSDavid du Colombier 		if(!deadhead(n->left, caseok))
19649a747e4fSDavid du Colombier 			return 0;
19659a747e4fSDavid du Colombier 	rloop:
19669a747e4fSDavid du Colombier 		n = n->right;
19679a747e4fSDavid du Colombier 		goto loop;
19689a747e4fSDavid du Colombier 
19699a747e4fSDavid du Colombier 	case ORETURN:
19709a747e4fSDavid du Colombier 		break;
19719a747e4fSDavid du Colombier 
19729a747e4fSDavid du Colombier 	case OLABEL:
19739a747e4fSDavid du Colombier 		return 0;
19749a747e4fSDavid du Colombier 
19759a747e4fSDavid du Colombier 	case OGOTO:
19769a747e4fSDavid du Colombier 		break;
19779a747e4fSDavid du Colombier 
19789a747e4fSDavid du Colombier 	case OCASE:
19799a747e4fSDavid du Colombier 		if(!caseok)
19809a747e4fSDavid du Colombier 			return 0;
19819a747e4fSDavid du Colombier 		goto rloop;
19829a747e4fSDavid du Colombier 
19839a747e4fSDavid du Colombier 	case OSWITCH:
19849a747e4fSDavid du Colombier 		return deadhead(n->right, 1);
19859a747e4fSDavid du Colombier 
19869a747e4fSDavid du Colombier 	case OWHILE:
19879a747e4fSDavid du Colombier 	case ODWHILE:
19889a747e4fSDavid du Colombier 		goto rloop;
19899a747e4fSDavid du Colombier 
19909a747e4fSDavid du Colombier 	case OFOR:
19919a747e4fSDavid du Colombier 		goto rloop;
19929a747e4fSDavid du Colombier 
19939a747e4fSDavid du Colombier 	case OCONTINUE:
19949a747e4fSDavid du Colombier 		break;
19959a747e4fSDavid du Colombier 
19969a747e4fSDavid du Colombier 	case OBREAK:
19979a747e4fSDavid du Colombier 		break;
19989a747e4fSDavid du Colombier 
19999a747e4fSDavid du Colombier 	case OIF:
20009a747e4fSDavid du Colombier 		return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
20019a747e4fSDavid du Colombier 
20029a747e4fSDavid du Colombier 	case OSET:
20039a747e4fSDavid du Colombier 	case OUSED:
20049a747e4fSDavid du Colombier 		break;
20059a747e4fSDavid du Colombier 	}
20069a747e4fSDavid du Colombier 	return 1;
20079a747e4fSDavid du Colombier }
20089a747e4fSDavid du Colombier 
20099a747e4fSDavid du Colombier int
20109a747e4fSDavid du Colombier deadheads(Node *c)
20119a747e4fSDavid du Colombier {
20129a747e4fSDavid du Colombier 	return deadhead(c->left, 0) && deadhead(c->right, 0);
20139a747e4fSDavid du Colombier }
2014ce941d97SDavid du Colombier 
2015ce941d97SDavid du Colombier int
2016ce941d97SDavid du Colombier mixedasop(Type *l, Type *r)
2017ce941d97SDavid du Colombier {
2018ce941d97SDavid du Colombier 	return !typefd[l->etype] && typefd[r->etype];
2019ce941d97SDavid du Colombier }
2020