Micro-optimization in evaluate_space()
authorMarco Costalba <mcostalba@gmail.com>
Mon, 31 Dec 2012 10:26:12 +0000 (11:26 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 31 Dec 2012 10:34:18 +0000 (11:34 +0100)
Since &-ing with SpaceMask restricts the set to the home
half of the board, it is possible to use just one popcount
instead of 2 by shifting "safe" to the other half of the
board. This gives a small speedup especially on systems
where hardware popcount is not available.

Patch kindly sent by Richard Vida.

No functional change.

src/evaluate.cpp

index 9756add8278d01fd5fece9ac98fe620a255ab2ce..cf6846384e6e04138e4000cfabbaeb5cea0c3ad9 100644 (file)
@@ -1146,7 +1146,11 @@ Value do_evaluate(const Position& pos, Value& margin) {
     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
 
-    return popcount<Max15>(safe) + popcount<Max15>(behind & safe);
+    // Since SpaceMask[Us] is fully on our half of the board
+    assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0);
+
+    // Count safe + (behind & safe) with a single popcount
+    return popcount<Full>((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe));
   }