4 * code sequences for multiply by constant.
19 static int docode(char *hp, char *cp, int r0, int r1);
20 static int gen1(int len);
21 static int gen2(int len, long r1);
22 static int gen3(int len, long r0, long r1, int flag);
25 SR1 = 1<<0, /* r1 has been shifted */
26 SR0 = 1<<1, /* r0 has been shifted */
27 UR1 = 1<<2, /* r1 has not been used */
28 UR0 = 1<<3, /* r0 has not been used */
45 for(g=0; g<nelem(multab); g++) {
55 * select a spot in cache to overwrite
58 if(multabp < 0 || multabp >= nelem(multab))
65 * look in execption hint table
73 if(v < hintab[g].val) {
77 if(v > hintab[g].val) {
84 if(docode(hintab[g].hint, m->code, 1, 0))
86 print("multiply table failure %ld\n", v);
96 if(g >= 6 && v >= 65535)
101 if(docode(hint, m->code, 1, 0))
103 print("multiply table failure %ld\n", v);
109 * try a recur followed by a shift
119 strcpy(m->code, m1->code);
120 sprint(strchr(m->code, 0), "%c0", g+'a');
129 docode(char *hp, char *cp, int r0, int r1)
144 if(docode(hp, cp, r0<<c, r1))
148 if(docode(hp, cp, r1<<c, r1))
152 if(docode(hp, cp, r0, r0<<c))
156 if(docode(hp, cp, r0, r1<<c))
168 if(docode(hp, cp, r0+r1, r1))
172 if(docode(hp, cp, r0, r0+r1))
184 if(docode(hp, cp, r0-r1, r1))
188 if(docode(hp, cp, r1-r0, r1))
192 if(docode(hp, cp, r0, r0-r1))
196 if(docode(hp, cp, r0, r1-r0))
219 for(shmax=1; shmax<30; shmax++) {
228 for(i=1; i<=shmax; i++)
229 if(gen2(len, 1<<i)) {
237 gen2(int len, long r1)
251 if(gen3(len, r1, r1+1, UR1)) {
255 if(gen3(len, r1-1, r1, UR0)) {
259 if(gen3(len, 1, r1+1, UR1)) {
263 if(gen3(len, 1, r1-1, UR1)) {
287 gen3(int len, long r0, long r1, int flag)
303 for(i=1; i<=shmax; i++) {
307 if(gen3(len, r0, x, f1)) {
316 for(i=1; i<=shmax; i++) {
320 if(gen3(len, r1, x, f1)) {
328 f1 = UR1|SR1|(flag&UR0);
329 for(i=1; i<=shmax; i++) {
333 if(gen3(len, r0, x, f1)) {
341 f1 = UR0|SR0|(flag&(SR1|UR1));
349 for(i=1; i<=shmax; i++) {
354 if(gen3(len, r1, x, f2)) {
359 if(gen3(len, x, r1, f1)) {
367 if(gen3(len, r0, x, UR1)) {
372 if(gen3(len, r1, x, UR1)) {
378 if(gen3(len, x, r1, UR0)) {
384 if(gen3(len, r0, x, UR1)) {
389 if(gen3(len, x, r0, UR0)) {
397 f1 = flag & (UR0|UR1);
399 for(i=1; i<=shmax; i++) {
411 if(mulval == r1+r0) {
415 if(mulval == r1-r0) {
428 * hint table has numbers that
429 * the search algorithm fails on.
608 int hintabsize = nelem(hintab);