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