X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=d187102ff1bf17914dd806c250b85bf8d757049f;hp=2b9161250f5fb8277ba4f2deac1e012646cec331;hb=ebe8009affa34708bac1e8b69cf5b925ffe5cc82;hpb=cc2b3ece5c5d8d1183f8526fbb0ee4e1ea7a69fe diff --git a/src/bitboard.h b/src/bitboard.h index 2b916125..d187102f 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -23,6 +23,13 @@ #include "types.h" +namespace Bitboards { + +extern void init(); +extern void print(Bitboard b); + +} + CACHE_LINE_ALIGNMENT extern Bitboard RMasks[64]; @@ -43,7 +50,8 @@ extern Bitboard ThisAndAdjacentFilesBB[8]; extern Bitboard InFrontBB[2][8]; extern Bitboard StepAttacksBB[16][64]; extern Bitboard BetweenBB[64][64]; -extern Bitboard SquaresInFrontMask[2][64]; +extern Bitboard DistanceRingsBB[64][8]; +extern Bitboard ForwardBB[2][64]; extern Bitboard PassedPawnMask[2][64]; extern Bitboard AttackSpanMask[2][64]; extern Bitboard PseudoAttacks[6][64]; @@ -73,6 +81,13 @@ inline Bitboard operator^(Bitboard b, Square s) { } +/// more_than_one() returns true if in 'b' there is more than one bit set + +inline bool more_than_one(Bitboard b) { + return b & (b - 1); +} + + /// rank_bb() and file_bb() take a file or a square as input and return /// a bitboard representing all squares on the given file or rank. @@ -124,48 +139,23 @@ inline Bitboard in_front_bb(Color c, Square s) { } -/// 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) { - - Bitboard* const Masks = Pt == ROOK ? RMasks : BMasks; - Bitboard* const Magics = Pt == ROOK ? RMagics : BMagics; - unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts; - - if (Is64Bit) - return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[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]; -} +/// between_bb returns a bitboard representing all squares between two squares. +/// For instance, between_bb(SQ_C4, SQ_F7) returns a bitboard with the bits for +/// square d5 and e6 set. If s1 and s2 are not on the same line, file or diagonal, +/// 0 is returned. -template -inline Bitboard attacks_bb(Square s, Bitboard occ) { - Bitboard** const Attacks = Pt == ROOK ? RAttacks : BAttacks; - return Attacks[s][magic_index(s, occ)]; -} - - -/// squares_between returns a bitboard representing all squares between -/// two squares. For instance, squares_between(SQ_C4, SQ_F7) returns a -/// bitboard with the bits for square d5 and e6 set. If s1 and s2 are not -/// on the same line, file or diagonal, EmptyBoardBB is returned. - -inline Bitboard squares_between(Square s1, Square s2) { +inline Bitboard between_bb(Square s1, Square s2) { return BetweenBB[s1][s2]; } -/// squares_in_front_of takes a color and a square as input, and returns a -/// bitboard representing all squares along the line in front of the square, -/// from the point of view of the given color. Definition of the table is: -/// SquaresInFrontOf[c][s] = in_front_bb(c, s) & file_bb(s) +/// forward_bb takes a color and a square as input, and returns a bitboard +/// representing all squares along the line in front of the square, from the +/// point of view of the given color. Definition of the table is: +/// ForwardBB[c][s] = in_front_bb(c, s) & file_bb(s) -inline Bitboard squares_in_front_of(Color c, Square s) { - return SquaresInFrontMask[c][s]; +inline Bitboard forward_bb(Color c, Square s) { + return ForwardBB[c][s]; } @@ -207,13 +197,30 @@ 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). +/// 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) { + + Bitboard* const Masks = Pt == ROOK ? RMasks : BMasks; + Bitboard* const Magics = Pt == ROOK ? RMagics : BMagics; + unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts; -inline bool single_bit(Bitboard b) { - return !(b & (b - 1)); + if (Is64Bit) + return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[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]; } +template +inline Bitboard attacks_bb(Square s, Bitboard occ) { + return (Pt == ROOK ? RAttacks : BAttacks)[s][magic_index(s, occ)]; +} + + /// 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. @@ -262,17 +269,4 @@ extern Square pop_1st_bit(Bitboard* b); #endif -// relative_rank() returns the relative rank of the closest bit set on the Bitboard. -// Only to be used with bitboards that contain a single file. - -template -inline Rank relative_rank(Bitboard b) { - Square s = Us == WHITE ? first_1(b) - : ~last_1(b); - return rank_of(s); -} - -extern void print_bitboard(Bitboard b); -extern void bitboards_init(); - #endif // !defined(BITBOARD_H_INCLUDED)