Author: Matthias Gemuh
Date: 02:08:16 05/19/02
Go up one level in this thread
On May 19, 2002 at 04:00:32, Tim Foden wrote:
>On May 18, 2002 at 15:48:52, Matthias Gemuh wrote:
>
>>On May 18, 2002 at 13:52:57, Andrew Dados wrote:
>>
>>>On May 18, 2002 at 13:38:02, Matthias Gemuh wrote:
>>>
>>>>
>>>>Hi Experts,
>>>>I want to speed up my chess engine and need assembler versions of these
>>>>functions. These below seem to be pentium-specific. I need something general
>>>>and don't understand assembler.
>>>>
>>>>int FirstBit(BITBOARD a)
>>>>{
>>>> __asm {
>>>> bsr edx, dword ptr a+4
>>>> mov eax, 31
>>>> jnz l6
>>>> bsr edx, dword ptr a
>>>> mov eax, 63
>>>> jnz l6
>>>> mov edx, -1
>>>> l6: sub eax, edx
>>>> }
>>>>}
>>>>
>>>>int LastBit(BITBOARD a)
>>>>{
>>>> __asm {
>>>> bsf edx, dword ptr a
>>>> mov eax, 63
>>>> jnz l7
>>>> bsf edx, dword ptr a+4
>>>> mov eax, 31
>>>> jnz l7
>>>> mov edx, -33
>>>> l7: sub eax, edx
>>>> }
>>>>}
>>>>
>>>>Please, help me.
>>>>
>>>>Thanks,
>>>>Matthias.
>>>
>>>Those functions will work on all i386 - compatible processors. They are as
>>>general as assembler can get.
>>>
>>>-Andrew-
>>
>>
>>Unfortunately, they even crash on my Athlon 1.4, compiled with BCB 5.0.
>
>These look like the fucntions from Crafty? You need to take care, as they don't
>nessesarily work as you expect, as they invert the bit numbers.
>
>E.g. if bit 0 is set (a == 1), they will return 63.
>
>Maybe you are expecting that if bit 0 is set, they return 0?
>
>It is possible to write routines that do it this way round too.
>
>These are from GLC, but as I don't use them much (I mostly use routines that not
>only find a bit, but remove it too), they are probably not the fastest that is
>possible (XX is a define for an invalid square, in GLC it is -1).
>
>#pragma warning(disable: 4035) // disable warning about no return value
>inline Square BitScanForward( UINT64 bitmap )
>{
> __asm
> {
> bsf eax, [bitmap]
> jnz done
>
> bsf eax, [bitmap + 4]
> jz noBits
>
> add eax, 32
> jmp done
>
> noBits:
> mov eax, XX
>
> done:
> }
>
> // value returned in eax
>}
>
>inline Square BitScanReverse( UINT64 bitmap )
>{
> __asm
> {
> bsr eax, [bitmap + 4]
> jnz add32
>
> bsr eax, [bitmap]
> jnz done
>
> mov eax, XX
> jmp done
>
> add32:
> add eax, 32
>
> done:
> }
>
> // value returned in eax
>}
>#pragma warning(default: 4035)
>
>Cheers, Tim.
Thanks very much, Tim.
I had to change "[bitmap]" to "dword ptr bitmap" for Borland C++ Builder 5 to
swallow it. It was trying to use only quad words, independent of project
options.
Matthias.
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.