Author: Vincent Diepeveen
Date: 04:40:14 08/08/03
Go up one level in this thread
On August 08, 2003 at 02:50:01, José Carlos wrote: >On August 07, 2003 at 23:48:51, Vincent Diepeveen wrote: > > > I've tried something like that in the past. My move generator is faster that >this one. In my other program (with non rotated bitboards) the move generator >alone is slower, but I can calculate many things very cheap. If I try to do in >my 0x88 program all the stuff I do in my bitboard program, it gets twice slower >instantly. > Feel free to say that this happens because I'm a very bad programmer, if you >feel better that way. Yes you are a very poor programmer unless you tested at a 486. You hardly have branch mispredictions with this move generator in case you didn't notice. So it kicks the hell out of anything you do in advance, because 2 branch mispredictions is already more expensive than generating 1 move with this generator. > José C. > > > > >>You guys can figure out the rest i bet seeing this code. >> >>All that bitboard idiocy always. This kicks the hell out of it. >> >>Vincent Diepeveen, >>8 august 2003 5:53 AM >> >>#if MSVC >>__inline >>#endif >>void GenMovesI(RecursionBlock *rb,int sq) { >> int SRsq,piece,u,xside,*s,*t,side,*v,*w; >> >> side = rb->side; >> xside = rb->xside; >> SRsq = (sq<<6); >> piece = board[sq]; >> if( piece == pawn ) { >> v = ipiecepos[side][sq]; >> w = ipawndir[side][sq]; >> u = *v++; >> if( row(u) != 0 && row(u) != 7 ) { >> if( color[u] == neutral) { >> rb->zetend->zet = (SRsq|u); >> rb->zetend++; >> if( (u=*v) != 128 && color[u] == neutral ) { /* indien u == sq dan false >>*/ >> rb->zetend->zet = (SRsq|u); >> rb->zetend++; >> } >> } >> >> u = *w++; >> if( color[u] == xside ) {/* ppos bevat geen 100, maar sq. */ >> rb->zetend->zet = (SRsq|u|move_captures); >> rb->zetend++; >> } >> if( (u=*w) != 128 && color[u] == xside ) { >> rb->zetend->zet = (SRsq|u|move_captures); >> rb->zetend++; >> } >> } >> else { >> if( color[u] == neutral) { >> rb->zetend->zet = (SRsq|u|move_pqueen); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_pknight); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_prook); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_pbishop); >> rb->zetend++; >> } >> u = *w++; >> if( color[u] == xside) {/* captures */ >> rb->zetend->zet = (SRsq|u|move_captures|move_pqueen); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_captures|move_pknight); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_captures|move_prook); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_captures|move_pbishop); >> rb->zetend++; >> } >> if( (u=*w) != 128 && color[u] == xside) { >> rb->zetend->zet = (SRsq|u|move_captures|move_pqueen); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_captures|move_pknight); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_captures|move_prook); >> rb->zetend++; >> rb->zetend->zet = (SRsq|u|move_captures|move_pbishop); >> rb->zetend++; >> } >> } >> } >> else { >> t = cancapside[side]; >> if( sweep[piece] ) { >> int *vh,*wh,uh; >> s = andscan[0]; >> vh = ipiecepos[piece][sq]; >> wh = iskippos[sq]; >> uh = *vh++; >> do { >> int p1=snelbord[uh],sh=wh[uh]; /* local variables is faster for GCC/MSVC >>*/ >> vh += (s[p1]&sh); >> if( color[uh] != side ) { >> rb->zetend->zet = (SRsq|uh|t[p1]); >> rb->zetend++; >> } >> } while( (uh=*vh++) != 128 ); >> >> /*vi = gentable[piece-3][sq]; >> s = doorscan[0]; >> u = vi[sq]; >> do { >> if( color[u] != side ) { >> cappiece = snelbord[u]; >> rb->zetend->zet = (SRsq|u|t[cappiece]); >> rb->zetend++; >> u = vi[(s[cappiece]|u)]; >> } >> else { >> u = vi[(64|u)]; >> } >> } while( u != 128 );*/ >> } >> else { >> v = ipiecepos[piece][sq]; >> u = *v++; >> do { >> if( color[u] != side ) { >> rb->zetend->zet = (SRsq|u|t[snelbord[u]]); >> rb->zetend++; >> } >> } while( (u=*v++) != 128 ); >> } >> } >>} >> >>void MoveListI(RecursionBlock *rb,struct Move *CFEP) { >>/* Generate all semi-legal moves. Check is ignored. >>*/ >> int f,to,from,u,*psq,*pend,*w; >> >> to = CFEP->zet&63; >> rb->zetend = rb->SemiLegals; >> if( board[to] == pawn ) { /* for enpassant */ >> from = (CFEP->zet>>6)&63; >> if( to-from == 16 || from-to == 16 ) { >> f = (to+from)>>1; >> w = ipawndir[rb->xside][f]; >> u = *w++; >> if( color[u] == rb->side && board[u] == pawn ) { >> rb->zetend->zet = ((u<<6)|f|move_captures|move_enpassant); >> rb->zetend++; >> } >> if( (u=*w) != 128 && color[u] == rb->side && board[u] == pawn ) { >> rb->zetend->zet = ((u<<6)|f|move_captures|move_enpassant); >> rb->zetend++; >> } >> } >> } >> >> psq = PieceList[rb->side]; >> pend = PieceList[rb->side]+PieceMax[rb->side]; >> if( !castld[rb->side] ) { >> u = *psq; >> if( castle(rb->side,u,u+2) ) { >> rb->zetend->zet = ((u<<6)|(u+2)|move_castles); >> rb->zetend++; >> } >> if( castle(rb->side,u,u-2) ) { >> rb->zetend->zet = ((u<<6)|(u-2)|move_castles); >> rb->zetend++; >> } >> } >> >> #if BOUNDSCHECKING >> pend++; >> do { >> pend--; >> if( *pend != 64 ) >> GenMovesI(rb,*pend); >> } while( pend > psq ); >> #else >> do { >> if( *pend != 64 ) >> GenMovesI(rb,*pend); >> } while( --pend >= psq ); >> #endif >>} /* End MoveList() */
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.