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.