mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-17 07:36:23 +08:00
Use bsfq asm instruction to count bits
On 64 bit systems we can use bsfq instruction to count set bits in a bitboard. This is a patch for GCC and Intel compilers to take advantage of that and get a 2% speed up. Original patch from Heinz van Saanen, adapted to current tree by me. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
@@ -161,7 +161,7 @@ const int RShift[64] = {
|
||||
21, 22, 22, 22, 22, 22, 22, 21, 20, 21, 21, 21, 21, 21, 21, 20
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // defined(IS_64BIT)
|
||||
|
||||
|
||||
Bitboard RMask[64];
|
||||
@@ -245,16 +245,16 @@ void init_bitboards() {
|
||||
/// pop_1st_bit() finds and clears the least significant nonzero bit in a
|
||||
/// nonzero bitboard.
|
||||
|
||||
#if defined(IS_64BIT)
|
||||
#if defined(IS_64BIT) && !defined(USE_BSFQ)
|
||||
|
||||
Square pop_1st_bit(Bitboard *b) {
|
||||
Square pop_1st_bit(Bitboard* b) {
|
||||
Bitboard bb = *b ^ (*b - 1);
|
||||
uint32_t fold = int(bb) ^ int(bb >> 32);
|
||||
*b &= (*b - 1);
|
||||
return Square(BitTable[(fold * 0x783a9b23) >> 26]);
|
||||
}
|
||||
|
||||
#else
|
||||
#elif !defined(USE_BSFQ)
|
||||
|
||||
// Use type-punning
|
||||
union b_union {
|
||||
@@ -267,7 +267,7 @@ union b_union {
|
||||
};
|
||||
|
||||
// WARNING: Needs -fno-strict-aliasing compiler option
|
||||
Square pop_1st_bit(Bitboard *bb) {
|
||||
Square pop_1st_bit(Bitboard* bb) {
|
||||
|
||||
b_union u;
|
||||
uint32_t b;
|
||||
|
||||
Reference in New Issue
Block a user