1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Yet another pop_1st_bit() optimization

Always for 32 bit but withot relying on MSVC intrinsics.

It is very similar to previous ones, but this does not
segfaults due to -fno-strict-aliasing compiler option.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2008-10-12 14:34:54 +02:00
parent a6017aa728
commit 3901affb1d
2 changed files with 29 additions and 20 deletions

View file

@ -78,7 +78,7 @@ CXXFLAGS += -Wall -g
# General optimization flags. Note that -O2 might be faster than -O3 on some # General optimization flags. Note that -O2 might be faster than -O3 on some
# systems; this requires testing. # systems; this requires testing.
CXXFLAGS += -O3 -fno-exceptions -fomit-frame-pointer -fno-rtti -fstrict-aliasing CXXFLAGS += -O3 -fno-exceptions -fomit-frame-pointer -fno-rtti -fno-strict-aliasing
# Disable most annoying warnings for the Intel C++ compiler # Disable most annoying warnings for the Intel C++ compiler

View file

@ -349,30 +349,39 @@ Square first_1(Bitboard b) {
/// pop_1st_bit() finds and clears the least significant nonzero bit in a /// pop_1st_bit() finds and clears the least significant nonzero bit in a
/// nonzero bitboard. /// nonzero bitboard.
#if defined(USE_32BIT_ATTACKS) && defined(_MSC_VER) #if defined(USE_32BIT_ATTACKS)
// On 32bit system compiled with MSVC this verion seems // Use type-punning
// slightly faster then the standard one. union b_union {
Square pop_1st_bit(Bitboard *b) { Bitboard b;
struct {
uint32_t l;
uint32_t h;
};
};
unsigned long index; // WARNING: Needs -fno-strict-aliasing compiler option
uint32_t *l, *h; Square pop_1st_bit(Bitboard *bb) {
if (*(l = (uint32_t*)b) != 0) b_union u;
{ uint32_t b;
_BitScanForward(&index, *l);
*l &= ~(1 << index);
}
else if (*(h = (uint32_t*)b + 1) != 0)
{
_BitScanForward(&index, *h);
*h &= ~(1 << index);
index += 32;
} else
return SQ_NONE;
return Square(index); u.b = *bb;
if (u.l)
{
b = u.l;
*((uint32_t*)bb) = b & (b - 1);
b ^= (b - 1);
}
else
{
b = u.h;
*((uint32_t*)bb+1) = b & (b - 1); // Little endian only?
b = ~(b ^ (b - 1));
}
return Square(BitTable[(b * 0x783a9b23) >> 26]);
} }
#else #else