13e12c5d1SDavid du Colombier #include "gc.h"
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier /*
43e12c5d1SDavid du Colombier * code sequences for multiply by constant.
53e12c5d1SDavid du Colombier * [a-l][0-3]
63e12c5d1SDavid du Colombier * lsl $(A-'a'),r0,r1
73e12c5d1SDavid du Colombier * [+][0-7]
83e12c5d1SDavid du Colombier * add r0,r1,r2
93e12c5d1SDavid du Colombier * [-][0-7]
103e12c5d1SDavid du Colombier * sub r0,r1,r2
113e12c5d1SDavid du Colombier */
12219b2ee8SDavid du Colombier
13219b2ee8SDavid du Colombier static int multabp;
14219b2ee8SDavid du Colombier static long mulval;
15219b2ee8SDavid du Colombier static char* mulcp;
16219b2ee8SDavid du Colombier static long valmax;
17219b2ee8SDavid du Colombier static int shmax;
18219b2ee8SDavid du Colombier
19219b2ee8SDavid du Colombier static int docode(char *hp, char *cp, int r0, int r1);
20219b2ee8SDavid du Colombier static int gen1(int len);
21219b2ee8SDavid du Colombier static int gen2(int len, long r1);
22219b2ee8SDavid du Colombier static int gen3(int len, long r0, long r1, int flag);
23219b2ee8SDavid du Colombier enum
243e12c5d1SDavid du Colombier {
25219b2ee8SDavid du Colombier SR1 = 1<<0, /* r1 has been shifted */
26219b2ee8SDavid du Colombier SR0 = 1<<1, /* r0 has been shifted */
27219b2ee8SDavid du Colombier UR1 = 1<<2, /* r1 has not been used */
28*375daca8SDavid du Colombier UR0 = 1<<3 /* r0 has not been used */
293e12c5d1SDavid du Colombier };
303e12c5d1SDavid du Colombier
31219b2ee8SDavid du Colombier Multab*
mulcon0(Node * n,long v)32219b2ee8SDavid du Colombier mulcon0(Node *n, long v)
33219b2ee8SDavid du Colombier {
34219b2ee8SDavid du Colombier int a1, a2, g;
35219b2ee8SDavid du Colombier Multab *m, *m1;
36219b2ee8SDavid du Colombier char hint[10];
37219b2ee8SDavid du Colombier
38219b2ee8SDavid du Colombier if(v < 0)
39219b2ee8SDavid du Colombier v = -v;
40219b2ee8SDavid du Colombier
41219b2ee8SDavid du Colombier /*
42219b2ee8SDavid du Colombier * look in cache
43219b2ee8SDavid du Colombier */
44219b2ee8SDavid du Colombier m = multab;
45219b2ee8SDavid du Colombier for(g=0; g<nelem(multab); g++) {
46219b2ee8SDavid du Colombier if(m->val == v) {
47219b2ee8SDavid du Colombier if(m->code[0] == 0)
48219b2ee8SDavid du Colombier return 0;
49219b2ee8SDavid du Colombier return m;
50219b2ee8SDavid du Colombier }
51219b2ee8SDavid du Colombier m++;
52219b2ee8SDavid du Colombier }
53219b2ee8SDavid du Colombier
54219b2ee8SDavid du Colombier /*
55219b2ee8SDavid du Colombier * select a spot in cache to overwrite
56219b2ee8SDavid du Colombier */
57219b2ee8SDavid du Colombier multabp++;
58219b2ee8SDavid du Colombier if(multabp < 0 || multabp >= nelem(multab))
59219b2ee8SDavid du Colombier multabp = 0;
60219b2ee8SDavid du Colombier m = multab+multabp;
61219b2ee8SDavid du Colombier m->val = v;
62219b2ee8SDavid du Colombier mulval = v;
63219b2ee8SDavid du Colombier
64219b2ee8SDavid du Colombier /*
65219b2ee8SDavid du Colombier * look in execption hint table
66219b2ee8SDavid du Colombier */
67219b2ee8SDavid du Colombier a1 = 0;
68219b2ee8SDavid du Colombier a2 = hintabsize;
69219b2ee8SDavid du Colombier for(;;) {
70219b2ee8SDavid du Colombier if(a1 >= a2)
71219b2ee8SDavid du Colombier goto no;
72219b2ee8SDavid du Colombier g = (a2 + a1)/2;
73219b2ee8SDavid du Colombier if(v < hintab[g].val) {
74219b2ee8SDavid du Colombier a2 = g;
75219b2ee8SDavid du Colombier continue;
76219b2ee8SDavid du Colombier }
77219b2ee8SDavid du Colombier if(v > hintab[g].val) {
78219b2ee8SDavid du Colombier a1 = g+1;
79219b2ee8SDavid du Colombier continue;
80219b2ee8SDavid du Colombier }
81219b2ee8SDavid du Colombier break;
82219b2ee8SDavid du Colombier }
83219b2ee8SDavid du Colombier
84219b2ee8SDavid du Colombier if(docode(hintab[g].hint, m->code, 1, 0))
85219b2ee8SDavid du Colombier return m;
86219b2ee8SDavid du Colombier print("%L: multiply table failure %ld\n", n->lineno, v);
87219b2ee8SDavid du Colombier m->code[0] = 0;
88219b2ee8SDavid du Colombier return 0;
89219b2ee8SDavid du Colombier
90219b2ee8SDavid du Colombier no:
91219b2ee8SDavid du Colombier /*
92219b2ee8SDavid du Colombier * try to search
93219b2ee8SDavid du Colombier */
94219b2ee8SDavid du Colombier hint[0] = 0;
95219b2ee8SDavid du Colombier for(g=1; g<=6; g++) {
96219b2ee8SDavid du Colombier if(g >= 6 && v >= 65535)
97219b2ee8SDavid du Colombier break;
98219b2ee8SDavid du Colombier mulcp = hint+g;
99219b2ee8SDavid du Colombier *mulcp = 0;
100219b2ee8SDavid du Colombier if(gen1(g)) {
101219b2ee8SDavid du Colombier if(docode(hint, m->code, 1, 0))
102219b2ee8SDavid du Colombier return m;
103219b2ee8SDavid du Colombier print("%L: multiply table failure (g=%d h=%s) %ld\n",
104219b2ee8SDavid du Colombier n->lineno, g, hint, v);
105219b2ee8SDavid du Colombier break;
106219b2ee8SDavid du Colombier }
107219b2ee8SDavid du Colombier }
108219b2ee8SDavid du Colombier
109219b2ee8SDavid du Colombier /*
110219b2ee8SDavid du Colombier * try a recur followed by a shift
111219b2ee8SDavid du Colombier */
112219b2ee8SDavid du Colombier g = 0;
113219b2ee8SDavid du Colombier while(!(v & 1)) {
114219b2ee8SDavid du Colombier g++;
115219b2ee8SDavid du Colombier v >>= 1;
116219b2ee8SDavid du Colombier }
117219b2ee8SDavid du Colombier if(g) {
118219b2ee8SDavid du Colombier m1 = mulcon0(n, v);
119219b2ee8SDavid du Colombier if(m1) {
120219b2ee8SDavid du Colombier strcpy(m->code, m1->code);
121219b2ee8SDavid du Colombier sprint(strchr(m->code, 0), "%c0", g+'a');
122219b2ee8SDavid du Colombier return m;
123219b2ee8SDavid du Colombier }
124219b2ee8SDavid du Colombier }
125219b2ee8SDavid du Colombier m->code[0] = 0;
126219b2ee8SDavid du Colombier return 0;
127219b2ee8SDavid du Colombier }
128219b2ee8SDavid du Colombier
129219b2ee8SDavid du Colombier static int
docode(char * hp,char * cp,int r0,int r1)130219b2ee8SDavid du Colombier docode(char *hp, char *cp, int r0, int r1)
131219b2ee8SDavid du Colombier {
132219b2ee8SDavid du Colombier int c, i;
133219b2ee8SDavid du Colombier
134219b2ee8SDavid du Colombier c = *hp++;
135219b2ee8SDavid du Colombier *cp = c;
136219b2ee8SDavid du Colombier cp += 2;
137219b2ee8SDavid du Colombier switch(c) {
138219b2ee8SDavid du Colombier default:
139219b2ee8SDavid du Colombier c -= 'a';
140219b2ee8SDavid du Colombier if(c < 1 || c >= 30)
141219b2ee8SDavid du Colombier break;
142219b2ee8SDavid du Colombier for(i=0; i<4; i++) {
143219b2ee8SDavid du Colombier switch(i) {
144219b2ee8SDavid du Colombier case 0:
145219b2ee8SDavid du Colombier if(docode(hp, cp, r0<<c, r1))
146219b2ee8SDavid du Colombier goto out;
147219b2ee8SDavid du Colombier break;
148219b2ee8SDavid du Colombier case 1:
149219b2ee8SDavid du Colombier if(docode(hp, cp, r1<<c, r1))
150219b2ee8SDavid du Colombier goto out;
151219b2ee8SDavid du Colombier break;
152219b2ee8SDavid du Colombier case 2:
153219b2ee8SDavid du Colombier if(docode(hp, cp, r0, r0<<c))
154219b2ee8SDavid du Colombier goto out;
155219b2ee8SDavid du Colombier break;
156219b2ee8SDavid du Colombier case 3:
157219b2ee8SDavid du Colombier if(docode(hp, cp, r0, r1<<c))
158219b2ee8SDavid du Colombier goto out;
159219b2ee8SDavid du Colombier break;
160219b2ee8SDavid du Colombier }
161219b2ee8SDavid du Colombier }
162219b2ee8SDavid du Colombier break;
163219b2ee8SDavid du Colombier
164219b2ee8SDavid du Colombier case '+':
165219b2ee8SDavid du Colombier for(i=0; i<8; i++) {
166219b2ee8SDavid du Colombier cp[-1] = i+'0';
167219b2ee8SDavid du Colombier switch(i) {
168219b2ee8SDavid du Colombier case 1:
169219b2ee8SDavid du Colombier if(docode(hp, cp, r0+r1, r1))
170219b2ee8SDavid du Colombier goto out;
171219b2ee8SDavid du Colombier break;
172219b2ee8SDavid du Colombier case 5:
173219b2ee8SDavid du Colombier if(docode(hp, cp, r0, r0+r1))
174219b2ee8SDavid du Colombier goto out;
175219b2ee8SDavid du Colombier break;
176219b2ee8SDavid du Colombier }
177219b2ee8SDavid du Colombier }
178219b2ee8SDavid du Colombier break;
179219b2ee8SDavid du Colombier
180219b2ee8SDavid du Colombier case '-':
181219b2ee8SDavid du Colombier for(i=0; i<8; i++) {
182219b2ee8SDavid du Colombier cp[-1] = i+'0';
183219b2ee8SDavid du Colombier switch(i) {
184219b2ee8SDavid du Colombier case 1:
185219b2ee8SDavid du Colombier if(docode(hp, cp, r0-r1, r1))
186219b2ee8SDavid du Colombier goto out;
187219b2ee8SDavid du Colombier break;
188219b2ee8SDavid du Colombier case 2:
189219b2ee8SDavid du Colombier if(docode(hp, cp, r1-r0, r1))
190219b2ee8SDavid du Colombier goto out;
191219b2ee8SDavid du Colombier break;
192219b2ee8SDavid du Colombier case 5:
193219b2ee8SDavid du Colombier if(docode(hp, cp, r0, r0-r1))
194219b2ee8SDavid du Colombier goto out;
195219b2ee8SDavid du Colombier break;
196219b2ee8SDavid du Colombier case 6:
197219b2ee8SDavid du Colombier if(docode(hp, cp, r0, r1-r0))
198219b2ee8SDavid du Colombier goto out;
199219b2ee8SDavid du Colombier break;
200219b2ee8SDavid du Colombier }
201219b2ee8SDavid du Colombier }
202219b2ee8SDavid du Colombier break;
203219b2ee8SDavid du Colombier
204219b2ee8SDavid du Colombier case 0:
205219b2ee8SDavid du Colombier if(r0 == mulval)
206219b2ee8SDavid du Colombier return 1;
207219b2ee8SDavid du Colombier }
208219b2ee8SDavid du Colombier return 0;
209219b2ee8SDavid du Colombier
210219b2ee8SDavid du Colombier out:
211219b2ee8SDavid du Colombier cp[-1] = i+'0';
212219b2ee8SDavid du Colombier return 1;
213219b2ee8SDavid du Colombier }
214219b2ee8SDavid du Colombier
215219b2ee8SDavid du Colombier static int
gen1(int len)216219b2ee8SDavid du Colombier gen1(int len)
217219b2ee8SDavid du Colombier {
218219b2ee8SDavid du Colombier int i;
219219b2ee8SDavid du Colombier
220219b2ee8SDavid du Colombier for(shmax=1; shmax<30; shmax++) {
221219b2ee8SDavid du Colombier valmax = 1<<shmax;
222219b2ee8SDavid du Colombier if(valmax >= mulval)
223219b2ee8SDavid du Colombier break;
224219b2ee8SDavid du Colombier }
225219b2ee8SDavid du Colombier if(mulval == 1)
226219b2ee8SDavid du Colombier return 1;
227219b2ee8SDavid du Colombier
228219b2ee8SDavid du Colombier len--;
229219b2ee8SDavid du Colombier for(i=1; i<=shmax; i++)
230219b2ee8SDavid du Colombier if(gen2(len, 1<<i)) {
231219b2ee8SDavid du Colombier *--mulcp = 'a'+i;
232219b2ee8SDavid du Colombier return 1;
233219b2ee8SDavid du Colombier }
234219b2ee8SDavid du Colombier return 0;
235219b2ee8SDavid du Colombier }
236219b2ee8SDavid du Colombier
237219b2ee8SDavid du Colombier static int
gen2(int len,long r1)238219b2ee8SDavid du Colombier gen2(int len, long r1)
239219b2ee8SDavid du Colombier {
240219b2ee8SDavid du Colombier int i;
241219b2ee8SDavid du Colombier
242219b2ee8SDavid du Colombier if(len <= 0) {
243219b2ee8SDavid du Colombier if(r1 == mulval)
244219b2ee8SDavid du Colombier return 1;
245219b2ee8SDavid du Colombier return 0;
246219b2ee8SDavid du Colombier }
247219b2ee8SDavid du Colombier
248219b2ee8SDavid du Colombier len--;
249219b2ee8SDavid du Colombier if(len == 0)
250219b2ee8SDavid du Colombier goto calcr0;
251219b2ee8SDavid du Colombier
252219b2ee8SDavid du Colombier if(gen3(len, r1, r1+1, UR1)) {
253219b2ee8SDavid du Colombier i = '+';
254219b2ee8SDavid du Colombier goto out;
255219b2ee8SDavid du Colombier }
256219b2ee8SDavid du Colombier if(gen3(len, r1-1, r1, UR0)) {
257219b2ee8SDavid du Colombier i = '-';
258219b2ee8SDavid du Colombier goto out;
259219b2ee8SDavid du Colombier }
260219b2ee8SDavid du Colombier if(gen3(len, 1, r1+1, UR1)) {
261219b2ee8SDavid du Colombier i = '+';
262219b2ee8SDavid du Colombier goto out;
263219b2ee8SDavid du Colombier }
264219b2ee8SDavid du Colombier if(gen3(len, 1, r1-1, UR1)) {
265219b2ee8SDavid du Colombier i = '-';
266219b2ee8SDavid du Colombier goto out;
267219b2ee8SDavid du Colombier }
268219b2ee8SDavid du Colombier
269219b2ee8SDavid du Colombier return 0;
270219b2ee8SDavid du Colombier
271219b2ee8SDavid du Colombier calcr0:
272219b2ee8SDavid du Colombier if(mulval == r1+1) {
273219b2ee8SDavid du Colombier i = '+';
274219b2ee8SDavid du Colombier goto out;
275219b2ee8SDavid du Colombier }
276219b2ee8SDavid du Colombier if(mulval == r1-1) {
277219b2ee8SDavid du Colombier i = '-';
278219b2ee8SDavid du Colombier goto out;
279219b2ee8SDavid du Colombier }
280219b2ee8SDavid du Colombier return 0;
281219b2ee8SDavid du Colombier
282219b2ee8SDavid du Colombier out:
283219b2ee8SDavid du Colombier *--mulcp = i;
284219b2ee8SDavid du Colombier return 1;
285219b2ee8SDavid du Colombier }
286219b2ee8SDavid du Colombier
287219b2ee8SDavid du Colombier static int
gen3(int len,long r0,long r1,int flag)288219b2ee8SDavid du Colombier gen3(int len, long r0, long r1, int flag)
289219b2ee8SDavid du Colombier {
290219b2ee8SDavid du Colombier int i, f1, f2;
291219b2ee8SDavid du Colombier long x;
292219b2ee8SDavid du Colombier
293219b2ee8SDavid du Colombier if(r0 <= 0 ||
294219b2ee8SDavid du Colombier r0 >= r1 ||
295219b2ee8SDavid du Colombier r1 > valmax)
296219b2ee8SDavid du Colombier return 0;
297219b2ee8SDavid du Colombier
298219b2ee8SDavid du Colombier len--;
299219b2ee8SDavid du Colombier if(len == 0)
300219b2ee8SDavid du Colombier goto calcr0;
301219b2ee8SDavid du Colombier
302219b2ee8SDavid du Colombier if(!(flag & UR1)) {
303219b2ee8SDavid du Colombier f1 = UR1|SR1;
304219b2ee8SDavid du Colombier for(i=1; i<=shmax; i++) {
305219b2ee8SDavid du Colombier x = r0<<i;
306219b2ee8SDavid du Colombier if(x > valmax)
307219b2ee8SDavid du Colombier break;
308219b2ee8SDavid du Colombier if(gen3(len, r0, x, f1)) {
309219b2ee8SDavid du Colombier i += 'a';
310219b2ee8SDavid du Colombier goto out;
311219b2ee8SDavid du Colombier }
312219b2ee8SDavid du Colombier }
313219b2ee8SDavid du Colombier }
314219b2ee8SDavid du Colombier
315219b2ee8SDavid du Colombier if(!(flag & UR0)) {
316219b2ee8SDavid du Colombier f1 = UR1|SR1;
317219b2ee8SDavid du Colombier for(i=1; i<=shmax; i++) {
318219b2ee8SDavid du Colombier x = r1<<i;
319219b2ee8SDavid du Colombier if(x > valmax)
320219b2ee8SDavid du Colombier break;
321219b2ee8SDavid du Colombier if(gen3(len, r1, x, f1)) {
322219b2ee8SDavid du Colombier i += 'a';
323219b2ee8SDavid du Colombier goto out;
324219b2ee8SDavid du Colombier }
325219b2ee8SDavid du Colombier }
326219b2ee8SDavid du Colombier }
327219b2ee8SDavid du Colombier
328219b2ee8SDavid du Colombier if(!(flag & SR1)) {
329219b2ee8SDavid du Colombier f1 = UR1|SR1|(flag&UR0);
330219b2ee8SDavid du Colombier for(i=1; i<=shmax; i++) {
331219b2ee8SDavid du Colombier x = r1<<i;
332219b2ee8SDavid du Colombier if(x > valmax)
333219b2ee8SDavid du Colombier break;
334219b2ee8SDavid du Colombier if(gen3(len, r0, x, f1)) {
335219b2ee8SDavid du Colombier i += 'a';
336219b2ee8SDavid du Colombier goto out;
337219b2ee8SDavid du Colombier }
338219b2ee8SDavid du Colombier }
339219b2ee8SDavid du Colombier }
340219b2ee8SDavid du Colombier
341219b2ee8SDavid du Colombier if(!(flag & SR0)) {
342219b2ee8SDavid du Colombier f1 = UR0|SR0|(flag&(SR1|UR1));
343219b2ee8SDavid du Colombier
344219b2ee8SDavid du Colombier f2 = UR1|SR1;
345219b2ee8SDavid du Colombier if(flag & UR1)
346219b2ee8SDavid du Colombier f2 |= UR0;
347219b2ee8SDavid du Colombier if(flag & SR1)
348219b2ee8SDavid du Colombier f2 |= SR0;
349219b2ee8SDavid du Colombier
350219b2ee8SDavid du Colombier for(i=1; i<=shmax; i++) {
351219b2ee8SDavid du Colombier x = r0<<i;
352219b2ee8SDavid du Colombier if(x > valmax)
353219b2ee8SDavid du Colombier break;
354219b2ee8SDavid du Colombier if(x > r1) {
355219b2ee8SDavid du Colombier if(gen3(len, r1, x, f2)) {
356219b2ee8SDavid du Colombier i += 'a';
357219b2ee8SDavid du Colombier goto out;
358219b2ee8SDavid du Colombier }
359219b2ee8SDavid du Colombier } else
360219b2ee8SDavid du Colombier if(gen3(len, x, r1, f1)) {
361219b2ee8SDavid du Colombier i += 'a';
362219b2ee8SDavid du Colombier goto out;
363219b2ee8SDavid du Colombier }
364219b2ee8SDavid du Colombier }
365219b2ee8SDavid du Colombier }
366219b2ee8SDavid du Colombier
367219b2ee8SDavid du Colombier x = r1+r0;
368219b2ee8SDavid du Colombier if(gen3(len, r0, x, UR1)) {
369219b2ee8SDavid du Colombier i = '+';
370219b2ee8SDavid du Colombier goto out;
371219b2ee8SDavid du Colombier }
372219b2ee8SDavid du Colombier
373219b2ee8SDavid du Colombier if(gen3(len, r1, x, UR1)) {
374219b2ee8SDavid du Colombier i = '+';
375219b2ee8SDavid du Colombier goto out;
376219b2ee8SDavid du Colombier }
377219b2ee8SDavid du Colombier
378219b2ee8SDavid du Colombier x = r1-r0;
379219b2ee8SDavid du Colombier if(gen3(len, x, r1, UR0)) {
380219b2ee8SDavid du Colombier i = '-';
381219b2ee8SDavid du Colombier goto out;
382219b2ee8SDavid du Colombier }
383219b2ee8SDavid du Colombier
384219b2ee8SDavid du Colombier if(x > r0) {
385219b2ee8SDavid du Colombier if(gen3(len, r0, x, UR1)) {
386219b2ee8SDavid du Colombier i = '-';
387219b2ee8SDavid du Colombier goto out;
388219b2ee8SDavid du Colombier }
389219b2ee8SDavid du Colombier } else
390219b2ee8SDavid du Colombier if(gen3(len, x, r0, UR0)) {
391219b2ee8SDavid du Colombier i = '-';
392219b2ee8SDavid du Colombier goto out;
393219b2ee8SDavid du Colombier }
394219b2ee8SDavid du Colombier
395219b2ee8SDavid du Colombier return 0;
396219b2ee8SDavid du Colombier
397219b2ee8SDavid du Colombier calcr0:
398219b2ee8SDavid du Colombier f1 = flag & (UR0|UR1);
399219b2ee8SDavid du Colombier if(f1 == UR1) {
400219b2ee8SDavid du Colombier for(i=1; i<=shmax; i++) {
401219b2ee8SDavid du Colombier x = r1<<i;
402219b2ee8SDavid du Colombier if(x >= mulval) {
403219b2ee8SDavid du Colombier if(x == mulval) {
404219b2ee8SDavid du Colombier i += 'a';
405219b2ee8SDavid du Colombier goto out;
406219b2ee8SDavid du Colombier }
407219b2ee8SDavid du Colombier break;
408219b2ee8SDavid du Colombier }
409219b2ee8SDavid du Colombier }
410219b2ee8SDavid du Colombier }
411219b2ee8SDavid du Colombier
412219b2ee8SDavid du Colombier if(mulval == r1+r0) {
413219b2ee8SDavid du Colombier i = '+';
414219b2ee8SDavid du Colombier goto out;
415219b2ee8SDavid du Colombier }
416219b2ee8SDavid du Colombier if(mulval == r1-r0) {
417219b2ee8SDavid du Colombier i = '-';
418219b2ee8SDavid du Colombier goto out;
419219b2ee8SDavid du Colombier }
420219b2ee8SDavid du Colombier
421219b2ee8SDavid du Colombier return 0;
422219b2ee8SDavid du Colombier
423219b2ee8SDavid du Colombier out:
424219b2ee8SDavid du Colombier *--mulcp = i;
425219b2ee8SDavid du Colombier return 1;
426219b2ee8SDavid du Colombier }
427219b2ee8SDavid du Colombier
428219b2ee8SDavid du Colombier /*
429219b2ee8SDavid du Colombier * hint table has numbers that
430219b2ee8SDavid du Colombier * the search algorithm fails on.
431219b2ee8SDavid du Colombier * <1000:
432219b2ee8SDavid du Colombier * all numbers
433219b2ee8SDavid du Colombier * <5000:
434219b2ee8SDavid du Colombier * ÷ by 5
435219b2ee8SDavid du Colombier * <10000:
436219b2ee8SDavid du Colombier * ÷ by 50
437219b2ee8SDavid du Colombier * <65536:
438219b2ee8SDavid du Colombier * ÷ by 250
439219b2ee8SDavid du Colombier */
440219b2ee8SDavid du Colombier Hintab hintab[] =
441219b2ee8SDavid du Colombier {
442219b2ee8SDavid du Colombier 683, "b++d+e+",
443219b2ee8SDavid du Colombier 687, "b+e++e-",
444219b2ee8SDavid du Colombier 691, "b++d+e+",
445219b2ee8SDavid du Colombier 731, "b++d+e+",
446219b2ee8SDavid du Colombier 811, "b++d+i+",
447219b2ee8SDavid du Colombier 821, "b++e+e+",
448219b2ee8SDavid du Colombier 843, "b+d++e+",
449219b2ee8SDavid du Colombier 851, "b+f-+e-",
450219b2ee8SDavid du Colombier 853, "b++e+e+",
451219b2ee8SDavid du Colombier 877, "c++++g-",
452219b2ee8SDavid du Colombier 933, "b+c++g-",
453219b2ee8SDavid du Colombier 981, "c-+e-d+",
454219b2ee8SDavid du Colombier 1375, "b+c+b+h-",
455219b2ee8SDavid du Colombier 1675, "d+b++h+",
456219b2ee8SDavid du Colombier 2425, "c++f-e+",
457219b2ee8SDavid du Colombier 2675, "c+d++f-",
458219b2ee8SDavid du Colombier 2750, "b+d-b+h-",
459219b2ee8SDavid du Colombier 2775, "c-+g-e-",
460219b2ee8SDavid du Colombier 3125, "b++e+g+",
461219b2ee8SDavid du Colombier 3275, "b+c+g+e+",
462219b2ee8SDavid du Colombier 3350, "c++++i+",
463219b2ee8SDavid du Colombier 3475, "c-+e-f-",
464219b2ee8SDavid du Colombier 3525, "c-+d+g-",
465219b2ee8SDavid du Colombier 3625, "c-+e-j+",
466219b2ee8SDavid du Colombier 3675, "b+d+d+e+",
467219b2ee8SDavid du Colombier 3725, "b+d-+h+",
468219b2ee8SDavid du Colombier 3925, "b+d+f-d-",
469219b2ee8SDavid du Colombier 4275, "b+g++e+",
470219b2ee8SDavid du Colombier 4325, "b+h-+d+",
471219b2ee8SDavid du Colombier 4425, "b+b+g-j-",
472219b2ee8SDavid du Colombier 4525, "b+d-d+f+",
473219b2ee8SDavid du Colombier 4675, "c++d-g+",
474219b2ee8SDavid du Colombier 4775, "b+d+b+g-",
475219b2ee8SDavid du Colombier 4825, "c+c-+i-",
476219b2ee8SDavid du Colombier 4850, "c++++i-",
477219b2ee8SDavid du Colombier 4925, "b++e-g-",
478219b2ee8SDavid du Colombier 4975, "c+f++e-",
479219b2ee8SDavid du Colombier 5500, "b+g-c+d+",
480219b2ee8SDavid du Colombier 6700, "d+b++i+",
481219b2ee8SDavid du Colombier 9700, "d++++j-",
482219b2ee8SDavid du Colombier 11000, "b+f-c-h-",
483219b2ee8SDavid du Colombier 11750, "b+d+g+j-",
484219b2ee8SDavid du Colombier 12500, "b+c+e-k+",
485219b2ee8SDavid du Colombier 13250, "b+d+e-f+",
486219b2ee8SDavid du Colombier 13750, "b+h-c-d+",
487219b2ee8SDavid du Colombier 14250, "b+g-c+e-",
488219b2ee8SDavid du Colombier 14500, "c+f+j-d-",
489219b2ee8SDavid du Colombier 14750, "d-g--f+",
490219b2ee8SDavid du Colombier 16750, "b+e-d-n+",
491219b2ee8SDavid du Colombier 17750, "c+h-b+e+",
492219b2ee8SDavid du Colombier 18250, "d+b+h-d+",
493219b2ee8SDavid du Colombier 18750, "b+g-++f+",
494219b2ee8SDavid du Colombier 19250, "b+e+b+h+",
495219b2ee8SDavid du Colombier 19750, "b++h--f-",
496219b2ee8SDavid du Colombier 20250, "b+e-l-c+",
497219b2ee8SDavid du Colombier 20750, "c++bi+e-",
498219b2ee8SDavid du Colombier 21250, "b+i+l+c+",
499219b2ee8SDavid du Colombier 22000, "b+e+d-g-",
500219b2ee8SDavid du Colombier 22250, "b+d-h+k-",
501219b2ee8SDavid du Colombier 22750, "b+d-e-g+",
502219b2ee8SDavid du Colombier 23250, "b+c+h+e-",
503219b2ee8SDavid du Colombier 23500, "b+g-c-g-",
504219b2ee8SDavid du Colombier 23750, "b+g-b+h-",
505219b2ee8SDavid du Colombier 24250, "c++g+m-",
506219b2ee8SDavid du Colombier 24750, "b+e+e+j-",
507219b2ee8SDavid du Colombier 25000, "b++dh+g+",
508219b2ee8SDavid du Colombier 25250, "b+e+d-g-",
509219b2ee8SDavid du Colombier 25750, "b+e+b+j+",
510219b2ee8SDavid du Colombier 26250, "b+h+c+e+",
511219b2ee8SDavid du Colombier 26500, "b+h+c+g+",
512219b2ee8SDavid du Colombier 26750, "b+d+e+g-",
513219b2ee8SDavid du Colombier 27250, "b+e+e+f+",
514219b2ee8SDavid du Colombier 27500, "c-i-c-d+",
515219b2ee8SDavid du Colombier 27750, "b+bd++j+",
516219b2ee8SDavid du Colombier 28250, "d-d-++i-",
517219b2ee8SDavid du Colombier 28500, "c+c-h-e-",
518219b2ee8SDavid du Colombier 29000, "b+g-d-f+",
519219b2ee8SDavid du Colombier 29500, "c+h+++e-",
520219b2ee8SDavid du Colombier 29750, "b+g+f-c+",
521219b2ee8SDavid du Colombier 30250, "b+f-g-c+",
522219b2ee8SDavid du Colombier 33500, "c-f-d-n+",
523219b2ee8SDavid du Colombier 33750, "b+d-b+j-",
524219b2ee8SDavid du Colombier 34250, "c+e+++i+",
525219b2ee8SDavid du Colombier 35250, "e+b+d+k+",
526219b2ee8SDavid du Colombier 35500, "c+e+d-g-",
527219b2ee8SDavid du Colombier 35750, "c+i-++e+",
528219b2ee8SDavid du Colombier 36250, "b+bh-d+e+",
529219b2ee8SDavid du Colombier 36500, "c+c-h-e-",
530219b2ee8SDavid du Colombier 36750, "d+e--i+",
531219b2ee8SDavid du Colombier 37250, "b+g+g+b+",
532219b2ee8SDavid du Colombier 37500, "b+h-b+f+",
533219b2ee8SDavid du Colombier 37750, "c+be++j-",
534219b2ee8SDavid du Colombier 38500, "b+e+b+i+",
535219b2ee8SDavid du Colombier 38750, "d+i-b+d+",
536219b2ee8SDavid du Colombier 39250, "b+g-l-+d+",
537219b2ee8SDavid du Colombier 39500, "b+g-c+g-",
538219b2ee8SDavid du Colombier 39750, "b+bh-c+f-",
539219b2ee8SDavid du Colombier 40250, "b+bf+d+g-",
540219b2ee8SDavid du Colombier 40500, "b+g-c+g+",
541219b2ee8SDavid du Colombier 40750, "c+b+i-e+",
542219b2ee8SDavid du Colombier 41250, "d++bf+h+",
543219b2ee8SDavid du Colombier 41500, "b+j+c+d-",
544219b2ee8SDavid du Colombier 41750, "c+f+b+h-",
545219b2ee8SDavid du Colombier 42500, "c+h++g+",
546219b2ee8SDavid du Colombier 42750, "b+g+d-f-",
547219b2ee8SDavid du Colombier 43250, "b+l-e+d-",
548219b2ee8SDavid du Colombier 43750, "c+bd+h+f-",
549219b2ee8SDavid du Colombier 44000, "b+f+g-d-",
550219b2ee8SDavid du Colombier 44250, "b+d-g--f+",
551219b2ee8SDavid du Colombier 44500, "c+e+c+h+",
552219b2ee8SDavid du Colombier 44750, "b+e+d-h-",
553219b2ee8SDavid du Colombier 45250, "b++g+j-g+",
554219b2ee8SDavid du Colombier 45500, "c+d+e-g+",
555219b2ee8SDavid du Colombier 45750, "b+d-h-e-",
556219b2ee8SDavid du Colombier 46250, "c+bd++j+",
557219b2ee8SDavid du Colombier 46500, "b+d-c-j-",
558219b2ee8SDavid du Colombier 46750, "e-e-b+g-",
559219b2ee8SDavid du Colombier 47000, "b+c+d-j-",
560219b2ee8SDavid du Colombier 47250, "b+e+e-g-",
561219b2ee8SDavid du Colombier 47500, "b+g-c-h-",
562219b2ee8SDavid du Colombier 47750, "b+f-c+h-",
563219b2ee8SDavid du Colombier 48250, "d--h+n-",
564219b2ee8SDavid du Colombier 48500, "b+c-g+m-",
565219b2ee8SDavid du Colombier 48750, "b+e+e-g+",
566219b2ee8SDavid du Colombier 49500, "c-f+e+j-",
567219b2ee8SDavid du Colombier 49750, "c+c+g++f-",
568219b2ee8SDavid du Colombier 50000, "b+e+e+k+",
569219b2ee8SDavid du Colombier 50250, "b++i++g+",
570219b2ee8SDavid du Colombier 50500, "c+g+f-i+",
571219b2ee8SDavid du Colombier 50750, "b+e+d+k-",
572219b2ee8SDavid du Colombier 51500, "b+i+c-f+",
573219b2ee8SDavid du Colombier 51750, "b+bd+g-e-",
574219b2ee8SDavid du Colombier 52250, "b+d+g-j+",
575219b2ee8SDavid du Colombier 52500, "c+c+f+g+",
576219b2ee8SDavid du Colombier 52750, "b+c+e+i+",
577219b2ee8SDavid du Colombier 53000, "b+i+c+g+",
578219b2ee8SDavid du Colombier 53500, "c+g+g-n+",
579219b2ee8SDavid du Colombier 53750, "b+j+d-c+",
580219b2ee8SDavid du Colombier 54250, "b+d-g-j-",
581219b2ee8SDavid du Colombier 54500, "c-f+e+f+",
582219b2ee8SDavid du Colombier 54750, "b+f-+c+g+",
583219b2ee8SDavid du Colombier 55000, "b+g-d-g-",
584219b2ee8SDavid du Colombier 55250, "b+e+e+g+",
585219b2ee8SDavid du Colombier 55500, "b+cd++j+",
586219b2ee8SDavid du Colombier 55750, "b+bh-d-f-",
587219b2ee8SDavid du Colombier 56250, "c+d-b+j-",
588219b2ee8SDavid du Colombier 56500, "c+d+c+i+",
589219b2ee8SDavid du Colombier 56750, "b+e+d++h-",
590219b2ee8SDavid du Colombier 57000, "b+d+g-f+",
591219b2ee8SDavid du Colombier 57250, "b+f-m+d-",
592219b2ee8SDavid du Colombier 57750, "b+i+c+e-",
593219b2ee8SDavid du Colombier 58000, "b+e+d+h+",
594219b2ee8SDavid du Colombier 58250, "c+b+g+g+",
595219b2ee8SDavid du Colombier 58750, "d-e-j--e+",
596219b2ee8SDavid du Colombier 59000, "d-i-+e+",
597219b2ee8SDavid du Colombier 59250, "e--h-m+",
598219b2ee8SDavid du Colombier 59500, "c+c-h+f-",
599219b2ee8SDavid du Colombier 59750, "b+bh-e+i-",
600219b2ee8SDavid du Colombier 60250, "b+bh-e-e-",
601219b2ee8SDavid du Colombier 60500, "c+c-g-g-",
602219b2ee8SDavid du Colombier 60750, "b+e-l-e-",
603219b2ee8SDavid du Colombier 61250, "b+g-g-c+",
604219b2ee8SDavid du Colombier 61750, "b+g-c+g+",
605219b2ee8SDavid du Colombier 62250, "f--+c-i-",
606219b2ee8SDavid du Colombier 62750, "e+f--+g+",
607219b2ee8SDavid du Colombier 64750, "b+f+d+p-",
608219b2ee8SDavid du Colombier };
609219b2ee8SDavid du Colombier int hintabsize = nelem(hintab);
610