X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fbitboard.h;h=888e96905469b1c907340a79beaca613d2b90c41;hp=e0e2fe64545ececedd4acf53852b9fd7e3b7dbf0;hb=eced15fe36a16c38659f586bc558b1175114cc76;hpb=aecdbfc4a000c72fcc2642f54ce83967913a16ba diff --git a/src/bitboard.h b/src/bitboard.h index e0e2fe64..888e9690 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -1,7 +1,7 @@ /* Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) - Copyright (C) 2008-2013 Marco Costalba, Joona Kiiski, Tord Romstad + Copyright (C) 2008-2014 Marco Costalba, Joona Kiiski, Tord Romstad Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ namespace Bitboards { void init(); -void print(Bitboard b); +const std::string pretty(Bitboard b); } @@ -74,6 +74,7 @@ extern Bitboard AdjacentFilesBB[FILE_NB]; extern Bitboard InFrontBB[COLOR_NB][RANK_NB]; extern Bitboard StepAttacksBB[PIECE_NB][SQUARE_NB]; extern Bitboard BetweenBB[SQUARE_NB][SQUARE_NB]; +extern Bitboard LineBB[SQUARE_NB][SQUARE_NB]; extern Bitboard DistanceRingsBB[SQUARE_NB][8]; extern Bitboard ForwardBB[COLOR_NB][SQUARE_NB]; extern Bitboard PassedPawnMask[COLOR_NB][SQUARE_NB]; @@ -129,10 +130,9 @@ inline int rank_distance(Square s1, Square s2) { template inline Bitboard shift_bb(Bitboard b) { - return Delta == DELTA_N ? b << 8 : Delta == DELTA_S ? b >> 8 - : Delta == DELTA_NE ? (b & ~FileHBB) << 9 : Delta == DELTA_SE ? (b & ~FileHBB) >> 7 + return Delta == DELTA_NE ? (b & ~FileHBB) << 9 : Delta == DELTA_SE ? (b & ~FileHBB) >> 7 : Delta == DELTA_NW ? (b & ~FileABB) << 7 : Delta == DELTA_SW ? (b & ~FileABB) >> 9 - : 0; + : Delta > 0 ? b << Delta : b >> -Delta; } @@ -176,7 +176,7 @@ inline Bitboard in_front_bb(Color c, Rank r) { /// 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, +/// square d5 and e6 set. If s1 and s2 are not on the same rank, file or diagonal, /// 0 is returned. inline Bitboard between_bb(Square s1, Square s2) { @@ -222,12 +222,11 @@ inline Bitboard squares_of_color(Square s) { } -/// squares_aligned() returns true if the squares s1, s2 and s3 are aligned +/// aligned() returns true if the squares s1, s2 and s3 are aligned /// either on a straight or on a diagonal line. -inline bool squares_aligned(Square s1, Square s2, Square s3) { - return (BetweenBB[s1][s2] | BetweenBB[s1][s3] | BetweenBB[s2][s3]) - & ( SquareBB[s1] | SquareBB[s2] | SquareBB[s3]); +inline bool aligned(Square s1, Square s2, Square s3) { + return LineBB[s1][s2] & s3; } @@ -241,6 +240,9 @@ FORCE_INLINE unsigned magic_index(Square s, Bitboard occ) { Bitboard* const Magics = Pt == ROOK ? RMagics : BMagics; unsigned* const Shifts = Pt == ROOK ? RShifts : BShifts; + if (HasPext) + return unsigned(_pext_u64(occ, Masks[s])); + if (Is64Bit) return unsigned(((occ & Masks[s]) * Magics[s]) >> Shifts[s]); @@ -254,24 +256,34 @@ inline Bitboard attacks_bb(Square s, Bitboard occ) { return (Pt == ROOK ? RAttacks : BAttacks)[s][magic_index(s, occ)]; } +inline Bitboard attacks_bb(Piece pc, Square s, Bitboard occ) { + + switch (type_of(pc)) + { + case BISHOP: return attacks_bb(s, occ); + case ROOK : return attacks_bb(s, occ); + case QUEEN : return attacks_bb(s, occ) | attacks_bb(s, occ); + default : return StepAttacksBB[pc][s]; + } +} -/// lsb()/msb() finds the least/most significant bit in a nonzero bitboard. -/// pop_lsb() finds and clears the least significant bit in a nonzero bitboard. +/// lsb()/msb() finds the least/most significant bit in a non-zero bitboard. +/// pop_lsb() finds and clears the least significant bit in a non-zero bitboard. #ifdef USE_BSFQ # if defined(_MSC_VER) && !defined(__INTEL_COMPILER) FORCE_INLINE Square lsb(Bitboard b) { - unsigned long index; - _BitScanForward64(&index, b); - return (Square) index; + unsigned long idx; + _BitScanForward64(&idx, b); + return (Square) idx; } FORCE_INLINE Square msb(Bitboard b) { - unsigned long index; - _BitScanReverse64(&index, b); - return (Square) index; + unsigned long idx; + _BitScanReverse64(&idx, b); + return (Square) idx; } # elif defined(__arm__) @@ -292,15 +304,15 @@ FORCE_INLINE Square lsb(Bitboard b) { # else FORCE_INLINE Square lsb(Bitboard b) { // Assembly code by Heinz van Saanen - Bitboard index; - __asm__("bsfq %1, %0": "=r"(index): "rm"(b) ); - return (Square) index; + Bitboard idx; + __asm__("bsfq %1, %0": "=r"(idx): "rm"(b) ); + return (Square) idx; } FORCE_INLINE Square msb(Bitboard b) { - Bitboard index; - __asm__("bsrq %1, %0": "=r"(index): "rm"(b) ); - return (Square) index; + Bitboard idx; + __asm__("bsrq %1, %0": "=r"(idx): "rm"(b) ); + return (Square) idx; } # endif @@ -319,9 +331,10 @@ extern Square pop_lsb(Bitboard* b); #endif -/// lsb() overload finds least significant bit relative to the given color -inline Square lsb(Color c, Bitboard b) { - return c == WHITE ? lsb(b) : msb(b); -} +/// frontmost_sq() and backmost_sq() find the square corresponding to the +/// most/least advanced bit relative to the given color. + +inline Square frontmost_sq(Color c, Bitboard b) { return c == WHITE ? msb(b) : lsb(b); } +inline Square backmost_sq(Color c, Bitboard b) { return c == WHITE ? lsb(b) : msb(b); } #endif // #ifndef BITBOARD_H_INCLUDED