X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=ed01eada8fafe158dcb3a701e323afed5638dc6e;hp=9fc53ee760dba05673157faaa841b933e61e34f4;hb=edf4c07d251f1d6c709d47969bfe1452194d9430;hpb=b605103a34be5bea7815ab3f6d4a21d487d0182b diff --git a/src/bitboard.h b/src/bitboard.h index 9fc53ee7..ed01eada 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -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 + +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