Add lsb() overload
authorGary Linscott <glinscott@gmail.com>
Wed, 28 Aug 2013 07:35:04 +0000 (09:35 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 28 Aug 2013 17:50:11 +0000 (19:50 +0200)
Helper to find least significant bit relative to
the given color.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/bitboard.h
src/endgame.cpp
src/pawns.cpp

index bc3ed87b623dab6ae9debb5d89a48df9e3ee68ee..e0e2fe64545ececedd4acf53852b9fd7e3b7dbf0 100644 (file)
@@ -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
index 96f8533453ebf41fb0366e9e5c82e2365c34c923..65b858613dd8f74ae6ad73674187473e059afe25 100644 (file)
@@ -443,18 +443,7 @@ ScaleFactor Endgame<KBPsK>::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<KBPsK>::operator()(const Position& pos) const {
       && pos.non_pawn_material(weakerSide) == 0
       && pos.count<PAWN>(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);
index 772410a04b9e7c4c63a79e6c33f39bdf7566298e..fece246b1c999a31611a8b8661b4e97d8e9520e2 100644 (file)
@@ -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];
   }