Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: A faster move generator than previously known

Author: José Carlos

Date: 23:50:01 08/07/03

Go up one level in this thread


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.

  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.01 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.