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