4 * code sequences for multiply by constant.
13 static int maxmulops = 3; /* max # of ops to replace mul with */
20 static int docode(char *hp, char *cp, int r0, int r1);
21 static int gen1(int len);
22 static int gen2(int len, long r1);
23 static int gen3(int len, long r0, long r1, int flag);
26 SR1 = 1<<0, /* r1 has been shifted */
27 SR0 = 1<<1, /* r0 has been shifted */
28 UR1 = 1<<2, /* r1 has not been used */
29 UR0 = 1<<3, /* r0 has not been used */
46 for(g=0; g<nelem(multab); g++) {
56 * select a spot in cache to overwrite
59 if(multabp < 0 || multabp >= nelem(multab))
66 * look in execption hint table
74 if(v < hintab[g].val) {
78 if(v > hintab[g].val) {
85 if(docode(hintab[g].hint, m->code, 1, 0))
87 print("multiply table failure %ld\n", v);
96 for(g=1; g<=maxmulops; g++) {
97 if(g >= maxmulops && v >= 65535)
102 if(docode(hint, m->code, 1, 0))
104 print("multiply table failure %ld\n", v);
110 * try a recur followed by a shift
120 strcpy(m->code, m1->code);
121 sprint(strchr(m->code, 0), "%c0", g+'a');
130 docode(char *hp, char *cp, int r0, int r1)
145 if(docode(hp, cp, r0<<c, r1))
149 if(docode(hp, cp, r1<<c, r1))
153 if(docode(hp, cp, r0, r0<<c))
157 if(docode(hp, cp, r0, r1<<c))
169 if(docode(hp, cp, r0+r1, r1))
173 if(docode(hp, cp, r0, r0+r1))
185 if(docode(hp, cp, r0-r1, r1))
189 if(docode(hp, cp, r1-r0, r1))
193 if(docode(hp, cp, r0, r0-r1))
197 if(docode(hp, cp, r0, r1-r0))
220 for(shmax=1; shmax<30; shmax++) {
229 for(i=1; i<=shmax; i++)
230 if(gen2(len, 1<<i)) {
238 gen2(int len, long r1)
252 if(gen3(len, r1, r1+1, UR1)) {
256 if(gen3(len, r1-1, r1, UR0)) {
260 if(gen3(len, 1, r1+1, UR1)) {
264 if(gen3(len, 1, r1-1, UR1)) {
288 gen3(int len, long r0, long r1, int flag)
304 for(i=1; i<=shmax; i++) {
308 if(gen3(len, r0, x, f1)) {
317 for(i=1; i<=shmax; i++) {
321 if(gen3(len, r1, x, f1)) {
329 f1 = UR1|SR1|(flag&UR0);
330 for(i=1; i<=shmax; i++) {
334 if(gen3(len, r0, x, f1)) {
342 f1 = UR0|SR0|(flag&(SR1|UR1));
350 for(i=1; i<=shmax; i++) {
355 if(gen3(len, r1, x, f2)) {
360 if(gen3(len, x, r1, f1)) {
368 if(gen3(len, r0, x, UR1)) {
373 if(gen3(len, r1, x, UR1)) {
379 if(gen3(len, x, r1, UR0)) {
385 if(gen3(len, r0, x, UR1)) {
390 if(gen3(len, x, r0, UR0)) {
398 f1 = flag & (UR0|UR1);
400 for(i=1; i<=shmax; i++) {
412 if(mulval == r1+r0) {
416 if(mulval == r1-r0) {
429 * hint table has numbers that
430 * the search algorithm fails on.
609 int hintabsize = nelem(hintab);