mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-23 18:46:59 +08:00
Use intrinsics only for LSB/MSB
The NO_BSF does not cover any real life use-case today. The only compilers that can compile SF today, with the current Makefile and no source code changes, are either GCC compatible (define __GNUC__) or MSVC compatible (define _MSC_VER). So they all support LSB/MSB intrinsics. This patch simplifies away the software fall-backs of LSB/MSB that were still in Stockfish code, but unused in any of the officially supported compilers. Note the (legacy) MSVC/WIN32 case, where we use a 32-bit BSF/BSR solution, as 64-bit intrinsics aren't available there. Discussed in: https://github.com/official-stockfish/Stockfish/pull/1447 and: https://github.com/official-stockfish/Stockfish/pull/1479 No functional change.
This commit is contained in:
committed by
Stéphane Nicolet
parent
b605103a34
commit
edf4c07d25
@@ -303,7 +303,7 @@ inline int popcount(Bitboard b) {
|
||||
|
||||
/// lsb() and msb() return the least/most significant bit in a non-zero bitboard
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#if defined(__GNUC__) // GCC, Clang, ICC
|
||||
|
||||
inline Square lsb(Bitboard b) {
|
||||
assert(b);
|
||||
@@ -315,7 +315,9 @@ inline Square msb(Bitboard b) {
|
||||
return Square(63 ^ __builtin_clzll(b));
|
||||
}
|
||||
|
||||
#elif defined(_WIN64) && defined(_MSC_VER)
|
||||
#elif defined(_MSC_VER) // MSVC
|
||||
|
||||
#ifdef _WIN64 // MSVC, WIN64
|
||||
|
||||
inline Square lsb(Bitboard b) {
|
||||
assert(b);
|
||||
@@ -331,12 +333,39 @@ inline Square msb(Bitboard b) {
|
||||
return (Square) idx;
|
||||
}
|
||||
|
||||
#else
|
||||
#else // MSVC, WIN32
|
||||
|
||||
#define NO_BSF // Fallback on software implementation for other cases
|
||||
inline Square lsb(Bitboard b) {
|
||||
assert(b);
|
||||
unsigned long idx;
|
||||
|
||||
Square lsb(Bitboard b);
|
||||
Square msb(Bitboard b);
|
||||
if (b & 0xffffffff) {
|
||||
_BitScanForward(&idx, int32_t(b));
|
||||
return Square(idx);
|
||||
} else {
|
||||
_BitScanForward(&idx, int32_t(b >> 32));
|
||||
return Square(idx + 32);
|
||||
}
|
||||
}
|
||||
|
||||
inline Square msb(Bitboard b) {
|
||||
assert(b);
|
||||
unsigned long idx;
|
||||
|
||||
if (b >> 32) {
|
||||
_BitScanReverse(&idx, int32_t(b >> 32));
|
||||
return Square(idx + 32);
|
||||
} else {
|
||||
_BitScanReverse(&idx, int32_t(b));
|
||||
return Square(idx);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else // Compiler is neither GCC nor MSVC compatible
|
||||
|
||||
#error "Compiler not supported."
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user