Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: A faster move generator than previously known

Author: Sune Fischer

Date: 03:47:34 08/08/03

Go up one level in this thread


On August 07, 2003 at 23:48:51, Vincent Diepeveen wrote:

>You guys can figure out the rest i bet seeing this code.
>
>All that bitboard idiocy always. This kicks the hell out of it.

I doubt it, I can with bitboards incrementally generate 59 Mn/s on my 2Gig, you
claim 73 Mn/s on 2.1Gig, but that's not incrementally I bet.

Also, you seem to be doing Pseudo move gen, with a capital P, do you also add
moves where the king walks into a check?
This would make your silly test faster so I assume you do.

Of course now you'll have to waste time sorting the illegal moves, not to
mention making and unmaking them.

Try and sort the moves, feel free to do bubble sort or whatever, you'll end up
in the 20 Mn/s range.

Btw. if I or others cared about optimizing this routine as much as you do, we'd
all be going 100+ Mn/s :)

-S.

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