Author: Gerd Isenberg
Date: 03:03:00 07/13/03
Hi all,
Matt Taylor's invention of the super magic de Bruijn Constant 0x78291ACF is of
course usefull for yet another, but fast and portable _firstOne_ Bitscan routine
with only one 32bit multiplication!
int firstOneKey(BitBoard bb)
{
BitBoard lsb = bb ^ (bb - 1);
unsigned int foldedLSB = ((int) lsb) ^ ((int)(lsb>>32));
return (foldedLSB * 0x78291ACF) >> (32-6); // range is 0..63
// to get the bit index, a table lookup is required
}
Because i'am still looking for a fast key-fuction for two single populated move
bitboards, i tried the obvious approach to use Matt's routine twice. It works
like firstOneKey(from)*64 + firtsOneKey(to) and therefore maps to a 64*64-range.
int getMoveKey(BitBoard frbit, BitBoard tobit)
{
frbit -= 1; tobit -= 1;
unsigned int foldedfr = ((int) frbit) ^ ((int)(frbit>>32));
unsigned int foldedto = ((int) tobit) ^ ((int)(tobit>>32));
return ((foldedfr*0x78291ACF) ^ ((foldedto*0x78291ACF) >> 6)) >> 20;
}
x86 assembler output of this routine:
00401435 83 C6 FF add esi,0FFFFFFFFh
00401438 83 D1 FF adc ecx,0FFFFFFFFh
0040143B 83 C2 FF add edx,0FFFFFFFFh
0040143E 83 D0 FF adc eax,0FFFFFFFFh
00401441 33 CE xor ecx,esi
00401443 33 C2 xor eax,edx
00401445 69 C9 CF 1A 29 78 imul ecx,ecx,78291ACFh
0040144B 69 C0 CF 1A 29 78 imul eax,eax,78291ACFh
00401451 C1 E8 06 shr eax,6
00401454 33 C1 xor eax,ecx
00401456 C1 E8 14 shr eax,14h
only 36 Bytes - but two 32-bit multiplications.
Two questions:
Any ideas to it better, eg. only by one multiplication?
Why are the unsigned multiplications translated to "imul" by the compiler?
Thanks in advance,
Gerd
This page took 0.03 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.