X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=7a39a5009c5571ccf0ef68b5d90792acc353de9b;hp=24ae794b68b0f4183087a882cb94ca1bd64cc29c;hb=7b4b65d7a95b3c8b40a11fe5b3efe959d5129008;hpb=099b5e45e6fb84c0c6ac9c867e0902e0195d97a5 diff --git a/src/bitboard.h b/src/bitboard.h index 24ae794b..7a39a500 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -116,43 +116,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]); -} - -FORCE_INLINE unsigned b_index(Square s, Bitboard occ) { - return unsigned(((occ & BMasks[s]) * BMagics[s]) >> BShifts[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 + if (Is64Bit) + return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[s]); -inline Bitboard rook_attacks_bb(Square s, Bitboard occ) { - return RAttacks[s][r_index(s, occ)]; + 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]; } -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)]; }