void parsegame(void) { register int c='*'; unsigned char m[128]; int i; setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); while( c!='[' && c!=EOF && Counter < MaxBookPly ) { while( (c=getchar()) != '.' && c!=EOF ) if(c=='{') { int csize=0; while( (c=getchar())!='}' && c!=EOF && csize<MaxComment ) csize++; } while( (c=getchar())==' ' || c=='\n' ) {} m[0]=c; i=1; while( (c=getchar())!=' ' && c!='\n' && c!=EOF ) { m[i]=c; i++; } m[i]='\0'; if( ! addmove(m) ) break; /* find black's move */ blackmove:; while( (c=getchar())==' ' || c=='\n' || c=='.' || isdigit(c) ) {} if( c=='{' ) /*** skip comment ***/ { int csize=0; while( (c=getchar())!='}' && c!=EOF && csize<MaxComment ) csize++; goto blackmove; } if( c=='[' || c==EOF ) return; m[0]=c; i=1; while( (c=getchar())!=' ' && c!='\n' && c!=EOF ) { m[i]=c; i++; } m[i]='\0'; if( ! addmove(m) ) break; } }
void paint3(Reg *r, int bn, int32 rb, int rn) { Reg *r1; Prog *p; int z; uint32 bb; z = bn/32; bb = 1L << (bn%32); if(r->act.b[z] & bb) return; for(;;) { if(!(r->refbehind.b[z] & bb)) break; r1 = (Reg*)r->f.p1; if(r1 == R) break; if(!(r1->refahead.b[z] & bb)) break; if(r1->act.b[z] & bb) break; r = r1; } if(LOAD(r) & ~(r->set.b[z] & ~(r->use1.b[z]|r->use2.b[z])) & bb) addmove(r, bn, rn, 0); for(;;) { r->act.b[z] |= bb; p = r->f.prog; if(r->use1.b[z] & bb) { if(debug['R'] && debug['v']) print("%P", p); addreg(&p->from, rn); if(debug['R'] && debug['v']) print(" ===change== %P\n", p); } if((r->use2.b[z]|r->set.b[z]) & bb) { if(debug['R'] && debug['v']) print("%P", p); addreg(&p->to, rn); if(debug['R'] && debug['v']) print(" ===change== %P\n", p); } if(STORE(r) & r->regdiff.b[z] & bb) addmove(r, bn, rn, 1); r->regu |= rb; if(r->refbehind.b[z] & bb) for(r1 = (Reg*)r->f.p2; r1 != R; r1 = (Reg*)r1->f.p2link) if(r1->refahead.b[z] & bb) paint3(r1, bn, rb, rn); if(!(r->refahead.b[z] & bb)) break; r1 = (Reg*)r->f.s2; if(r1 != R) if(r1->refbehind.b[z] & bb) paint3(r1, bn, rb, rn); r = (Reg*)r->f.s1; if(r == R) break; if(r->act.b[z] & bb) break; if(!(r->refbehind.b[z] & bb)) break; } }