X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fbitboard.h;h=ed01eada8fafe158dcb3a701e323afed5638dc6e;hb=350dff446481b9e274e54dc727141f0dbfec0b23;hp=cf948afc7c9398f4b63aa56d79409d34acc7f89c;hpb=a09eee579810fe446e34d0004e5716191310f4e4;p=stockfish diff --git a/src/bitboard.h b/src/bitboard.h index cf948afc..ed01eada 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -150,7 +150,17 @@ inline Bitboard file_bb(Square s) { } -/// shift() moves a bitboard one step along direction D. Mainly for pawns +/// make_bitboard() returns a bitboard from a list of squares + +constexpr Bitboard make_bitboard() { return 0; } + +template +constexpr Bitboard make_bitboard(Square s, Squares... squares) { + return (1ULL << s) | make_bitboard(squares...); +} + + +/// shift() moves a bitboard one step along direction D (mainly for pawns) template constexpr Bitboard shift(Bitboard b) { @@ -293,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); @@ -305,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); @@ -321,12 +333,39 @@ inline Square msb(Bitboard b) { return (Square) idx; } -#else +#else // MSVC, WIN32 + +inline Square lsb(Bitboard b) { + assert(b); + unsigned long idx; + + 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 -#define NO_BSF // Fallback on software implementation for other cases +#else // Compiler is neither GCC nor MSVC compatible -Square lsb(Bitboard b); -Square msb(Bitboard b); +#error "Compiler not supported." #endif