Generalize shift_bb() to handle double pushes
authorMarco Costalba <mcostalba@gmail.com>
Sun, 20 Apr 2014 13:15:43 +0000 (15:15 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 20 Apr 2014 13:52:37 +0000 (15:52 +0200)
And use it in evaluate_space.

No functional change.

src/bitboard.h
src/evaluate.cpp

index 9814268327afdd9c269d728077d1f82770035c87..888e96905469b1c907340a79beaca613d2b90c41 100644 (file)
@@ -130,10 +130,9 @@ inline int rank_distance(Square s1, Square s2) {
 template<Square Delta>
 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;
 }
 
 
index 8eb0364844a363e5fb33e5a7e55a4d8e26dd739c..b1422ac67eccb50fefdebde17d7396d01b0542db 100644 (file)
@@ -702,7 +702,9 @@ namespace {
   template<Color Us>
   int evaluate_space(const Position& pos, const EvalInfo& ei) {
 
-    const Color Them = (Us == WHITE ? BLACK : WHITE);
+    const Color  Them     = (Us == WHITE ? BLACK    : WHITE);
+    const Square Down     = (Us == WHITE ? DELTA_S  : DELTA_N);
+    const Square DownDown = (Us == WHITE ? DELTA_SS : DELTA_NN);
 
     // Find the safe squares for our pieces inside the area defined by
     // SpaceMask[]. A square is unsafe if it is attacked by an enemy
@@ -714,8 +716,8 @@ namespace {
 
     // Find all squares which are at most three squares behind some friendly pawn
     Bitboard behind = pos.pieces(Us, PAWN);
-    behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
-    behind |= (Us == WHITE ? behind >> 16 : behind << 16);
+    behind |= shift_bb<    Down>(behind);
+    behind |= shift_bb<DownDown>(behind);
 
     // Since SpaceMask[Us] is fully on our half of the board
     assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0);