From 009a0f88e05fde5ee16d7bac429d4c62ebe6bf53 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 31 Dec 2012 11:26:12 +0100 Subject: [PATCH 1/1] Micro-optimization in evaluate_space() 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 9756add8..cf684638 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -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(safe) + popcount(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((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe)); } -- 2.39.2