From 5ea984ac3515946d952bd3c9cfe8e8baef7cc85d Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 16 Jun 2013 10:51:17 +0200 Subject: [PATCH] Don't calculate pawnsOnSquares twice And reformat some code while there. No functional change. --- src/pawns.cpp | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/pawns.cpp b/src/pawns.cpp index 861c421f..d05e8af0 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -80,11 +80,12 @@ namespace { #undef V template - Score evaluate_pawns(const Position& pos, Bitboard ourPawns, - Bitboard theirPawns, Pawns::Entry* e) { + Score evaluate(const Position& pos, Pawns::Entry* e) { - const Color Them = (Us == WHITE ? BLACK : WHITE); - const Square Up = (Us == WHITE ? DELTA_N : DELTA_S); + const Color Them = (Us == WHITE ? BLACK : WHITE); + const Square Up = (Us == WHITE ? DELTA_N : DELTA_S); + const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW); + const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE); Bitboard b; Square s; @@ -94,6 +95,16 @@ namespace { Score value = SCORE_ZERO; const Square* pl = pos.piece_list(Us, PAWN); + Bitboard ourPawns = pos.pieces(Us, PAWN); + Bitboard theirPawns = pos.pieces(Them, PAWN); + + e->passedPawns[Us] = 0; + e->kingSquares[Us] = SQ_NONE; + e->semiopenFiles[Us] = 0xFF; + e->pawnAttacks[Us] = shift_bb(ourPawns) | shift_bb(ourPawns); + e->pawnsOnSquares[Us][BLACK] = popcount(ourPawns & BlackSquares); + e->pawnsOnSquares[Us][WHITE] = pos.piece_count(Us, PAWN) - e->pawnsOnSquares[Us][BLACK]; + // Loop through all pawns of the current color and score each pawn while ((s = *pl++) != SQ_NONE) { @@ -135,7 +146,7 @@ namespace { // Note that we are sure to find something because pawn is not passed // nor isolated, so loop is potentially infinite, but it isn't. while (!(b & (ourPawns | theirPawns))) - Us == WHITE ? b <<= 8 : b >>= 8; + b = shift_bb(b); // The friendly pawn needs to be at least two ranks closer than the // enemy pawn in order to help the potentially backward pawn advance. @@ -175,15 +186,10 @@ namespace { value += CandidatePassed[relative_rank(Us, s)]; } - e->pawnsOnSquares[Us][BLACK] = popcount(ourPawns & BlackSquares); - e->pawnsOnSquares[Us][WHITE] = pos.piece_count(Us, PAWN) - e->pawnsOnSquares[Us][BLACK]; - - e->pawnsOnSquares[Them][BLACK] = popcount(theirPawns & BlackSquares); - e->pawnsOnSquares[Them][WHITE] = pos.piece_count(Them, PAWN) - e->pawnsOnSquares[Them][BLACK]; - return value; } -} + +} // namespace namespace Pawns { @@ -196,24 +202,11 @@ Entry* probe(const Position& pos, Table& entries) { Key key = pos.pawn_key(); Entry* e = entries[key]; - // If e->key matches the position's pawn hash key, it means that we - // have analysed this pawn structure before, and we can simply return - // the information we found the last time instead of recomputing it. if (e->key == key) return e; e->key = key; - e->passedPawns[WHITE] = e->passedPawns[BLACK] = 0; - e->kingSquares[WHITE] = e->kingSquares[BLACK] = SQ_NONE; - e->semiopenFiles[WHITE] = e->semiopenFiles[BLACK] = 0xFF; - - Bitboard wPawns = pos.pieces(WHITE, PAWN); - Bitboard bPawns = pos.pieces(BLACK, PAWN); - e->pawnAttacks[WHITE] = shift_bb(wPawns) | shift_bb(wPawns); - e->pawnAttacks[BLACK] = shift_bb(bPawns) | shift_bb(bPawns); - - e->value = evaluate_pawns(pos, wPawns, bPawns, e) - - evaluate_pawns(pos, bPawns, wPawns, e); + e->value = evaluate(pos, e) - evaluate(pos, e); return e; } -- 2.39.2