Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: LSB and POPCOUNT optimization

Author: Eugene Nalimov

Date: 10:24:57 06/18/02

Go up one level in this thread


Your version of popcnt use behaviour that is not guaranteed to work on the
future CPUs. (Actually there is no guarantee that it works even on the current
CPUs)

Thanks,
Eugene

On June 18, 2002 at 13:14:28, Gerd Isenberg wrote:

>On June 18, 2002 at 12:15:09, Adriano Bedeschi de Souza wrote:
>
>>Could someone help me with LSB (MSB) and POPCOUNT optimization?
>>
>>thx,
>>Bedeschi
>
>some sample source code for msc6 with sone inline asm:
>
>PopCount / BitCount :
>
>#ifdef	_M_IX86
>__forceinline int _fastcall BitCount (BitBoard bb)
>{
>	__asm
>	{
>		mov     ecx, dword ptr bb
>		xor     eax, eax
>		test    ecx, ecx
>		jz      l1
>	l0: lea     edx, [ecx-1]
>		inc     eax
>		and     ecx, edx
>		jnz     l0
>	l1: mov     ecx, dword ptr bb+4
>		test    ecx, ecx
>		jz      l3
>	l2: lea     edx, [ecx-1]
>		inc     eax
>		and     ecx, edx
>		jnz     l2
>	l3:
>	}
>}
>#else
>__forceinline int _fastcall BitCount (BitBoard bb)
>{
>	static const UINT32 m1 = 0x55555555;
>	static const UINT32 m2 = 0x33333333;
>	static const UINT32 m3 = 0x0f0f0f0f;
>	UINT32 l = LOWBOARD(bb);
>	UINT32 h = HIGHBOARD(bb);
>	l = l - ((l>>1) & m1);
>	h = h - ((h>>1) & m1);
>	l = (l & m2) + ((l>>2) & m2);
>	h = (h & m2) + ((h>>2) & m2);
>	l = (l & m3) + ((l>>4) & m3);
>	h = (h & m3) + ((h>>4) & m3);
>	l = (l & 0x0ffff) + (l>>16);
>	h = (h & 0x0ffff) + (h>>16);
>	return ((l & 0x0ff) + (l>>8) + (h & 0x0ff) + (h>>8));
>}
>#endif
>
>
>LSB / BitSearch / BitScan:
>
>// precondition: bb not null
>__forceinline unsigned int BitSearch(BitBoard bb)
>{
>#ifdef	_M_IX86
>	__asm
>	{
>		bsf		eax,[bb+4]
>		xor		eax, 32
>		bsf		eax,[bb]
>	}
>#else
>	BitBoard lsbb = bb & (-(__int64)bb);
>	UINT32 lsb = LOWBOARD(lsbb) | HIGHBOARD(lsbb);
>	return ((((((((((HIGHBOARD(lsbb)!=0) <<1)
>				+((lsb & 0xffff0000)!=0))<<1)
>				+((lsb & 0xff00ff00)!=0))<<1)
>				+((lsb & 0xf0f0f0f0)!=0))<<1)
>				+((lsb & 0xcccccccc)!=0))<<1)
>				+((lsb & 0xaaaaaaaa)!=0);
>#endif
>}
>
>LSB with reset found bit:
>
>// precondition: bb not null
>__forceinline unsigned int BitSearchAndReset(BitBoard &bb)
>{
>#ifdef	_M_IX86
>	__asm
>	{
>		mov		edx, [bb]
>		bsf		eax, [edx+4]
>		xor		eax, 32
>		bsf		eax, [edx]
>		btr		[edx],eax
>	}
>#else
>	BitBoard lsbb = bb & (-(__int64)bb);
>	bb ^= lsbb;
>	UINT32 lsb = LOWBOARD(lsbb) | HIGHBOARD(lsbb);
>	return ((((((((((HIGHBOARD(lsbb)!=0) <<1)
>				+((lsb & 0xffff0000)!=0))<<1)
>				+((lsb & 0xff00ff00)!=0))<<1)
>				+((lsb & 0xf0f0f0f0)!=0))<<1)
>				+((lsb & 0xcccccccc)!=0))<<1)
>				+((lsb & 0xaaaaaaaa)!=0);
>#endif
>}
>
>to traverse BitBoards:
>
>   while (bb)
>   {
>      unsigned int sq = BitSearchAndReset(bb);
>      ....
>   }
>
>
>// msb in with inline asm
>
>#ifdef	_M_IX86
>__forceinline unsigned int BitSearchReverse(BitBoard bb)
>{
>	__asm
>	{
>		bsr		eax,[bb]
>		bsr		eax,[bb+4]
>		setnz	dl
>		shl		dl, 5
>		add		al, dl
>	}
>}
>#endif
>
>
>regards,
>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.