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:
lucasart
2018-03-12 06:56:14 +08:00
committed by Stéphane Nicolet
parent b605103a34
commit edf4c07d25
2 changed files with 35 additions and 68 deletions

View File

@@ -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