xref: /inferno-os/utils/ic/mul.c (revision a93f6c888f6d530420fbb54e2f7fa4572cdc5208)
1*6e84dc96SRichard Miller #include "gc.h"
2*6e84dc96SRichard Miller 
3*6e84dc96SRichard Miller /*
4*6e84dc96SRichard Miller  * code sequences for multiply by constant.
5*6e84dc96SRichard Miller  * [a-l][0-3]
6*6e84dc96SRichard Miller  *	lsl	$(A-'a'),r0,r1
7*6e84dc96SRichard Miller  * [+][0-7]
8*6e84dc96SRichard Miller  *	add	r0,r1,r2
9*6e84dc96SRichard Miller  * [-][0-7]
10*6e84dc96SRichard Miller  *	sub	r0,r1,r2
11*6e84dc96SRichard Miller  */
12*6e84dc96SRichard Miller 
13*6e84dc96SRichard Miller static	int	multabp;
14*6e84dc96SRichard Miller static	long	mulval;
15*6e84dc96SRichard Miller static	char*	mulcp;
16*6e84dc96SRichard Miller static	long	valmax;
17*6e84dc96SRichard Miller static	int	shmax;
18*6e84dc96SRichard Miller 
19*6e84dc96SRichard Miller static int	docode(char *hp, char *cp, int r0, int r1);
20*6e84dc96SRichard Miller static int	gen1(int len);
21*6e84dc96SRichard Miller static int	gen2(int len, long r1);
22*6e84dc96SRichard Miller static int	gen3(int len, long r0, long r1, int flag);
23*6e84dc96SRichard Miller enum
24*6e84dc96SRichard Miller {
25*6e84dc96SRichard Miller 	SR1	= 1<<0,		/* r1 has been shifted */
26*6e84dc96SRichard Miller 	SR0	= 1<<1,		/* r0 has been shifted */
27*6e84dc96SRichard Miller 	UR1	= 1<<2,		/* r1 has not been used */
28*6e84dc96SRichard Miller 	UR0	= 1<<3,		/* r0 has not been used */
29*6e84dc96SRichard Miller };
30*6e84dc96SRichard Miller 
31*6e84dc96SRichard Miller Multab*
mulcon0(long v)32*6e84dc96SRichard Miller mulcon0(long v)
33*6e84dc96SRichard Miller {
34*6e84dc96SRichard Miller 	int a1, a2, g;
35*6e84dc96SRichard Miller 	Multab *m, *m1;
36*6e84dc96SRichard Miller 	char hint[10];
37*6e84dc96SRichard Miller 
38*6e84dc96SRichard Miller 	if(v < 0)
39*6e84dc96SRichard Miller 		v = -v;
40*6e84dc96SRichard Miller 
41*6e84dc96SRichard Miller 	/*
42*6e84dc96SRichard Miller 	 * look in cache
43*6e84dc96SRichard Miller 	 */
44*6e84dc96SRichard Miller 	m = multab;
45*6e84dc96SRichard Miller 	for(g=0; g<nelem(multab); g++) {
46*6e84dc96SRichard Miller 		if(m->val == v) {
47*6e84dc96SRichard Miller 			if(m->code[0] == 0)
48*6e84dc96SRichard Miller 				return 0;
49*6e84dc96SRichard Miller 			return m;
50*6e84dc96SRichard Miller 		}
51*6e84dc96SRichard Miller 		m++;
52*6e84dc96SRichard Miller 	}
53*6e84dc96SRichard Miller 
54*6e84dc96SRichard Miller 	/*
55*6e84dc96SRichard Miller 	 * select a spot in cache to overwrite
56*6e84dc96SRichard Miller 	 */
57*6e84dc96SRichard Miller 	multabp++;
58*6e84dc96SRichard Miller 	if(multabp < 0 || multabp >= nelem(multab))
59*6e84dc96SRichard Miller 		multabp = 0;
60*6e84dc96SRichard Miller 	m = multab+multabp;
61*6e84dc96SRichard Miller 	m->val = v;
62*6e84dc96SRichard Miller 	mulval = v;
63*6e84dc96SRichard Miller 
64*6e84dc96SRichard Miller 	/*
65*6e84dc96SRichard Miller 	 * look in execption hint table
66*6e84dc96SRichard Miller 	 */
67*6e84dc96SRichard Miller 	a1 = 0;
68*6e84dc96SRichard Miller 	a2 = hintabsize;
69*6e84dc96SRichard Miller 	for(;;) {
70*6e84dc96SRichard Miller 		if(a1 >= a2)
71*6e84dc96SRichard Miller 			goto no;
72*6e84dc96SRichard Miller 		g = (a2 + a1)/2;
73*6e84dc96SRichard Miller 		if(v < hintab[g].val) {
74*6e84dc96SRichard Miller 			a2 = g;
75*6e84dc96SRichard Miller 			continue;
76*6e84dc96SRichard Miller 		}
77*6e84dc96SRichard Miller 		if(v > hintab[g].val) {
78*6e84dc96SRichard Miller 			a1 = g+1;
79*6e84dc96SRichard Miller 			continue;
80*6e84dc96SRichard Miller 		}
81*6e84dc96SRichard Miller 		break;
82*6e84dc96SRichard Miller 	}
83*6e84dc96SRichard Miller 
84*6e84dc96SRichard Miller 	if(docode(hintab[g].hint, m->code, 1, 0))
85*6e84dc96SRichard Miller 		return m;
86*6e84dc96SRichard Miller 	print("multiply table failure %ld\n", v);
87*6e84dc96SRichard Miller 	m->code[0] = 0;
88*6e84dc96SRichard Miller 	return 0;
89*6e84dc96SRichard Miller 
90*6e84dc96SRichard Miller no:
91*6e84dc96SRichard Miller 	/*
92*6e84dc96SRichard Miller 	 * try to search
93*6e84dc96SRichard Miller 	 */
94*6e84dc96SRichard Miller 	hint[0] = 0;
95*6e84dc96SRichard Miller 	for(g=1; g<=6; g++) {
96*6e84dc96SRichard Miller 		if(g >= 6 && v >= 65535)
97*6e84dc96SRichard Miller 			break;
98*6e84dc96SRichard Miller 		mulcp = hint+g;
99*6e84dc96SRichard Miller 		*mulcp = 0;
100*6e84dc96SRichard Miller 		if(gen1(g)) {
101*6e84dc96SRichard Miller 			if(docode(hint, m->code, 1, 0))
102*6e84dc96SRichard Miller 				return m;
103*6e84dc96SRichard Miller 			print("multiply table failure %ld\n", v);
104*6e84dc96SRichard Miller 			break;
105*6e84dc96SRichard Miller 		}
106*6e84dc96SRichard Miller 	}
107*6e84dc96SRichard Miller 
108*6e84dc96SRichard Miller 	/*
109*6e84dc96SRichard Miller 	 * try a recur followed by a shift
110*6e84dc96SRichard Miller 	 */
111*6e84dc96SRichard Miller 	g = 0;
112*6e84dc96SRichard Miller 	while(!(v & 1)) {
113*6e84dc96SRichard Miller 		g++;
114*6e84dc96SRichard Miller 		v >>= 1;
115*6e84dc96SRichard Miller 	}
116*6e84dc96SRichard Miller 	if(g) {
117*6e84dc96SRichard Miller 		m1 = mulcon0(v);
118*6e84dc96SRichard Miller 		if(m1) {
119*6e84dc96SRichard Miller 			strcpy(m->code, m1->code);
120*6e84dc96SRichard Miller 			sprint(strchr(m->code, 0), "%c0", g+'a');
121*6e84dc96SRichard Miller 			return m;
122*6e84dc96SRichard Miller 		}
123*6e84dc96SRichard Miller 	}
124*6e84dc96SRichard Miller 	m->code[0] = 0;
125*6e84dc96SRichard Miller 	return 0;
126*6e84dc96SRichard Miller }
127*6e84dc96SRichard Miller 
128*6e84dc96SRichard Miller static int
docode(char * hp,char * cp,int r0,int r1)129*6e84dc96SRichard Miller docode(char *hp, char *cp, int r0, int r1)
130*6e84dc96SRichard Miller {
131*6e84dc96SRichard Miller 	int c, i;
132*6e84dc96SRichard Miller 
133*6e84dc96SRichard Miller 	c = *hp++;
134*6e84dc96SRichard Miller 	*cp = c;
135*6e84dc96SRichard Miller 	cp += 2;
136*6e84dc96SRichard Miller 	switch(c) {
137*6e84dc96SRichard Miller 	default:
138*6e84dc96SRichard Miller 		c -= 'a';
139*6e84dc96SRichard Miller 		if(c < 1 || c >= 30)
140*6e84dc96SRichard Miller 			break;
141*6e84dc96SRichard Miller 		for(i=0; i<4; i++) {
142*6e84dc96SRichard Miller 			switch(i) {
143*6e84dc96SRichard Miller 			case 0:
144*6e84dc96SRichard Miller 				if(docode(hp, cp, r0<<c, r1))
145*6e84dc96SRichard Miller 					goto out;
146*6e84dc96SRichard Miller 				break;
147*6e84dc96SRichard Miller 			case 1:
148*6e84dc96SRichard Miller 				if(docode(hp, cp, r1<<c, r1))
149*6e84dc96SRichard Miller 					goto out;
150*6e84dc96SRichard Miller 				break;
151*6e84dc96SRichard Miller 			case 2:
152*6e84dc96SRichard Miller 				if(docode(hp, cp, r0, r0<<c))
153*6e84dc96SRichard Miller 					goto out;
154*6e84dc96SRichard Miller 				break;
155*6e84dc96SRichard Miller 			case 3:
156*6e84dc96SRichard Miller 				if(docode(hp, cp, r0, r1<<c))
157*6e84dc96SRichard Miller 					goto out;
158*6e84dc96SRichard Miller 				break;
159*6e84dc96SRichard Miller 			}
160*6e84dc96SRichard Miller 		}
161*6e84dc96SRichard Miller 		break;
162*6e84dc96SRichard Miller 
163*6e84dc96SRichard Miller 	case '+':
164*6e84dc96SRichard Miller 		for(i=0; i<8; i++) {
165*6e84dc96SRichard Miller 			cp[-1] = i+'0';
166*6e84dc96SRichard Miller 			switch(i) {
167*6e84dc96SRichard Miller 			case 1:
168*6e84dc96SRichard Miller 				if(docode(hp, cp, r0+r1, r1))
169*6e84dc96SRichard Miller 					goto out;
170*6e84dc96SRichard Miller 				break;
171*6e84dc96SRichard Miller 			case 5:
172*6e84dc96SRichard Miller 				if(docode(hp, cp, r0, r0+r1))
173*6e84dc96SRichard Miller 					goto out;
174*6e84dc96SRichard Miller 				break;
175*6e84dc96SRichard Miller 			}
176*6e84dc96SRichard Miller 		}
177*6e84dc96SRichard Miller 		break;
178*6e84dc96SRichard Miller 
179*6e84dc96SRichard Miller 	case '-':
180*6e84dc96SRichard Miller 		for(i=0; i<8; i++) {
181*6e84dc96SRichard Miller 			cp[-1] = i+'0';
182*6e84dc96SRichard Miller 			switch(i) {
183*6e84dc96SRichard Miller 			case 1:
184*6e84dc96SRichard Miller 				if(docode(hp, cp, r0-r1, r1))
185*6e84dc96SRichard Miller 					goto out;
186*6e84dc96SRichard Miller 				break;
187*6e84dc96SRichard Miller 			case 2:
188*6e84dc96SRichard Miller 				if(docode(hp, cp, r1-r0, r1))
189*6e84dc96SRichard Miller 					goto out;
190*6e84dc96SRichard Miller 				break;
191*6e84dc96SRichard Miller 			case 5:
192*6e84dc96SRichard Miller 				if(docode(hp, cp, r0, r0-r1))
193*6e84dc96SRichard Miller 					goto out;
194*6e84dc96SRichard Miller 				break;
195*6e84dc96SRichard Miller 			case 6:
196*6e84dc96SRichard Miller 				if(docode(hp, cp, r0, r1-r0))
197*6e84dc96SRichard Miller 					goto out;
198*6e84dc96SRichard Miller 				break;
199*6e84dc96SRichard Miller 			}
200*6e84dc96SRichard Miller 		}
201*6e84dc96SRichard Miller 		break;
202*6e84dc96SRichard Miller 
203*6e84dc96SRichard Miller 	case 0:
204*6e84dc96SRichard Miller 		if(r0 == mulval)
205*6e84dc96SRichard Miller 			return 1;
206*6e84dc96SRichard Miller 	}
207*6e84dc96SRichard Miller 	return 0;
208*6e84dc96SRichard Miller 
209*6e84dc96SRichard Miller out:
210*6e84dc96SRichard Miller 	cp[-1] = i+'0';
211*6e84dc96SRichard Miller 	return 1;
212*6e84dc96SRichard Miller }
213*6e84dc96SRichard Miller 
214*6e84dc96SRichard Miller static int
gen1(int len)215*6e84dc96SRichard Miller gen1(int len)
216*6e84dc96SRichard Miller {
217*6e84dc96SRichard Miller 	int i;
218*6e84dc96SRichard Miller 
219*6e84dc96SRichard Miller 	for(shmax=1; shmax<30; shmax++) {
220*6e84dc96SRichard Miller 		valmax = 1<<shmax;
221*6e84dc96SRichard Miller 		if(valmax >= mulval)
222*6e84dc96SRichard Miller 			break;
223*6e84dc96SRichard Miller 	}
224*6e84dc96SRichard Miller 	if(mulval == 1)
225*6e84dc96SRichard Miller 		return 1;
226*6e84dc96SRichard Miller 
227*6e84dc96SRichard Miller 	len--;
228*6e84dc96SRichard Miller 	for(i=1; i<=shmax; i++)
229*6e84dc96SRichard Miller 		if(gen2(len, 1<<i)) {
230*6e84dc96SRichard Miller 			*--mulcp = 'a'+i;
231*6e84dc96SRichard Miller 			return 1;
232*6e84dc96SRichard Miller 		}
233*6e84dc96SRichard Miller 	return 0;
234*6e84dc96SRichard Miller }
235*6e84dc96SRichard Miller 
236*6e84dc96SRichard Miller static int
gen2(int len,long r1)237*6e84dc96SRichard Miller gen2(int len, long r1)
238*6e84dc96SRichard Miller {
239*6e84dc96SRichard Miller 	int i;
240*6e84dc96SRichard Miller 
241*6e84dc96SRichard Miller 	if(len <= 0) {
242*6e84dc96SRichard Miller 		if(r1 == mulval)
243*6e84dc96SRichard Miller 			return 1;
244*6e84dc96SRichard Miller 		return 0;
245*6e84dc96SRichard Miller 	}
246*6e84dc96SRichard Miller 
247*6e84dc96SRichard Miller 	len--;
248*6e84dc96SRichard Miller 	if(len == 0)
249*6e84dc96SRichard Miller 		goto calcr0;
250*6e84dc96SRichard Miller 
251*6e84dc96SRichard Miller 	if(gen3(len, r1, r1+1, UR1)) {
252*6e84dc96SRichard Miller 		i = '+';
253*6e84dc96SRichard Miller 		goto out;
254*6e84dc96SRichard Miller 	}
255*6e84dc96SRichard Miller 	if(gen3(len, r1-1, r1, UR0)) {
256*6e84dc96SRichard Miller 		i = '-';
257*6e84dc96SRichard Miller 		goto out;
258*6e84dc96SRichard Miller 	}
259*6e84dc96SRichard Miller 	if(gen3(len, 1, r1+1, UR1)) {
260*6e84dc96SRichard Miller 		i = '+';
261*6e84dc96SRichard Miller 		goto out;
262*6e84dc96SRichard Miller 	}
263*6e84dc96SRichard Miller 	if(gen3(len, 1, r1-1, UR1)) {
264*6e84dc96SRichard Miller 		i = '-';
265*6e84dc96SRichard Miller 		goto out;
266*6e84dc96SRichard Miller 	}
267*6e84dc96SRichard Miller 
268*6e84dc96SRichard Miller 	return 0;
269*6e84dc96SRichard Miller 
270*6e84dc96SRichard Miller calcr0:
271*6e84dc96SRichard Miller 	if(mulval == r1+1) {
272*6e84dc96SRichard Miller 		i = '+';
273*6e84dc96SRichard Miller 		goto out;
274*6e84dc96SRichard Miller 	}
275*6e84dc96SRichard Miller 	if(mulval == r1-1) {
276*6e84dc96SRichard Miller 		i = '-';
277*6e84dc96SRichard Miller 		goto out;
278*6e84dc96SRichard Miller 	}
279*6e84dc96SRichard Miller 	return 0;
280*6e84dc96SRichard Miller 
281*6e84dc96SRichard Miller out:
282*6e84dc96SRichard Miller 	*--mulcp = i;
283*6e84dc96SRichard Miller 	return 1;
284*6e84dc96SRichard Miller }
285*6e84dc96SRichard Miller 
286*6e84dc96SRichard Miller static int
gen3(int len,long r0,long r1,int flag)287*6e84dc96SRichard Miller gen3(int len, long r0, long r1, int flag)
288*6e84dc96SRichard Miller {
289*6e84dc96SRichard Miller 	int i, f1, f2;
290*6e84dc96SRichard Miller 	long x;
291*6e84dc96SRichard Miller 
292*6e84dc96SRichard Miller 	if(r0 <= 0 ||
293*6e84dc96SRichard Miller 	   r0 >= r1 ||
294*6e84dc96SRichard Miller 	   r1 > valmax)
295*6e84dc96SRichard Miller 		return 0;
296*6e84dc96SRichard Miller 
297*6e84dc96SRichard Miller 	len--;
298*6e84dc96SRichard Miller 	if(len == 0)
299*6e84dc96SRichard Miller 		goto calcr0;
300*6e84dc96SRichard Miller 
301*6e84dc96SRichard Miller 	if(!(flag & UR1)) {
302*6e84dc96SRichard Miller 		f1 = UR1|SR1;
303*6e84dc96SRichard Miller 		for(i=1; i<=shmax; i++) {
304*6e84dc96SRichard Miller 			x = r0<<i;
305*6e84dc96SRichard Miller 			if(x > valmax)
306*6e84dc96SRichard Miller 				break;
307*6e84dc96SRichard Miller 			if(gen3(len, r0, x, f1)) {
308*6e84dc96SRichard Miller 				i += 'a';
309*6e84dc96SRichard Miller 				goto out;
310*6e84dc96SRichard Miller 			}
311*6e84dc96SRichard Miller 		}
312*6e84dc96SRichard Miller 	}
313*6e84dc96SRichard Miller 
314*6e84dc96SRichard Miller 	if(!(flag & UR0)) {
315*6e84dc96SRichard Miller 		f1 = UR1|SR1;
316*6e84dc96SRichard Miller 		for(i=1; i<=shmax; i++) {
317*6e84dc96SRichard Miller 			x = r1<<i;
318*6e84dc96SRichard Miller 			if(x > valmax)
319*6e84dc96SRichard Miller 				break;
320*6e84dc96SRichard Miller 			if(gen3(len, r1, x, f1)) {
321*6e84dc96SRichard Miller 				i += 'a';
322*6e84dc96SRichard Miller 				goto out;
323*6e84dc96SRichard Miller 			}
324*6e84dc96SRichard Miller 		}
325*6e84dc96SRichard Miller 	}
326*6e84dc96SRichard Miller 
327*6e84dc96SRichard Miller 	if(!(flag & SR1)) {
328*6e84dc96SRichard Miller 		f1 = UR1|SR1|(flag&UR0);
329*6e84dc96SRichard Miller 		for(i=1; i<=shmax; i++) {
330*6e84dc96SRichard Miller 			x = r1<<i;
331*6e84dc96SRichard Miller 			if(x > valmax)
332*6e84dc96SRichard Miller 				break;
333*6e84dc96SRichard Miller 			if(gen3(len, r0, x, f1)) {
334*6e84dc96SRichard Miller 				i += 'a';
335*6e84dc96SRichard Miller 				goto out;
336*6e84dc96SRichard Miller 			}
337*6e84dc96SRichard Miller 		}
338*6e84dc96SRichard Miller 	}
339*6e84dc96SRichard Miller 
340*6e84dc96SRichard Miller 	if(!(flag & SR0)) {
341*6e84dc96SRichard Miller 		f1 = UR0|SR0|(flag&(SR1|UR1));
342*6e84dc96SRichard Miller 
343*6e84dc96SRichard Miller 		f2 = UR1|SR1;
344*6e84dc96SRichard Miller 		if(flag & UR1)
345*6e84dc96SRichard Miller 			f2 |= UR0;
346*6e84dc96SRichard Miller 		if(flag & SR1)
347*6e84dc96SRichard Miller 			f2 |= SR0;
348*6e84dc96SRichard Miller 
349*6e84dc96SRichard Miller 		for(i=1; i<=shmax; i++) {
350*6e84dc96SRichard Miller 			x = r0<<i;
351*6e84dc96SRichard Miller 			if(x > valmax)
352*6e84dc96SRichard Miller 				break;
353*6e84dc96SRichard Miller 			if(x > r1) {
354*6e84dc96SRichard Miller 				if(gen3(len, r1, x, f2)) {
355*6e84dc96SRichard Miller 					i += 'a';
356*6e84dc96SRichard Miller 					goto out;
357*6e84dc96SRichard Miller 				}
358*6e84dc96SRichard Miller 			} else
359*6e84dc96SRichard Miller 				if(gen3(len, x, r1, f1)) {
360*6e84dc96SRichard Miller 					i += 'a';
361*6e84dc96SRichard Miller 					goto out;
362*6e84dc96SRichard Miller 				}
363*6e84dc96SRichard Miller 		}
364*6e84dc96SRichard Miller 	}
365*6e84dc96SRichard Miller 
366*6e84dc96SRichard Miller 	x = r1+r0;
367*6e84dc96SRichard Miller 	if(gen3(len, r0, x, UR1)) {
368*6e84dc96SRichard Miller 		i = '+';
369*6e84dc96SRichard Miller 		goto out;
370*6e84dc96SRichard Miller 	}
371*6e84dc96SRichard Miller 
372*6e84dc96SRichard Miller 	if(gen3(len, r1, x, UR1)) {
373*6e84dc96SRichard Miller 		i = '+';
374*6e84dc96SRichard Miller 		goto out;
375*6e84dc96SRichard Miller 	}
376*6e84dc96SRichard Miller 
377*6e84dc96SRichard Miller 	x = r1-r0;
378*6e84dc96SRichard Miller 	if(gen3(len, x, r1, UR0)) {
379*6e84dc96SRichard Miller 		i = '-';
380*6e84dc96SRichard Miller 		goto out;
381*6e84dc96SRichard Miller 	}
382*6e84dc96SRichard Miller 
383*6e84dc96SRichard Miller 	if(x > r0) {
384*6e84dc96SRichard Miller 		if(gen3(len, r0, x, UR1)) {
385*6e84dc96SRichard Miller 			i = '-';
386*6e84dc96SRichard Miller 			goto out;
387*6e84dc96SRichard Miller 		}
388*6e84dc96SRichard Miller 	} else
389*6e84dc96SRichard Miller 		if(gen3(len, x, r0, UR0)) {
390*6e84dc96SRichard Miller 			i = '-';
391*6e84dc96SRichard Miller 			goto out;
392*6e84dc96SRichard Miller 		}
393*6e84dc96SRichard Miller 
394*6e84dc96SRichard Miller 	return 0;
395*6e84dc96SRichard Miller 
396*6e84dc96SRichard Miller calcr0:
397*6e84dc96SRichard Miller 	f1 = flag & (UR0|UR1);
398*6e84dc96SRichard Miller 	if(f1 == UR1) {
399*6e84dc96SRichard Miller 		for(i=1; i<=shmax; i++) {
400*6e84dc96SRichard Miller 			x = r1<<i;
401*6e84dc96SRichard Miller 			if(x >= mulval) {
402*6e84dc96SRichard Miller 				if(x == mulval) {
403*6e84dc96SRichard Miller 					i += 'a';
404*6e84dc96SRichard Miller 					goto out;
405*6e84dc96SRichard Miller 				}
406*6e84dc96SRichard Miller 				break;
407*6e84dc96SRichard Miller 			}
408*6e84dc96SRichard Miller 		}
409*6e84dc96SRichard Miller 	}
410*6e84dc96SRichard Miller 
411*6e84dc96SRichard Miller 	if(mulval == r1+r0) {
412*6e84dc96SRichard Miller 		i = '+';
413*6e84dc96SRichard Miller 		goto out;
414*6e84dc96SRichard Miller 	}
415*6e84dc96SRichard Miller 	if(mulval == r1-r0) {
416*6e84dc96SRichard Miller 		i = '-';
417*6e84dc96SRichard Miller 		goto out;
418*6e84dc96SRichard Miller 	}
419*6e84dc96SRichard Miller 
420*6e84dc96SRichard Miller 	return 0;
421*6e84dc96SRichard Miller 
422*6e84dc96SRichard Miller out:
423*6e84dc96SRichard Miller 	*--mulcp = i;
424*6e84dc96SRichard Miller 	return 1;
425*6e84dc96SRichard Miller }
426*6e84dc96SRichard Miller 
427*6e84dc96SRichard Miller /*
428*6e84dc96SRichard Miller  * hint table has numbers that
429*6e84dc96SRichard Miller  * the search algorithm fails on.
430*6e84dc96SRichard Miller  * <1000:
431*6e84dc96SRichard Miller  *	all numbers
432*6e84dc96SRichard Miller  * <5000:
433*6e84dc96SRichard Miller  * 	÷ by 5
434*6e84dc96SRichard Miller  * <10000:
435*6e84dc96SRichard Miller  * 	÷ by 50
436*6e84dc96SRichard Miller  * <65536:
437*6e84dc96SRichard Miller  * 	÷ by 250
438*6e84dc96SRichard Miller  */
439*6e84dc96SRichard Miller Hintab	hintab[] =
440*6e84dc96SRichard Miller {
441*6e84dc96SRichard Miller 	683,	"b++d+e+",
442*6e84dc96SRichard Miller 	687,	"b+e++e-",
443*6e84dc96SRichard Miller 	691,	"b++d+e+",
444*6e84dc96SRichard Miller 	731,	"b++d+e+",
445*6e84dc96SRichard Miller 	811,	"b++d+i+",
446*6e84dc96SRichard Miller 	821,	"b++e+e+",
447*6e84dc96SRichard Miller 	843,	"b+d++e+",
448*6e84dc96SRichard Miller 	851,	"b+f-+e-",
449*6e84dc96SRichard Miller 	853,	"b++e+e+",
450*6e84dc96SRichard Miller 	877,	"c++++g-",
451*6e84dc96SRichard Miller 	933,	"b+c++g-",
452*6e84dc96SRichard Miller 	981,	"c-+e-d+",
453*6e84dc96SRichard Miller 	1375,	"b+c+b+h-",
454*6e84dc96SRichard Miller 	1675,	"d+b++h+",
455*6e84dc96SRichard Miller 	2425,	"c++f-e+",
456*6e84dc96SRichard Miller 	2675,	"c+d++f-",
457*6e84dc96SRichard Miller 	2750,	"b+d-b+h-",
458*6e84dc96SRichard Miller 	2775,	"c-+g-e-",
459*6e84dc96SRichard Miller 	3125,	"b++e+g+",
460*6e84dc96SRichard Miller 	3275,	"b+c+g+e+",
461*6e84dc96SRichard Miller 	3350,	"c++++i+",
462*6e84dc96SRichard Miller 	3475,	"c-+e-f-",
463*6e84dc96SRichard Miller 	3525,	"c-+d+g-",
464*6e84dc96SRichard Miller 	3625,	"c-+e-j+",
465*6e84dc96SRichard Miller 	3675,	"b+d+d+e+",
466*6e84dc96SRichard Miller 	3725,	"b+d-+h+",
467*6e84dc96SRichard Miller 	3925,	"b+d+f-d-",
468*6e84dc96SRichard Miller 	4275,	"b+g++e+",
469*6e84dc96SRichard Miller 	4325,	"b+h-+d+",
470*6e84dc96SRichard Miller 	4425,	"b+b+g-j-",
471*6e84dc96SRichard Miller 	4525,	"b+d-d+f+",
472*6e84dc96SRichard Miller 	4675,	"c++d-g+",
473*6e84dc96SRichard Miller 	4775,	"b+d+b+g-",
474*6e84dc96SRichard Miller 	4825,	"c+c-+i-",
475*6e84dc96SRichard Miller 	4850,	"c++++i-",
476*6e84dc96SRichard Miller 	4925,	"b++e-g-",
477*6e84dc96SRichard Miller 	4975,	"c+f++e-",
478*6e84dc96SRichard Miller 	5500,	"b+g-c+d+",
479*6e84dc96SRichard Miller 	6700,	"d+b++i+",
480*6e84dc96SRichard Miller 	9700,	"d++++j-",
481*6e84dc96SRichard Miller 	11000,	"b+f-c-h-",
482*6e84dc96SRichard Miller 	11750,	"b+d+g+j-",
483*6e84dc96SRichard Miller 	12500,	"b+c+e-k+",
484*6e84dc96SRichard Miller 	13250,	"b+d+e-f+",
485*6e84dc96SRichard Miller 	13750,	"b+h-c-d+",
486*6e84dc96SRichard Miller 	14250,	"b+g-c+e-",
487*6e84dc96SRichard Miller 	14500,	"c+f+j-d-",
488*6e84dc96SRichard Miller 	14750,	"d-g--f+",
489*6e84dc96SRichard Miller 	16750,	"b+e-d-n+",
490*6e84dc96SRichard Miller 	17750,	"c+h-b+e+",
491*6e84dc96SRichard Miller 	18250,	"d+b+h-d+",
492*6e84dc96SRichard Miller 	18750,	"b+g-++f+",
493*6e84dc96SRichard Miller 	19250,	"b+e+b+h+",
494*6e84dc96SRichard Miller 	19750,	"b++h--f-",
495*6e84dc96SRichard Miller 	20250,	"b+e-l-c+",
496*6e84dc96SRichard Miller 	20750,	"c++bi+e-",
497*6e84dc96SRichard Miller 	21250,	"b+i+l+c+",
498*6e84dc96SRichard Miller 	22000,	"b+e+d-g-",
499*6e84dc96SRichard Miller 	22250,	"b+d-h+k-",
500*6e84dc96SRichard Miller 	22750,	"b+d-e-g+",
501*6e84dc96SRichard Miller 	23250,	"b+c+h+e-",
502*6e84dc96SRichard Miller 	23500,	"b+g-c-g-",
503*6e84dc96SRichard Miller 	23750,	"b+g-b+h-",
504*6e84dc96SRichard Miller 	24250,	"c++g+m-",
505*6e84dc96SRichard Miller 	24750,	"b+e+e+j-",
506*6e84dc96SRichard Miller 	25000,	"b++dh+g+",
507*6e84dc96SRichard Miller 	25250,	"b+e+d-g-",
508*6e84dc96SRichard Miller 	25750,	"b+e+b+j+",
509*6e84dc96SRichard Miller 	26250,	"b+h+c+e+",
510*6e84dc96SRichard Miller 	26500,	"b+h+c+g+",
511*6e84dc96SRichard Miller 	26750,	"b+d+e+g-",
512*6e84dc96SRichard Miller 	27250,	"b+e+e+f+",
513*6e84dc96SRichard Miller 	27500,	"c-i-c-d+",
514*6e84dc96SRichard Miller 	27750,	"b+bd++j+",
515*6e84dc96SRichard Miller 	28250,	"d-d-++i-",
516*6e84dc96SRichard Miller 	28500,	"c+c-h-e-",
517*6e84dc96SRichard Miller 	29000,	"b+g-d-f+",
518*6e84dc96SRichard Miller 	29500,	"c+h+++e-",
519*6e84dc96SRichard Miller 	29750,	"b+g+f-c+",
520*6e84dc96SRichard Miller 	30250,	"b+f-g-c+",
521*6e84dc96SRichard Miller 	33500,	"c-f-d-n+",
522*6e84dc96SRichard Miller 	33750,	"b+d-b+j-",
523*6e84dc96SRichard Miller 	34250,	"c+e+++i+",
524*6e84dc96SRichard Miller 	35250,	"e+b+d+k+",
525*6e84dc96SRichard Miller 	35500,	"c+e+d-g-",
526*6e84dc96SRichard Miller 	35750,	"c+i-++e+",
527*6e84dc96SRichard Miller 	36250,	"b+bh-d+e+",
528*6e84dc96SRichard Miller 	36500,	"c+c-h-e-",
529*6e84dc96SRichard Miller 	36750,	"d+e--i+",
530*6e84dc96SRichard Miller 	37250,	"b+g+g+b+",
531*6e84dc96SRichard Miller 	37500,	"b+h-b+f+",
532*6e84dc96SRichard Miller 	37750,	"c+be++j-",
533*6e84dc96SRichard Miller 	38500,	"b+e+b+i+",
534*6e84dc96SRichard Miller 	38750,	"d+i-b+d+",
535*6e84dc96SRichard Miller 	39250,	"b+g-l-+d+",
536*6e84dc96SRichard Miller 	39500,	"b+g-c+g-",
537*6e84dc96SRichard Miller 	39750,	"b+bh-c+f-",
538*6e84dc96SRichard Miller 	40250,	"b+bf+d+g-",
539*6e84dc96SRichard Miller 	40500,	"b+g-c+g+",
540*6e84dc96SRichard Miller 	40750,	"c+b+i-e+",
541*6e84dc96SRichard Miller 	41250,	"d++bf+h+",
542*6e84dc96SRichard Miller 	41500,	"b+j+c+d-",
543*6e84dc96SRichard Miller 	41750,	"c+f+b+h-",
544*6e84dc96SRichard Miller 	42500,	"c+h++g+",
545*6e84dc96SRichard Miller 	42750,	"b+g+d-f-",
546*6e84dc96SRichard Miller 	43250,	"b+l-e+d-",
547*6e84dc96SRichard Miller 	43750,	"c+bd+h+f-",
548*6e84dc96SRichard Miller 	44000,	"b+f+g-d-",
549*6e84dc96SRichard Miller 	44250,	"b+d-g--f+",
550*6e84dc96SRichard Miller 	44500,	"c+e+c+h+",
551*6e84dc96SRichard Miller 	44750,	"b+e+d-h-",
552*6e84dc96SRichard Miller 	45250,	"b++g+j-g+",
553*6e84dc96SRichard Miller 	45500,	"c+d+e-g+",
554*6e84dc96SRichard Miller 	45750,	"b+d-h-e-",
555*6e84dc96SRichard Miller 	46250,	"c+bd++j+",
556*6e84dc96SRichard Miller 	46500,	"b+d-c-j-",
557*6e84dc96SRichard Miller 	46750,	"e-e-b+g-",
558*6e84dc96SRichard Miller 	47000,	"b+c+d-j-",
559*6e84dc96SRichard Miller 	47250,	"b+e+e-g-",
560*6e84dc96SRichard Miller 	47500,	"b+g-c-h-",
561*6e84dc96SRichard Miller 	47750,	"b+f-c+h-",
562*6e84dc96SRichard Miller 	48250,	"d--h+n-",
563*6e84dc96SRichard Miller 	48500,	"b+c-g+m-",
564*6e84dc96SRichard Miller 	48750,	"b+e+e-g+",
565*6e84dc96SRichard Miller 	49500,	"c-f+e+j-",
566*6e84dc96SRichard Miller 	49750,	"c+c+g++f-",
567*6e84dc96SRichard Miller 	50000,	"b+e+e+k+",
568*6e84dc96SRichard Miller 	50250,	"b++i++g+",
569*6e84dc96SRichard Miller 	50500,	"c+g+f-i+",
570*6e84dc96SRichard Miller 	50750,	"b+e+d+k-",
571*6e84dc96SRichard Miller 	51500,	"b+i+c-f+",
572*6e84dc96SRichard Miller 	51750,	"b+bd+g-e-",
573*6e84dc96SRichard Miller 	52250,	"b+d+g-j+",
574*6e84dc96SRichard Miller 	52500,	"c+c+f+g+",
575*6e84dc96SRichard Miller 	52750,	"b+c+e+i+",
576*6e84dc96SRichard Miller 	53000,	"b+i+c+g+",
577*6e84dc96SRichard Miller 	53500,	"c+g+g-n+",
578*6e84dc96SRichard Miller 	53750,	"b+j+d-c+",
579*6e84dc96SRichard Miller 	54250,	"b+d-g-j-",
580*6e84dc96SRichard Miller 	54500,	"c-f+e+f+",
581*6e84dc96SRichard Miller 	54750,	"b+f-+c+g+",
582*6e84dc96SRichard Miller 	55000,	"b+g-d-g-",
583*6e84dc96SRichard Miller 	55250,	"b+e+e+g+",
584*6e84dc96SRichard Miller 	55500,	"b+cd++j+",
585*6e84dc96SRichard Miller 	55750,	"b+bh-d-f-",
586*6e84dc96SRichard Miller 	56250,	"c+d-b+j-",
587*6e84dc96SRichard Miller 	56500,	"c+d+c+i+",
588*6e84dc96SRichard Miller 	56750,	"b+e+d++h-",
589*6e84dc96SRichard Miller 	57000,	"b+d+g-f+",
590*6e84dc96SRichard Miller 	57250,	"b+f-m+d-",
591*6e84dc96SRichard Miller 	57750,	"b+i+c+e-",
592*6e84dc96SRichard Miller 	58000,	"b+e+d+h+",
593*6e84dc96SRichard Miller 	58250,	"c+b+g+g+",
594*6e84dc96SRichard Miller 	58750,	"d-e-j--e+",
595*6e84dc96SRichard Miller 	59000,	"d-i-+e+",
596*6e84dc96SRichard Miller 	59250,	"e--h-m+",
597*6e84dc96SRichard Miller 	59500,	"c+c-h+f-",
598*6e84dc96SRichard Miller 	59750,	"b+bh-e+i-",
599*6e84dc96SRichard Miller 	60250,	"b+bh-e-e-",
600*6e84dc96SRichard Miller 	60500,	"c+c-g-g-",
601*6e84dc96SRichard Miller 	60750,	"b+e-l-e-",
602*6e84dc96SRichard Miller 	61250,	"b+g-g-c+",
603*6e84dc96SRichard Miller 	61750,	"b+g-c+g+",
604*6e84dc96SRichard Miller 	62250,	"f--+c-i-",
605*6e84dc96SRichard Miller 	62750,	"e+f--+g+",
606*6e84dc96SRichard Miller 	64750,	"b+f+d+p-",
607*6e84dc96SRichard Miller };
608*6e84dc96SRichard Miller int	hintabsize	= nelem(hintab);
609