X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=6dd07d5407f85bc431328915c8c459e3a043d7f7;hp=24ae794b68b0f4183087a882cb94ca1bd64cc29c;hb=10e64e05094e75d89baa4495fa867a8a64195bb7;hpb=099b5e45e6fb84c0c6ac9c867e0902e0195d97a5 diff --git a/src/bitboard.h b/src/bitboard.h index 24ae794b..6dd07d54 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -57,11 +57,19 @@ inline Bitboard operator&(Bitboard b, Square s) { } inline Bitboard& operator|=(Bitboard& b, Square s) { - return b |= SquareBB[s], b; + return b |= SquareBB[s]; } inline Bitboard& operator^=(Bitboard& b, Square s) { - return b ^= SquareBB[s], b; + return b ^= SquareBB[s]; +} + +inline Bitboard operator|(Bitboard b, Square s) { + return b | SquareBB[s]; +} + +inline Bitboard operator^(Bitboard b, Square s) { + return b ^ SquareBB[s]; } @@ -116,43 +124,28 @@ inline Bitboard in_front_bb(Color c, Square s) { } -/// Functions for computing sliding attack bitboards. rook_attacks_bb(), -/// bishop_attacks_bb() and queen_attacks_bb() all take a square and a -/// bitboard of occupied squares as input, and return a bitboard representing -/// all squares attacked by a rook, bishop or queen on the given square. +/// Functions for computing sliding attack bitboards. Function attacks_bb() takes +/// a square and a bitboard of occupied squares as input, and returns a bitboard +/// representing all squares attacked by Pt (bishop or rook) on the given square. +template +FORCE_INLINE unsigned magic_index(Square s, Bitboard occ) { -#if defined(IS_64BIT) + Bitboard* const Masks = Pt == ROOK ? RMasks : BMasks; + Bitboard* const Magics = Pt == ROOK ? RMagics : BMagics; + unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts; -FORCE_INLINE unsigned r_index(Square s, Bitboard occ) { - return unsigned(((occ & RMasks[s]) * RMagics[s]) >> RShifts[s]); -} + if (Is64Bit) + return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[s]); -FORCE_INLINE unsigned b_index(Square s, Bitboard occ) { - return unsigned(((occ & BMasks[s]) * BMagics[s]) >> BShifts[s]); + unsigned lo = unsigned(occ) & unsigned(Masks[s]); + unsigned hi = unsigned(occ >> 32) & unsigned(Masks[s] >> 32); + return (lo * unsigned(Magics[s]) ^ hi * unsigned(Magics[s] >> 32)) >> Shifts[s]; } -#else // if !defined(IS_64BIT) - -FORCE_INLINE unsigned r_index(Square s, Bitboard occ) { - unsigned lo = unsigned(occ) & unsigned(RMasks[s]); - unsigned hi = unsigned(occ >> 32) & unsigned(RMasks[s] >> 32); - return (lo * unsigned(RMagics[s]) ^ hi * unsigned(RMagics[s] >> 32)) >> RShifts[s]; -} - -FORCE_INLINE unsigned b_index(Square s, Bitboard occ) { - unsigned lo = unsigned(occ) & unsigned(BMasks[s]); - unsigned hi = unsigned(occ >> 32) & unsigned(BMasks[s] >> 32); - return (lo * unsigned(BMagics[s]) ^ hi * unsigned(BMagics[s] >> 32)) >> BShifts[s]; -} - -#endif - -inline Bitboard rook_attacks_bb(Square s, Bitboard occ) { - return RAttacks[s][r_index(s, occ)]; -} - -inline Bitboard bishop_attacks_bb(Square s, Bitboard occ) { - return BAttacks[s][b_index(s, occ)]; +template +inline Bitboard attacks_bb(Square s, Bitboard occ) { + Bitboard** const Attacks = Pt == ROOK ? RAttacks : BAttacks; + return Attacks[s][magic_index(s, occ)]; } @@ -214,6 +207,14 @@ inline Bitboard same_color_squares(Square s) { } +/// single_bit() returns true if in the 'b' bitboard is set a single bit (or if +/// b == 0). + +inline bool single_bit(Bitboard b) { + return !(b & (b - 1)); +} + + /// first_1() finds the least significant nonzero bit in a nonzero bitboard. /// pop_1st_bit() finds and clears the least significant nonzero bit in a /// nonzero bitboard. @@ -223,9 +224,15 @@ inline Bitboard same_color_squares(Square s) { #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) FORCE_INLINE Square first_1(Bitboard b) { - unsigned long index; - _BitScanForward64(&index, b); - return (Square) index; + unsigned long index; + _BitScanForward64(&index, b); + return (Square) index; +} + +FORCE_INLINE Square last_1(Bitboard b) { + unsigned long index; + _BitScanReverse64(&index, b); + return (Square) index; } #else @@ -234,6 +241,12 @@ FORCE_INLINE Square first_1(Bitboard b) { // Assembly code by Heinz van Saanen __asm__("bsfq %1, %0": "=r"(dummy): "rm"(b) ); return (Square) dummy; } + +FORCE_INLINE Square last_1(Bitboard b) { + Bitboard dummy; + __asm__("bsrq %1, %0": "=r"(dummy): "rm"(b) ); + return (Square) dummy; +} #endif FORCE_INLINE Square pop_1st_bit(Bitboard* b) { @@ -245,11 +258,11 @@ FORCE_INLINE Square pop_1st_bit(Bitboard* b) { #else // if !defined(USE_BSFQ) extern Square first_1(Bitboard b); +extern Square last_1(Bitboard b); extern Square pop_1st_bit(Bitboard* b); #endif - extern void print_bitboard(Bitboard b); extern void bitboards_init();