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 snprint(m->code, sizeof m->code, "%s%c0", m1->code, g+'a');
128 docode(char *hp, char *cp, int r0, int r1)
143 if(docode(hp, cp, r0<<c, r1))
147 if(docode(hp, cp, r1<<c, r1))
151 if(docode(hp, cp, r0, r0<<c))
155 if(docode(hp, cp, r0, r1<<c))
167 if(docode(hp, cp, r0+r1, r1))
171 if(docode(hp, cp, r0, r0+r1))
183 if(docode(hp, cp, r0-r1, r1))
187 if(docode(hp, cp, r1-r0, r1))
191 if(docode(hp, cp, r0, r0-r1))
195 if(docode(hp, cp, r0, r1-r0))
218 for(shmax=1; shmax<30; shmax++) {
227 for(i=1; i<=shmax; i++)
228 if(gen2(len, 1<<i)) {
236 gen2(int len, long r1)
250 if(gen3(len, r1, r1+1, UR1)) {
254 if(gen3(len, r1-1, r1, UR0)) {
258 if(gen3(len, 1, r1+1, UR1)) {
262 if(gen3(len, 1, r1-1, UR1)) {
286 gen3(int len, long r0, long r1, int flag)
302 for(i=1; i<=shmax; i++) {
306 if(gen3(len, r0, x, f1)) {
315 for(i=1; i<=shmax; i++) {
319 if(gen3(len, r1, x, f1)) {
327 f1 = UR1|SR1|(flag&UR0);
328 for(i=1; i<=shmax; i++) {
332 if(gen3(len, r0, x, f1)) {
340 f1 = UR0|SR0|(flag&(SR1|UR1));
348 for(i=1; i<=shmax; i++) {
353 if(gen3(len, r1, x, f2)) {
358 if(gen3(len, x, r1, f1)) {
366 if(gen3(len, r0, x, UR1)) {
371 if(gen3(len, r1, x, UR1)) {
377 if(gen3(len, x, r1, UR0)) {
383 if(gen3(len, r0, x, UR1)) {
388 if(gen3(len, x, r0, UR0)) {
396 f1 = flag & (UR0|UR1);
398 for(i=1; i<=shmax; i++) {
410 if(mulval == r1+r0) {
414 if(mulval == r1-r0) {
427 * hint table has numbers that
428 * the search algorithm fails on.
607 int hintabsize = nelem(hintab);