Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Bitboards generate moves King, Knight

Author: Gerd Isenberg

Date: 09:32:03 09/21/04

Go up one level in this thread


>>Pawn are still a problem I think, since the solution is not much nicer:
>>
>>( assuming the compiler understands the a negative shl is a shr )
>
>One possible solution is using a generalized branchless shift:
>
>http://www.azillionmonkeys.com/qed/asmexample.html
>
>---------------------------------------------------------------------
>8. Generalized shift (32-bit)
>
>unsigned long gensh(unsigned long v, int x) {
>int a, b;
>    a = (v << x) & -(((unsigned int)x) < 32);
>    x = -x;
>    b = (v >> x) & -(((unsigned int)x) < 32);
>    return a|b;
>}
>
>and asssembly
>---------------------------------------------------------------------
>
>for bitboards:
>
>BitBoard gensh(BitBoard v, int x) {
// oups BitBoard  not ont
>    BitBoard a, b;
>    a = (v << x) & -(((unsigned int)x) < 64);
>    x = -x;
>    b = (v >> x) & -(((unsigned int)x) < 64);
>    return a|b;
>}
>

the generated assembly look really terrible for x86-32 for that routine - forget
it ;-(

So the modified method posted by Russell is much better.

BitBoard rightPawnAttacks(BitBoard pawns, int color)
{
   return ((bb<<9)>>(color*16)) & notA;
}

BitBoard leftPawnAttacks(BitBoard pawns, int color)
{
   return ((bb<<7)>>(color*16)) & notH;
}


Since msc generates a call for "variable" 64-bit shift,
this inline assembly is probably the fastest to get pawn attacks with color
param.

BitBoard rightPawnAttacks(BitBoard pawns, int color)
{
   __asm
   {
      mov         eax,dword ptr [pawns]
      mov         edx,dword ptr [pawns+4] ; bb in edx:eax
      mov         ecx, [color]            ; white=0, black=1
      shld        edx,eax,9
      shl         ecx,4                   ; white=0, black=16
      shl         eax,9                   ; bb << 9
      shrd        eax,edx,cl
      shr         edx,cl                  ; bb >> white? 0 : 16
      and         eax,0FEFEFEFEh          ; & notA low board
      and         edx,0FEFEFEFEh          ; & notA high board
      // bitboard return via edx:eax
   }
}

The drawback with the assembly, if __forcedinline and color is compile time
constant: the compiler is not able to do any optimizations with that code.

Gerd




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.