Author: Gerd Isenberg
Date: 10:38:48 09/23/04
Go up one level in this thread
<snip>
>>An additional jnc after bsf/bsr is not so expensive, if always not taken,
>>specially compared to the huge latency of bsf/bsr. But it leaves the option to
>>build the traverse loop without an explicit != zero test.
>>
>
>That's exactly why you should do the test before bit scan. Should the return
>value be used as you described, the prototype would be blamed encouraging
>sub-optimal programming:)
Ok, but only because of the huge latency of bsf, even if mask is zero - and the
ability of ms-compiler, to interprete the zero flag already after clearing the
found bit with mask ^= m1. I guess not all compiler are able to do that and some
generate an explicit test.
Otherwise one could argue, that using an explicte zero test is a waste of time,
because bsf does the test anyway ;-)
int testbsf(int mask)
{
int clone = 0;
if (mask)
{ next:
int index = _BitScanForward(mask);
int m1 = 1 << index;
clone |= m1;
if ( mask ^= m1 )
goto next;
}
return clone;
}
versus
int testbsf(int mask)
{
int clone = 0;
int index
while ( (index = _BitScanForward(mask)) >= 0 )
{
int m1 = 1 << index;
mask ^= m1;
clone |= m1;
}
return clone;
}
with something like
fastcall
int _BitScanForward(unsigned int mask)
{
__asm
{
bsf eax,ecx
jnz bsfend ; zero flag not carry as i said before!
mov eax,-1
bsfend:
}
}
Cheers,
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.