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