Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Reversed vs. Rotated Bitboards

Author: Vincent Diepeveen

Date: 16:21:19 01/29/02

Go up one level in this thread


On January 28, 2002 at 16:48:53, Gerd Isenberg wrote:

>On January 28, 2002 at 15:23:09, Gerd Isenberg wrote:

it is both working of course, but the question for me
is 'how do i get the stuff out of the bitboard' cheaper?

In DIEP 2.0 without bitboards i need less clocks than all the
clocks needed for reversed/rotated.

The problem below is that the code looks nice to get
the attackers, but that you need loads of arrays and extra
instructions to get just the squares, also
an inversed array for each piece, to generate the rook moves
the other side.

If my rook is on e4, with the below trick (note i thought you
should first do occupiedRANK1 and only after that you
can do occupied>>square) you can get a bitmap with the
attacked squares from f4 to h4 and from e5 to e8.

Now the problem is i need to first 'convert' the square
to an inverse or whatever and then use that to get on the rest
of the bitmap and then convert every square of that back to
normal square numbers again.

This where in DIEP i directly have the squares already to do all
kind of cool stuff with it, with both rotated and/or reversed do
need to do all kind of stuff to just get a bitmap with the squares,
then again you need the nowadays bit faster but still dead slow
functions to get a bit out of the bitboards.

Only when BSF works on a 64 bits register and when bsf can be
executed with several instructions at the same time, then it gets
more interesting to again look again at adding a pawn board for me in
DIEP:

bitboard pawns[2]; /* indexed on color of course it's
                    * stupid to write all code twice.
                    */

>>BITBOARD RookAttacksForward(BOARD &occupied, char square)
>>{
>>	BITBOARD a,x,y;
>>
>>	x=occupied>>square;  // shift board so square ends in lower left corner
>>	y=x&RANK1;           // mask out ewerything but the first rank
>>	a=y^(y-2);           // get the attacked bits on this rank
>>	y=x&FILE1;           // now mask so we get a clean first file
>>	y=y^(y-2);           // get the attacked squares
>>	a=a|(y&FILE1);       // add the attacked bits after masking with the file again
>>	a=a<<square;        // shift the attacked bits back (for ease of readability)
>>
>>	return a;
>>}
>>
>>Thanks, very interesting. I can imagine, that this is faster than a table lookup
>>with the risc of cache miss, specially when you do it with assembler with mmx
>>registers (or waiting for hammer and 64bit compiler). Impressed about the
>>y^(y-2) operation, to get the attacked squares. I have to study it a while.
>>
>>Gerd
>
>OK, i understood. Nice for rooks on a1. The RookAttacksBackward(BOARD &occupied,
>char square) using the Reversed BitBoard is also "Reversed", and than the
>Bishops... You have to use Foreward and Reverse BitBoards for all Sliders or you
>have to reverse the "Reverse" Bitboard before oring them together.
>
>I use rotated, but i reduce the occupied state to 6Bits, ignoring the outer
>ones. Some lines of code:
>
>BitBoard sRankAtta[64][64];	// [square][six inner square state]
>BitBoard sFileAtta[64][64];	// [square][six inner square state]
>BitBoard sA1H8Atta[64][64];	// [square][six inner square state]
>BitBoard sH1A8Atta[64][64];	// [square][six inner square state]
>
>__forceinline unsigned int Square(unsigned int file, unsigned int rank)
> {return (rank<<3) | file;}
>__forceinline unsigned int Rank  (unsigned int sq)
> {return sq >> 3;}
>__forceinline unsigned int File	(unsigned int sq)
> {return sq & 7;}
>
>
>__forceinline BitBoard FileAttacks(unsigned int sq) const
>{
> return sFileAtta[sq][(*(((BYTE*)&(m_Inc.m_OccuBB90))+File(sq))
>   >> 1) & 0x3f];
>}
>__forceinline BitBoard RankAttacks(unsigned int sq) const
>{
> return sRankAtta[sq][(*(((BYTE*)&(m_Inc.m_PieceBB[ALLPIECES]))+Rank(sq))
>   >> 1) & 0x3f];
>}
>
>__forceinline BitBoard A1H8Attacks(unsigned int sq) const
>{
> return sA1H8Atta[sq][(*(((BYTE*)&(m_Inc.m_OccuBBA1H8))+((sq-Rank(sq)) & 7))
>   >> 1) & 0x3f];	// (file-rank) & 7
>}
>__forceinline BitBoard H1A8Attacks(unsigned int sq) const
>{
> return sH1A8Atta[sq][(*(((BYTE*)&(m_Inc.m_OccuBBH1A8))+(((~sq)-Rank(sq)) & 7))
>   >> 1) & 0x3f];// (mirrorfile-rank) & 7
>}
>
>...
>
>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.