mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33: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:
parent
a6017aa728
commit
3901affb1d
2 changed files with 29 additions and 20 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue