Author: Gerd Isenberg
Date: 12:58:39 04/17/03
Go up one level in this thread
On April 17, 2003 at 14:29:28, Andreas Herrmann wrote:
>Hi,
>
>i'm looking for a fast way to count all bits, which are set to 1 in a integer
>value. Is this possible, whithout a loop in Assembly or Delphi/Pascal.
>
>Andreas
Hi Andreas,
have a look on this side:
http://aggregate.org/MAGIC/
I use this bitboard one for athlon only, slightly modified from amd's
optimization guide:
Regards,
Gerd
#define CACHE_LINE 32
#define CACHE_ALIGN __declspec(align(CACHE_LINE))
struct SBitCountConsts
{
BitBoard C33;
BitBoard C55;
BitBoard C0F;
....
};
extern const SBitCountConsts BitCountConsts;
__forceinline
int BitCount (BitBoard bb)
{
__asm
{
movd mm0, word ptr bb
punpckldq mm0, word ptr bb + 4
lea eax, [BitCountConsts]
movq mm1,mm0
psrld mm0,1
pand mm0,[eax].C55
psubd mm1,mm0
movq mm0,mm1
psrld mm1,2
pand mm0,[eax].C33
pand mm1,[eax].C33
paddd mm0,mm1
movq mm1,mm0
psrld mm0,4
paddd mm0,mm1
pand mm0,[eax].C0F
pxor mm1,mm1
psadbw (mm0,mm1)
movd eax,mm0
}
}
// in some cpp file
const SBitCountConsts CACHE_ALIGN BitCountConsts =
{
0x3333333333333333, // C33
0x5555555555555555, // C55
0x0f0f0f0f0f0f0f0f, // C0F
....
};
This page took 0.01 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.