mirror of
https://github.com/sockspls/badfish
synced 2025-05-02 01:29:36 +00: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:
parent
b605103a34
commit
edf4c07d25
2 changed files with 35 additions and 68 deletions
|
@ -45,27 +45,11 @@ Magic BishopMagics[SQUARE_NB];
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// De Bruijn sequences. See chessprogramming.wikispaces.com/BitScan
|
|
||||||
const uint64_t DeBruijn64 = 0x3F79D71B4CB0A89ULL;
|
|
||||||
const uint32_t DeBruijn32 = 0x783A9B23;
|
|
||||||
|
|
||||||
int MSBTable[256]; // To implement software msb()
|
|
||||||
Square BSFTable[SQUARE_NB]; // To implement software bitscan
|
|
||||||
Bitboard RookTable[0x19000]; // To store rook attacks
|
Bitboard RookTable[0x19000]; // To store rook attacks
|
||||||
Bitboard BishopTable[0x1480]; // To store bishop attacks
|
Bitboard BishopTable[0x1480]; // To store bishop attacks
|
||||||
|
|
||||||
void init_magics(Bitboard table[], Magic magics[], Direction directions[]);
|
void init_magics(Bitboard table[], Magic magics[], Direction directions[]);
|
||||||
|
|
||||||
// bsf_index() returns the index into BSFTable[] to look up the bitscan. Uses
|
|
||||||
// Matt Taylor's folding for 32 bit case, extended to 64 bit by Kim Walisch.
|
|
||||||
|
|
||||||
unsigned bsf_index(Bitboard b) {
|
|
||||||
b ^= b - 1;
|
|
||||||
return Is64Bit ? (b * DeBruijn64) >> 58
|
|
||||||
: ((unsigned(b) ^ unsigned(b >> 32)) * DeBruijn32) >> 26;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// popcount16() counts the non-zero bits using SWAR-Popcount algorithm
|
// popcount16() counts the non-zero bits using SWAR-Popcount algorithm
|
||||||
|
|
||||||
unsigned popcount16(unsigned u) {
|
unsigned popcount16(unsigned u) {
|
||||||
|
@ -76,46 +60,6 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NO_BSF
|
|
||||||
|
|
||||||
/// Software fall-back of lsb() and msb() for CPU lacking hardware support
|
|
||||||
|
|
||||||
Square lsb(Bitboard b) {
|
|
||||||
assert(b);
|
|
||||||
return BSFTable[bsf_index(b)];
|
|
||||||
}
|
|
||||||
|
|
||||||
Square msb(Bitboard b) {
|
|
||||||
|
|
||||||
assert(b);
|
|
||||||
unsigned b32;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
if (b > 0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
b >>= 32;
|
|
||||||
result = 32;
|
|
||||||
}
|
|
||||||
|
|
||||||
b32 = unsigned(b);
|
|
||||||
|
|
||||||
if (b32 > 0xFFFF)
|
|
||||||
{
|
|
||||||
b32 >>= 16;
|
|
||||||
result += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b32 > 0xFF)
|
|
||||||
{
|
|
||||||
b32 >>= 8;
|
|
||||||
result += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Square(result + MSBTable[b32]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ifdef NO_BSF
|
|
||||||
|
|
||||||
|
|
||||||
/// Bitboards::pretty() returns an ASCII representation of a bitboard suitable
|
/// Bitboards::pretty() returns an ASCII representation of a bitboard suitable
|
||||||
/// to be printed to standard output. Useful for debugging.
|
/// to be printed to standard output. Useful for debugging.
|
||||||
|
@ -145,13 +89,7 @@ void Bitboards::init() {
|
||||||
PopCnt16[i] = (uint8_t) popcount16(i);
|
PopCnt16[i] = (uint8_t) popcount16(i);
|
||||||
|
|
||||||
for (Square s = SQ_A1; s <= SQ_H8; ++s)
|
for (Square s = SQ_A1; s <= SQ_H8; ++s)
|
||||||
{
|
|
||||||
SquareBB[s] = 1ULL << s;
|
SquareBB[s] = 1ULL << s;
|
||||||
BSFTable[bsf_index(SquareBB[s])] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Bitboard b = 2; b < 256; ++b)
|
|
||||||
MSBTable[b] = MSBTable[b - 1] + !more_than_one(b);
|
|
||||||
|
|
||||||
for (File f = FILE_A; f <= FILE_H; ++f)
|
for (File f = FILE_A; f <= FILE_H; ++f)
|
||||||
FileBB[f] = f > FILE_A ? FileBB[f - 1] << 1 : FileABB;
|
FileBB[f] = f > FILE_A ? FileBB[f - 1] << 1 : FileABB;
|
||||||
|
|
|
@ -303,7 +303,7 @@ inline int popcount(Bitboard b) {
|
||||||
|
|
||||||
/// lsb() and msb() return the least/most significant bit in a non-zero bitboard
|
/// 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) {
|
inline Square lsb(Bitboard b) {
|
||||||
assert(b);
|
assert(b);
|
||||||
|
@ -315,7 +315,9 @@ inline Square msb(Bitboard b) {
|
||||||
return Square(63 ^ __builtin_clzll(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) {
|
inline Square lsb(Bitboard b) {
|
||||||
assert(b);
|
assert(b);
|
||||||
|
@ -331,12 +333,39 @@ inline Square msb(Bitboard b) {
|
||||||
return (Square) idx;
|
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);
|
if (b & 0xffffffff) {
|
||||||
Square msb(Bitboard b);
|
_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
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue