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