Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: sliding attacks in three #define

Author: Robert Hyatt

Date: 20:35:59 04/10/04

Go up one level in this thread


On April 09, 2004 at 13:03:26, Vincent Diepeveen wrote:

>On April 09, 2004 at 12:01:20, rasjid chan wrote:
>
>I completely agree with Christophe.
>
>Faster than bitboards for complex software is using my publicly posted as Gerd
>says "straightforward code" to generate moves.
>
>Without inline assembly at opteron bitboards is just dead slow.

where do you get your info?  inline asm is worth less than 2% on the opteron.
Yet a single 2.2ghz cpu runs my "dead slow" program at > 2M nps.

I therefore have no idea what you are talking about...





>
>Who wants to program in assembly in the year 2004?

Some of us...


>
>>On April 09, 2004 at 10:59:45, Christophe Theron wrote:
>>
>>>On April 09, 2004 at 02:30:36, rasjid chan wrote:
>>>
>>>>
>>>>
>>>>I have a set of simple macros for bitboard operations and they are meant for
>>>>those with a new chess program and like to implement fast complete
>>>>attacks by bishops and rooks. It is basically just three #define and all sliding
>>>>attacks would then be available for use in evaluations and move ordering. Of
>>>>course it is only when we don't yet count instruction cycles,
>>>>but then after things are moving we could EASILY upgrade to
>>>>rotated bitboards.
>>>>
>>>>The only requirement is that the "all" bits must be available. Most chess
>>>>programmers sooner or later will have to use some bitboard operations as
>>>>there seem no escape for the sliding pieces and it is usually necessary to
>>>>incrementally update the "all" bits after makemove()and unmake().
>>>>
>>>>These bitboard operations just make use of simple direct intuitive
>>>>operations.If we have a single bit x, then x - 1 divides the board into
>>>>upper half and lower half and add to it some bitwise operations which
>>>>everyone say is fast. The only memory access is U64 diagonal[2][15]
>>>>and it is much better than U64 attack[64][64].
>>>>For those not using 0x88, they just need some simple editing.
>>>>
>>>>If anyone has something faster or can make them faster, please post.
>>>>
>>>>Best Regards
>>>>Rasjid
>>>>
>>>>
>>>>typedef unsigned _int64		U64
>>>>
>>>>#define GetFile64(sq)             ((sq) & 7)
>>>>#define GetRank64(sq)	          ((sq) >> 3)
>>>>#define iGetFile(sq88)            ((sq88) & 7)
>>>>#define iGetRank(sq88)            ((sq88) >> 4)
>>>>#define sq88Bit(sq88)             ((U64)1 << (((sq88) + ((sq88) & 7)) >> 1))
>>>>#define sq64Bit(sq64)	          (((U64)1) << (sq64))
>>>>#define sq88RankBits(sq88)       ((U64)0xff << ((sq88) >> 1 & 0370))
>>>>#define sq88FileBits(sq88)        ((U64) 0x0101010101010101 << ((sq88) & 7))
>>>>
>>>>//*** global variables
>>>>U64 all, diagonal[2][15];
>>>>
>>>>
>>>>//*** Start - bitboard attack operations for sliding pieces
>>>>
>>>>/*
>>>>	This test that the in-between arc (x, y) is clear of any bits.
>>>>        path is the complete bit path along x, y across the board
>>>>  */
>>>>
>>>>#define 	brq_path_clear(x, y, path)
>>>>	((x) <= (y)
>>>>	? ((x) == (y)  || isqBit(y) - 1 & ~(isqBit(x) - 1 | isqBit(x))
>>>>          &     (path)        & all ? 0 : 1)
>>>>		: (isqBit(x) - 1 & ~(isqBit(y) - 1 | isqBit(y))
>>>>                   & (path) & all ? 0 : 1))
>>>>
>>>>/*
>>>>	 given any two sq88 x, y , this test if they attack along
>>>>         diagonals.
>>>>  */
>>>>
>>>>#define		bstyle_attack(x, y)
>>>>	(iGetRank(x) + iGetFile(x) == iGetRank(y) + iGetFile(y)
>>>>		? (brq_path_clear(x, y, diagonal[1][iGetRank(x)
>>>>                     + iGetFile(x)]) ? 1 : 0)
>>>>		: (iGetRank(x) - iGetFile(x) == iGetRank(y) - iGetFile(y)
>>>>   	?  (brq_path_clear(x, y, diagonal[0][7 + iGetRank(x) - iGetFile(x)])
>>>>    ? 1 : 0) : 0))
>>>>
>>>>/*
>>>>	 given any two sq88 x, y , this test if they attack along
>>>>     rank or file.
>>>>  */
>>>>
>>>>#define		rstyle_attack(x, y)
>>>>	(iGetRank(x) == iGetRank(y)
>>>> 	? (brq_path_clear(x, y, isqRankBits(x)) ? 1 :  0)
>>>>			: (iGetFile(x) == iGetFile(y)
>>>>		?  (brq_path_clear(x, y, isqFileBits(x)) ? 1 :  0) : 0))
>>>>
>>>>
>>>>//*** End - bitboard attack operations for sliding pieces
>>>>
>>>>
>>>>	void pre_calculate_diagonal(){
>>>>		int  i, j, l;
>>>>	//get diagonal[2][15]
>>>>
>>>>
>>>>		memset(diagonal, 0, sizeof(diagonal));
>>>>		//LR down == [0][7 + r - f]
>>>>		//RL down == [1][r + f]
>>>>
>>>>		i = 0;
>>>>		while(!(i & 0x88)){
>>>>			l = iGetRank(i) - iGetFile(i);
>>>>			assert(7 + l >= 0 && 7 + l < 15);
>>>>			for (j = i; !(j & 0x88); j += 17){
>>>>				diagonal[0][7 + iGetRank(j) - iGetFile(j)] |= isqBit(j);
>>>>				assert(l == iGetRank(j) - iGetFile(j));
>>>>			}
>>>>
>>>>			l = iGetRank(i) + iGetFile(i);
>>>>			assert(l >= 0 && l < 15);
>>>>			for (j = i; !(j & 0x88); j += 15){
>>>>				diagonal[1][iGetRank(j) + iGetFile(j)] |= isqBit(j);
>>>>				assert(l == iGetRank(j) + iGetFile(j));
>>>>			}
>>>>			++i;
>>>>		}
>>>>
>>>>		i = 16;
>>>>		while(!(i & 0x88)){
>>>>			l = iGetRank(i) - iGetFile(i);
>>>>			assert(7 + l >= 0 && 7 + l < 15);
>>>>			for (j = i; !(j & 0x88); j += 17){
>>>>				diagonal[0][7 + iGetRank(j) - iGetFile(j)] |= isqBit(j);
>>>>				assert(l == iGetRank(j) - iGetFile(j));
>>>>			}
>>>>			i += 16;
>>>>		}
>>>>
>>>>		i = 23;
>>>>		while(!(i & 0x88)){
>>>>			l = iGetRank(i) + iGetFile(i);
>>>>			assert(l >= 0 && l < 15);
>>>>			for (j = i; !(j & 0x88); j += 15){
>>>>				diagonal[1][iGetRank(j) + iGetFile(j)] |= isqBit(j);
>>>>				assert(l == iGetRank(j) + iGetFile(j));
>>>>			}
>>>>			i += 16;
>>>>		}
>>>>	}
>>>
>>>
>>>
>>>
>>>Clearly, nothing beats the ugliness of bitboards.
>>>
>>>
>>>
>>>    Christophe
>>
>>...implement fast complete attacks...



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.