xref: /plan9/sys/src/cmd/6c/mul.c (revision e887ea33cf0b0f75911958e2324340660b13e9eb)
1*e887ea33SDavid du Colombier #include "gc.h"
2*e887ea33SDavid du Colombier 
3*e887ea33SDavid du Colombier typedef struct	Malg	Malg;
4*e887ea33SDavid du Colombier typedef struct	Mparam	Mparam;
5*e887ea33SDavid du Colombier 
6*e887ea33SDavid du Colombier struct	Malg
7*e887ea33SDavid du Colombier {
8*e887ea33SDavid du Colombier 	char	vals[10];
9*e887ea33SDavid du Colombier };
10*e887ea33SDavid du Colombier 
11*e887ea33SDavid du Colombier struct	Mparam
12*e887ea33SDavid du Colombier {
13*e887ea33SDavid du Colombier 	ulong	value;
14*e887ea33SDavid du Colombier 	char	alg;
15*e887ea33SDavid du Colombier 	char	neg;
16*e887ea33SDavid du Colombier 	char	shift;
17*e887ea33SDavid du Colombier 	char	arg;
18*e887ea33SDavid du Colombier 	char	off;
19*e887ea33SDavid du Colombier };
20*e887ea33SDavid du Colombier 
21*e887ea33SDavid du Colombier static	Mparam	multab[32];
22*e887ea33SDavid du Colombier static	int	mulptr;
23*e887ea33SDavid du Colombier 
24*e887ea33SDavid du Colombier static	Malg	malgs[]	=
25*e887ea33SDavid du Colombier {
26*e887ea33SDavid du Colombier 	{0, 100},
27*e887ea33SDavid du Colombier 	{-1, 1, 100},
28*e887ea33SDavid du Colombier 	{-9, -5, -3, 3, 5, 9, 100},
29*e887ea33SDavid du Colombier 	{6, 10, 12, 18, 20, 24, 36, 40, 72, 100},
30*e887ea33SDavid du Colombier 	{-8, -4, -2, 2, 4, 8, 100},
31*e887ea33SDavid du Colombier };
32*e887ea33SDavid du Colombier 
33*e887ea33SDavid du Colombier /*
34*e887ea33SDavid du Colombier  * return position of lowest 1
35*e887ea33SDavid du Colombier  */
36*e887ea33SDavid du Colombier int
lowbit(ulong v)37*e887ea33SDavid du Colombier lowbit(ulong v)
38*e887ea33SDavid du Colombier {
39*e887ea33SDavid du Colombier 	int s, i;
40*e887ea33SDavid du Colombier 	ulong m;
41*e887ea33SDavid du Colombier 
42*e887ea33SDavid du Colombier 	s = 0;
43*e887ea33SDavid du Colombier 	m = 0xFFFFFFFFUL;
44*e887ea33SDavid du Colombier 	for(i = 16; i > 0; i >>= 1) {
45*e887ea33SDavid du Colombier 		m >>= i;
46*e887ea33SDavid du Colombier 		if((v & m) == 0) {
47*e887ea33SDavid du Colombier 			v >>= i;
48*e887ea33SDavid du Colombier 			s += i;
49*e887ea33SDavid du Colombier 		}
50*e887ea33SDavid du Colombier 	}
51*e887ea33SDavid du Colombier 	return s;
52*e887ea33SDavid du Colombier }
53*e887ea33SDavid du Colombier 
54*e887ea33SDavid du Colombier void
genmuladd(Node * d,Node * s,int m,Node * a)55*e887ea33SDavid du Colombier genmuladd(Node *d, Node *s, int m, Node *a)
56*e887ea33SDavid du Colombier {
57*e887ea33SDavid du Colombier 	Node nod;
58*e887ea33SDavid du Colombier 
59*e887ea33SDavid du Colombier 	nod.op = OINDEX;
60*e887ea33SDavid du Colombier 	nod.left = a;
61*e887ea33SDavid du Colombier 	nod.right = s;
62*e887ea33SDavid du Colombier 	nod.scale = m;
63*e887ea33SDavid du Colombier 	nod.type = types[TIND];
64*e887ea33SDavid du Colombier 	nod.xoffset = 0;
65*e887ea33SDavid du Colombier 	xcom(&nod);
66*e887ea33SDavid du Colombier 	gopcode(OADDR, d->type, &nod, d);
67*e887ea33SDavid du Colombier }
68*e887ea33SDavid du Colombier 
69*e887ea33SDavid du Colombier void
mulparam(ulong m,Mparam * mp)70*e887ea33SDavid du Colombier mulparam(ulong m, Mparam *mp)
71*e887ea33SDavid du Colombier {
72*e887ea33SDavid du Colombier 	int c, i, j, n, o, q, s;
73*e887ea33SDavid du Colombier 	int bc, bi, bn, bo, bq, bs, bt;
74*e887ea33SDavid du Colombier 	char *p;
75*e887ea33SDavid du Colombier 	long u;
76*e887ea33SDavid du Colombier 	ulong t;
77*e887ea33SDavid du Colombier 
78*e887ea33SDavid du Colombier 	bc = bq = 10;
79*e887ea33SDavid du Colombier 	bi = bn = bo = bs = bt = 0;
80*e887ea33SDavid du Colombier 	for(i = 0; i < nelem(malgs); i++) {
81*e887ea33SDavid du Colombier 		for(p = malgs[i].vals, j = 0; (o = p[j]) < 100; j++)
82*e887ea33SDavid du Colombier 		for(s = 0; s < 2; s++) {
83*e887ea33SDavid du Colombier 			c = 10;
84*e887ea33SDavid du Colombier 			q = 10;
85*e887ea33SDavid du Colombier 			u = m - o;
86*e887ea33SDavid du Colombier 			if(u == 0)
87*e887ea33SDavid du Colombier 				continue;
88*e887ea33SDavid du Colombier 			if(s) {
89*e887ea33SDavid du Colombier 				o = -o;
90*e887ea33SDavid du Colombier 				if(o > 0)
91*e887ea33SDavid du Colombier 					continue;
92*e887ea33SDavid du Colombier 				u = -u;
93*e887ea33SDavid du Colombier 			}
94*e887ea33SDavid du Colombier 			n = lowbit(u);
95*e887ea33SDavid du Colombier 			t = (ulong)u >> n;
96*e887ea33SDavid du Colombier 			switch(i) {
97*e887ea33SDavid du Colombier 			case 0:
98*e887ea33SDavid du Colombier 				if(t == 1) {
99*e887ea33SDavid du Colombier 					c = s + 1;
100*e887ea33SDavid du Colombier 					q = 0;
101*e887ea33SDavid du Colombier 					break;
102*e887ea33SDavid du Colombier 				}
103*e887ea33SDavid du Colombier 				switch(t) {
104*e887ea33SDavid du Colombier 				case 3:
105*e887ea33SDavid du Colombier 				case 5:
106*e887ea33SDavid du Colombier 				case 9:
107*e887ea33SDavid du Colombier 					c = s + 1;
108*e887ea33SDavid du Colombier 					if(n)
109*e887ea33SDavid du Colombier 						c++;
110*e887ea33SDavid du Colombier 					q = 0;
111*e887ea33SDavid du Colombier 					break;
112*e887ea33SDavid du Colombier 				}
113*e887ea33SDavid du Colombier 				if(s)
114*e887ea33SDavid du Colombier 					break;
115*e887ea33SDavid du Colombier 				switch(t) {
116*e887ea33SDavid du Colombier 				case 15:
117*e887ea33SDavid du Colombier 				case 25:
118*e887ea33SDavid du Colombier 				case 27:
119*e887ea33SDavid du Colombier 				case 45:
120*e887ea33SDavid du Colombier 				case 81:
121*e887ea33SDavid du Colombier 					c = 2;
122*e887ea33SDavid du Colombier 					if(n)
123*e887ea33SDavid du Colombier 						c++;
124*e887ea33SDavid du Colombier 					q = 1;
125*e887ea33SDavid du Colombier 					break;
126*e887ea33SDavid du Colombier 				}
127*e887ea33SDavid du Colombier 				break;
128*e887ea33SDavid du Colombier 			case 1:
129*e887ea33SDavid du Colombier 				if(t == 1) {
130*e887ea33SDavid du Colombier 					c = 3;
131*e887ea33SDavid du Colombier 					q = 3;
132*e887ea33SDavid du Colombier 					break;
133*e887ea33SDavid du Colombier 				}
134*e887ea33SDavid du Colombier 				switch(t) {
135*e887ea33SDavid du Colombier 				case 3:
136*e887ea33SDavid du Colombier 				case 5:
137*e887ea33SDavid du Colombier 				case 9:
138*e887ea33SDavid du Colombier 					c = 3;
139*e887ea33SDavid du Colombier 					q = 2;
140*e887ea33SDavid du Colombier 					break;
141*e887ea33SDavid du Colombier 				}
142*e887ea33SDavid du Colombier 				break;
143*e887ea33SDavid du Colombier 			case 2:
144*e887ea33SDavid du Colombier 				if(t == 1) {
145*e887ea33SDavid du Colombier 					c = 3;
146*e887ea33SDavid du Colombier 					q = 2;
147*e887ea33SDavid du Colombier 					break;
148*e887ea33SDavid du Colombier 				}
149*e887ea33SDavid du Colombier 				break;
150*e887ea33SDavid du Colombier 			case 3:
151*e887ea33SDavid du Colombier 				if(s)
152*e887ea33SDavid du Colombier 					break;
153*e887ea33SDavid du Colombier 				if(t == 1) {
154*e887ea33SDavid du Colombier 					c = 3;
155*e887ea33SDavid du Colombier 					q = 1;
156*e887ea33SDavid du Colombier 					break;
157*e887ea33SDavid du Colombier 				}
158*e887ea33SDavid du Colombier 				break;
159*e887ea33SDavid du Colombier 			case 4:
160*e887ea33SDavid du Colombier 				if(t == 1) {
161*e887ea33SDavid du Colombier 					c = 3;
162*e887ea33SDavid du Colombier 					q = 0;
163*e887ea33SDavid du Colombier 					break;
164*e887ea33SDavid du Colombier 				}
165*e887ea33SDavid du Colombier 				break;
166*e887ea33SDavid du Colombier 			}
167*e887ea33SDavid du Colombier 			if(c < bc || (c == bc && q > bq)) {
168*e887ea33SDavid du Colombier 				bc = c;
169*e887ea33SDavid du Colombier 				bi = i;
170*e887ea33SDavid du Colombier 				bn = n;
171*e887ea33SDavid du Colombier 				bo = o;
172*e887ea33SDavid du Colombier 				bq = q;
173*e887ea33SDavid du Colombier 				bs = s;
174*e887ea33SDavid du Colombier 				bt = t;
175*e887ea33SDavid du Colombier 			}
176*e887ea33SDavid du Colombier 		}
177*e887ea33SDavid du Colombier 	}
178*e887ea33SDavid du Colombier 	mp->value = m;
179*e887ea33SDavid du Colombier 	if(bc <= 3) {
180*e887ea33SDavid du Colombier 		mp->alg = bi;
181*e887ea33SDavid du Colombier 		mp->shift = bn;
182*e887ea33SDavid du Colombier 		mp->off = bo;
183*e887ea33SDavid du Colombier 		mp->neg = bs;
184*e887ea33SDavid du Colombier 		mp->arg = bt;
185*e887ea33SDavid du Colombier 	}
186*e887ea33SDavid du Colombier 	else
187*e887ea33SDavid du Colombier 		mp->alg = -1;
188*e887ea33SDavid du Colombier }
189*e887ea33SDavid du Colombier 
190*e887ea33SDavid du Colombier int
m0(int a)191*e887ea33SDavid du Colombier m0(int a)
192*e887ea33SDavid du Colombier {
193*e887ea33SDavid du Colombier 	switch(a) {
194*e887ea33SDavid du Colombier 	case -2:
195*e887ea33SDavid du Colombier 	case 2:
196*e887ea33SDavid du Colombier 		return 2;
197*e887ea33SDavid du Colombier 	case -3:
198*e887ea33SDavid du Colombier 	case 3:
199*e887ea33SDavid du Colombier 		return 2;
200*e887ea33SDavid du Colombier 	case -4:
201*e887ea33SDavid du Colombier 	case 4:
202*e887ea33SDavid du Colombier 		return 4;
203*e887ea33SDavid du Colombier 	case -5:
204*e887ea33SDavid du Colombier 	case 5:
205*e887ea33SDavid du Colombier 		return 4;
206*e887ea33SDavid du Colombier 	case 6:
207*e887ea33SDavid du Colombier 		return 2;
208*e887ea33SDavid du Colombier 	case -8:
209*e887ea33SDavid du Colombier 	case 8:
210*e887ea33SDavid du Colombier 		return 8;
211*e887ea33SDavid du Colombier 	case -9:
212*e887ea33SDavid du Colombier 	case 9:
213*e887ea33SDavid du Colombier 		return 8;
214*e887ea33SDavid du Colombier 	case 10:
215*e887ea33SDavid du Colombier 		return 4;
216*e887ea33SDavid du Colombier 	case 12:
217*e887ea33SDavid du Colombier 		return 2;
218*e887ea33SDavid du Colombier 	case 15:
219*e887ea33SDavid du Colombier 		return 2;
220*e887ea33SDavid du Colombier 	case 18:
221*e887ea33SDavid du Colombier 		return 8;
222*e887ea33SDavid du Colombier 	case 20:
223*e887ea33SDavid du Colombier 		return 4;
224*e887ea33SDavid du Colombier 	case 24:
225*e887ea33SDavid du Colombier 		return 2;
226*e887ea33SDavid du Colombier 	case 25:
227*e887ea33SDavid du Colombier 		return 4;
228*e887ea33SDavid du Colombier 	case 27:
229*e887ea33SDavid du Colombier 		return 2;
230*e887ea33SDavid du Colombier 	case 36:
231*e887ea33SDavid du Colombier 		return 8;
232*e887ea33SDavid du Colombier 	case 40:
233*e887ea33SDavid du Colombier 		return 4;
234*e887ea33SDavid du Colombier 	case 45:
235*e887ea33SDavid du Colombier 		return 4;
236*e887ea33SDavid du Colombier 	case 72:
237*e887ea33SDavid du Colombier 		return 8;
238*e887ea33SDavid du Colombier 	case 81:
239*e887ea33SDavid du Colombier 		return 8;
240*e887ea33SDavid du Colombier 	}
241*e887ea33SDavid du Colombier 	diag(Z, "bad m0");
242*e887ea33SDavid du Colombier 	return 0;
243*e887ea33SDavid du Colombier }
244*e887ea33SDavid du Colombier 
245*e887ea33SDavid du Colombier int
m1(int a)246*e887ea33SDavid du Colombier m1(int a)
247*e887ea33SDavid du Colombier {
248*e887ea33SDavid du Colombier 	switch(a) {
249*e887ea33SDavid du Colombier 	case 15:
250*e887ea33SDavid du Colombier 		return 4;
251*e887ea33SDavid du Colombier 	case 25:
252*e887ea33SDavid du Colombier 		return 4;
253*e887ea33SDavid du Colombier 	case 27:
254*e887ea33SDavid du Colombier 		return 8;
255*e887ea33SDavid du Colombier 	case 45:
256*e887ea33SDavid du Colombier 		return 8;
257*e887ea33SDavid du Colombier 	case 81:
258*e887ea33SDavid du Colombier 		return 8;
259*e887ea33SDavid du Colombier 	}
260*e887ea33SDavid du Colombier 	diag(Z, "bad m1");
261*e887ea33SDavid du Colombier 	return 0;
262*e887ea33SDavid du Colombier }
263*e887ea33SDavid du Colombier 
264*e887ea33SDavid du Colombier int
m2(int a)265*e887ea33SDavid du Colombier m2(int a)
266*e887ea33SDavid du Colombier {
267*e887ea33SDavid du Colombier 	switch(a) {
268*e887ea33SDavid du Colombier 	case 6:
269*e887ea33SDavid du Colombier 		return 2;
270*e887ea33SDavid du Colombier 	case 10:
271*e887ea33SDavid du Colombier 		return 2;
272*e887ea33SDavid du Colombier 	case 12:
273*e887ea33SDavid du Colombier 		return 4;
274*e887ea33SDavid du Colombier 	case 18:
275*e887ea33SDavid du Colombier 		return 2;
276*e887ea33SDavid du Colombier 	case 20:
277*e887ea33SDavid du Colombier 		return 4;
278*e887ea33SDavid du Colombier 	case 24:
279*e887ea33SDavid du Colombier 		return 8;
280*e887ea33SDavid du Colombier 	case 36:
281*e887ea33SDavid du Colombier 		return 4;
282*e887ea33SDavid du Colombier 	case 40:
283*e887ea33SDavid du Colombier 		return 8;
284*e887ea33SDavid du Colombier 	case 72:
285*e887ea33SDavid du Colombier 		return 8;
286*e887ea33SDavid du Colombier 	}
287*e887ea33SDavid du Colombier 	diag(Z, "bad m2");
288*e887ea33SDavid du Colombier 	return 0;
289*e887ea33SDavid du Colombier }
290*e887ea33SDavid du Colombier 
291*e887ea33SDavid du Colombier void
shiftit(Type * t,Node * s,Node * d)292*e887ea33SDavid du Colombier shiftit(Type *t, Node *s, Node *d)
293*e887ea33SDavid du Colombier {
294*e887ea33SDavid du Colombier 	long c;
295*e887ea33SDavid du Colombier 
296*e887ea33SDavid du Colombier 	c = (long)s->vconst & 31;
297*e887ea33SDavid du Colombier 	switch(c) {
298*e887ea33SDavid du Colombier 	case 0:
299*e887ea33SDavid du Colombier 		break;
300*e887ea33SDavid du Colombier 	case 1:
301*e887ea33SDavid du Colombier 		gopcode(OADD, t, d, d);
302*e887ea33SDavid du Colombier 		break;
303*e887ea33SDavid du Colombier 	default:
304*e887ea33SDavid du Colombier 		gopcode(OASHL, t, s, d);
305*e887ea33SDavid du Colombier 	}
306*e887ea33SDavid du Colombier }
307*e887ea33SDavid du Colombier 
308*e887ea33SDavid du Colombier static int
mulgen1(ulong v,Node * n)309*e887ea33SDavid du Colombier mulgen1(ulong v, Node *n)
310*e887ea33SDavid du Colombier {
311*e887ea33SDavid du Colombier 	int i, o;
312*e887ea33SDavid du Colombier 	Mparam *p;
313*e887ea33SDavid du Colombier 	Node nod, nods;
314*e887ea33SDavid du Colombier 
315*e887ea33SDavid du Colombier 	for(i = 0; i < nelem(multab); i++) {
316*e887ea33SDavid du Colombier 		p = &multab[i];
317*e887ea33SDavid du Colombier 		if(p->value == v)
318*e887ea33SDavid du Colombier 			goto found;
319*e887ea33SDavid du Colombier 	}
320*e887ea33SDavid du Colombier 
321*e887ea33SDavid du Colombier 	p = &multab[mulptr];
322*e887ea33SDavid du Colombier 	if(++mulptr == nelem(multab))
323*e887ea33SDavid du Colombier 		mulptr = 0;
324*e887ea33SDavid du Colombier 
325*e887ea33SDavid du Colombier 	mulparam(v, p);
326*e887ea33SDavid du Colombier 
327*e887ea33SDavid du Colombier found:
328*e887ea33SDavid du Colombier //	print("v=%.lx a=%d n=%d s=%d g=%d o=%d \n", p->value, p->alg, p->neg, p->shift, p->arg, p->off);
329*e887ea33SDavid du Colombier 	if(p->alg < 0)
330*e887ea33SDavid du Colombier 		return 0;
331*e887ea33SDavid du Colombier 
332*e887ea33SDavid du Colombier 	nods = *nodconst(p->shift);
333*e887ea33SDavid du Colombier 
334*e887ea33SDavid du Colombier 	o = OADD;
335*e887ea33SDavid du Colombier 	if(p->alg > 0) {
336*e887ea33SDavid du Colombier 		regalloc(&nod, n, Z);
337*e887ea33SDavid du Colombier 		if(p->off < 0)
338*e887ea33SDavid du Colombier 			o = OSUB;
339*e887ea33SDavid du Colombier 	}
340*e887ea33SDavid du Colombier 
341*e887ea33SDavid du Colombier 	switch(p->alg) {
342*e887ea33SDavid du Colombier 	case 0:
343*e887ea33SDavid du Colombier 		switch(p->arg) {
344*e887ea33SDavid du Colombier 		case 1:
345*e887ea33SDavid du Colombier 			shiftit(n->type, &nods, n);
346*e887ea33SDavid du Colombier 			break;
347*e887ea33SDavid du Colombier 		case 15:
348*e887ea33SDavid du Colombier 		case 25:
349*e887ea33SDavid du Colombier 		case 27:
350*e887ea33SDavid du Colombier 		case 45:
351*e887ea33SDavid du Colombier 		case 81:
352*e887ea33SDavid du Colombier 			genmuladd(n, n, m1(p->arg), n);
353*e887ea33SDavid du Colombier 			/* fall thru */
354*e887ea33SDavid du Colombier 		case 3:
355*e887ea33SDavid du Colombier 		case 5:
356*e887ea33SDavid du Colombier 		case 9:
357*e887ea33SDavid du Colombier 			genmuladd(n, n, m0(p->arg), n);
358*e887ea33SDavid du Colombier 			shiftit(n->type, &nods, n);
359*e887ea33SDavid du Colombier 			break;
360*e887ea33SDavid du Colombier 		default:
361*e887ea33SDavid du Colombier 			goto bad;
362*e887ea33SDavid du Colombier 		}
363*e887ea33SDavid du Colombier 		if(p->neg == 1)
364*e887ea33SDavid du Colombier 			gins(ANEGL, Z, n);
365*e887ea33SDavid du Colombier 		break;
366*e887ea33SDavid du Colombier 	case 1:
367*e887ea33SDavid du Colombier 		switch(p->arg) {
368*e887ea33SDavid du Colombier 		case 1:
369*e887ea33SDavid du Colombier 			gmove(n, &nod);
370*e887ea33SDavid du Colombier 			shiftit(n->type, &nods, &nod);
371*e887ea33SDavid du Colombier 			break;
372*e887ea33SDavid du Colombier 		case 3:
373*e887ea33SDavid du Colombier 		case 5:
374*e887ea33SDavid du Colombier 		case 9:
375*e887ea33SDavid du Colombier 			genmuladd(&nod, n, m0(p->arg), n);
376*e887ea33SDavid du Colombier 			shiftit(n->type, &nods, &nod);
377*e887ea33SDavid du Colombier 			break;
378*e887ea33SDavid du Colombier 		default:
379*e887ea33SDavid du Colombier 			goto bad;
380*e887ea33SDavid du Colombier 		}
381*e887ea33SDavid du Colombier 		if(p->neg)
382*e887ea33SDavid du Colombier 			gopcode(o, n->type, &nod, n);
383*e887ea33SDavid du Colombier 		else {
384*e887ea33SDavid du Colombier 			gopcode(o, n->type, n, &nod);
385*e887ea33SDavid du Colombier 			gmove(&nod, n);
386*e887ea33SDavid du Colombier 		}
387*e887ea33SDavid du Colombier 		break;
388*e887ea33SDavid du Colombier 	case 2:
389*e887ea33SDavid du Colombier 		genmuladd(&nod, n, m0(p->off), n);
390*e887ea33SDavid du Colombier 		shiftit(n->type, &nods, n);
391*e887ea33SDavid du Colombier 		goto comop;
392*e887ea33SDavid du Colombier 	case 3:
393*e887ea33SDavid du Colombier 		genmuladd(&nod, n, m0(p->off), n);
394*e887ea33SDavid du Colombier 		shiftit(n->type, &nods, n);
395*e887ea33SDavid du Colombier 		genmuladd(n, &nod, m2(p->off), n);
396*e887ea33SDavid du Colombier 		break;
397*e887ea33SDavid du Colombier 	case 4:
398*e887ea33SDavid du Colombier 		genmuladd(&nod, n, m0(p->off), nodconst(0));
399*e887ea33SDavid du Colombier 		shiftit(n->type, &nods, n);
400*e887ea33SDavid du Colombier 		goto comop;
401*e887ea33SDavid du Colombier 	default:
402*e887ea33SDavid du Colombier 		diag(Z, "bad mul alg");
403*e887ea33SDavid du Colombier 		break;
404*e887ea33SDavid du Colombier 	comop:
405*e887ea33SDavid du Colombier 		if(p->neg) {
406*e887ea33SDavid du Colombier 			gopcode(o, n->type, n, &nod);
407*e887ea33SDavid du Colombier 			gmove(&nod, n);
408*e887ea33SDavid du Colombier 		}
409*e887ea33SDavid du Colombier 		else
410*e887ea33SDavid du Colombier 			gopcode(o, n->type, &nod, n);
411*e887ea33SDavid du Colombier 	}
412*e887ea33SDavid du Colombier 
413*e887ea33SDavid du Colombier 	if(p->alg > 0)
414*e887ea33SDavid du Colombier 		regfree(&nod);
415*e887ea33SDavid du Colombier 
416*e887ea33SDavid du Colombier 	return 1;
417*e887ea33SDavid du Colombier 
418*e887ea33SDavid du Colombier bad:
419*e887ea33SDavid du Colombier 	diag(Z, "mulgen botch");
420*e887ea33SDavid du Colombier 	return 1;
421*e887ea33SDavid du Colombier }
422*e887ea33SDavid du Colombier 
423*e887ea33SDavid du Colombier void
mulgen(Type * t,Node * r,Node * n)424*e887ea33SDavid du Colombier mulgen(Type *t, Node *r, Node *n)
425*e887ea33SDavid du Colombier {
426*e887ea33SDavid du Colombier 	if(!mulgen1(r->vconst, n))
427*e887ea33SDavid du Colombier 		gopcode(OMUL, t, r, n);
428*e887ea33SDavid du Colombier }
429