From: Gary Linscott Date: Wed, 28 Aug 2013 07:35:04 +0000 (+0200) Subject: Add lsb() overload X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=aecdbfc4a000c72fcc2642f54ce83967913a16ba Add lsb() overload Helper to find least significant bit relative to the given color. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/bitboard.h b/src/bitboard.h index bc3ed87b..e0e2fe64 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -319,4 +319,9 @@ 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); +} + #endif // #ifndef BITBOARD_H_INCLUDED diff --git a/src/endgame.cpp b/src/endgame.cpp index 96f85334..65b85861 100644 --- a/src/endgame.cpp +++ b/src/endgame.cpp @@ -443,18 +443,7 @@ ScaleFactor Endgame::operator()(const Position& pos) const { // The bishop has the wrong color, and the defending king is on the // file of the pawn(s) or the adjacent file. Find the rank of the // frontmost pawn. - Rank rank; - if (strongerSide == WHITE) - { - for (rank = RANK_7; !(rank_bb(rank) & pawns); rank--) {} - assert(rank >= RANK_2 && rank <= RANK_7); - } - else - { - for (rank = RANK_2; !(rank_bb(rank) & pawns); rank++) {} - rank = Rank(rank ^ 7); // HACK to get the relative rank - assert(rank >= RANK_2 && rank <= RANK_7); - } + Rank rank = relative_rank(strongerSide, lsb(weakerSide, pawns)); // If the defending king has distance 1 to the promotion square or // is placed somewhere in front of the pawn, it's a draw. if ( square_distance(kingSq, queeningSq) <= 1 @@ -469,9 +458,8 @@ ScaleFactor Endgame::operator()(const Position& pos) const { && pos.non_pawn_material(weakerSide) == 0 && pos.count(weakerSide) >= 1) { - // Get weaker pawn closest to opponent's queening square - Bitboard wkPawns = pos.pieces(weakerSide, PAWN); - Square weakerPawnSq = strongerSide == WHITE ? msb(wkPawns) : lsb(wkPawns); + // Get weakerSide pawn that is closest to home rank + Square weakerPawnSq = lsb(weakerSide, pos.pieces(weakerSide, PAWN)); Square strongerKingSq = pos.king_square(strongerSide); Square weakerKingSq = pos.king_square(weakerSide); diff --git a/src/pawns.cpp b/src/pawns.cpp index 772410a0..fece246b 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -229,11 +229,11 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) { for (int f = kf - 1; f <= kf + 1; f++) { b = ourPawns & FileBB[f]; - rkUs = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1; + rkUs = b ? relative_rank(Us, lsb(Us, b)) : RANK_1; safety -= ShelterWeakness[rkUs]; b = theirPawns & FileBB[f]; - rkThem = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1; + rkThem = b ? relative_rank(Us, lsb(Us, b)) : RANK_1; safety -= StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem]; }