From 1fd020a8ba98a95775639cdebd19e3592b767eb3 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 16 Jun 2013 10:08:44 +0200 Subject: [PATCH] Use move_pawns() in Pawns::probe And rename some stuff. No functional change. --- src/bitboard.h | 12 ++++++++++++ src/evaluate.cpp | 5 +++-- src/movegen.cpp | 48 ++++++++++++++++++------------------------------ src/pawns.cpp | 7 ++++--- 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/bitboard.h b/src/bitboard.h index a53f348b..06adbfe3 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -96,6 +96,18 @@ inline bool more_than_one(Bitboard b) { } +/// shift_bb() moves bitboard one step along direction Delta. Mainly for pawns. + +template +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 + : Delta == DELTA_NW ? (b & ~FileABB) << 7 : Delta == DELTA_SW ? (b & ~FileABB) >> 9 + : 0; +} + + /// rank_bb() and file_bb() take a file or a square as input and return /// a bitboard representing all squares on the given file or rank. diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 652fb386..f18968ce 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -433,7 +433,8 @@ Value do_evaluate(const Position& pos, Value& margin) { template void init_eval_info(const Position& pos, 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); Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from(pos.king_square(Them)); ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us); @@ -442,7 +443,7 @@ Value do_evaluate(const Position& pos, Value& margin) { if ( pos.piece_count(Us, QUEEN) && pos.non_pawn_material(Us) > QueenValueMg + PawnValueMg) { - ei.kingRing[Them] = (b | (Us == WHITE ? b >> 8 : b << 8)); + ei.kingRing[Them] = b | shift_bb(b); b &= ei.attackedBy[Us][PAWN]; ei.kingAttackersCount[Us] = b ? popcount(b) / 2 : 0; ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0; diff --git a/src/movegen.cpp b/src/movegen.cpp index 63c1e1fa..84acfc0c 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -68,23 +68,11 @@ namespace { } - template - inline Bitboard move_pawns(Bitboard p) { - - return Delta == DELTA_N ? p << 8 - : Delta == DELTA_S ? p >> 8 - : Delta == DELTA_NE ? (p & ~FileHBB) << 9 - : Delta == DELTA_SE ? (p & ~FileHBB) >> 7 - : Delta == DELTA_NW ? (p & ~FileABB) << 7 - : Delta == DELTA_SW ? (p & ~FileABB) >> 9 : 0; - } - - template inline MoveStack* generate_promotions(MoveStack* mlist, Bitboard pawnsOn7, Bitboard target, const CheckInfo* ci) { - Bitboard b = move_pawns(pawnsOn7) & target; + Bitboard b = shift_bb(pawnsOn7) & target; while (b) { @@ -122,9 +110,9 @@ namespace { const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); const Bitboard TRank7BB = (Us == WHITE ? Rank7BB : Rank2BB); const Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB); - 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); + 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 b1, b2, dc1, dc2, emptySquares; @@ -139,8 +127,8 @@ namespace { { emptySquares = (Type == QUIETS || Type == QUIET_CHECKS ? target : ~pos.pieces()); - b1 = move_pawns(pawnsNotOn7) & emptySquares; - b2 = move_pawns(b1 & TRank3BB) & emptySquares; + b1 = shift_bb(pawnsNotOn7) & emptySquares; + b2 = shift_bb(b1 & TRank3BB) & emptySquares; if (Type == EVASIONS) // Consider only blocking squares { @@ -159,16 +147,16 @@ namespace { // promotion has been already generated among captures. if (pawnsNotOn7 & ci->dcCandidates) { - dc1 = move_pawns(pawnsNotOn7 & ci->dcCandidates) & emptySquares & ~file_bb(ci->ksq); - dc2 = move_pawns(dc1 & TRank3BB) & emptySquares; + dc1 = shift_bb(pawnsNotOn7 & ci->dcCandidates) & emptySquares & ~file_bb(ci->ksq); + dc2 = shift_bb(dc1 & TRank3BB) & emptySquares; b1 |= dc1; b2 |= dc2; } } - SERIALIZE_PAWNS(b1, UP); - SERIALIZE_PAWNS(b2, UP + UP); + SERIALIZE_PAWNS(b1, Up); + SERIALIZE_PAWNS(b2, Up + Up); } // Promotions and underpromotions @@ -180,19 +168,19 @@ namespace { if (Type == EVASIONS) emptySquares &= target; - mlist = generate_promotions(mlist, pawnsOn7, enemies, ci); - mlist = generate_promotions(mlist, pawnsOn7, enemies, ci); - mlist = generate_promotions(mlist, pawnsOn7, emptySquares, ci); + mlist = generate_promotions(mlist, pawnsOn7, enemies, ci); + mlist = generate_promotions(mlist, pawnsOn7, enemies, ci); + mlist = generate_promotions(mlist, pawnsOn7, emptySquares, ci); } // Standard and en-passant captures if (Type == CAPTURES || Type == EVASIONS || Type == NON_EVASIONS) { - b1 = move_pawns(pawnsNotOn7) & enemies; - b2 = move_pawns(pawnsNotOn7) & enemies; + b1 = shift_bb(pawnsNotOn7) & enemies; + b2 = shift_bb(pawnsNotOn7) & enemies; - SERIALIZE_PAWNS(b1, RIGHT); - SERIALIZE_PAWNS(b2, LEFT); + SERIALIZE_PAWNS(b1, Right); + SERIALIZE_PAWNS(b2, Left); if (pos.ep_square() != SQ_NONE) { @@ -201,7 +189,7 @@ namespace { // An en passant capture can be an evasion only if the checking piece // is the double pushed pawn and so is in the target. Otherwise this // is a discovery check and we are forced to do otherwise. - if (Type == EVASIONS && !(target & (pos.ep_square() - UP))) + if (Type == EVASIONS && !(target & (pos.ep_square() - Up))) return mlist; b1 = pawnsNotOn7 & pos.attacks_from(pos.ep_square(), Them); diff --git a/src/pawns.cpp b/src/pawns.cpp index 280c1fd6..861c421f 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -84,6 +84,7 @@ namespace { Bitboard theirPawns, Pawns::Entry* e) { const Color Them = (Us == WHITE ? BLACK : WHITE); + const Square Up = (Us == WHITE ? DELTA_N : DELTA_S); Bitboard b; Square s; @@ -138,7 +139,7 @@ namespace { // The friendly pawn needs to be at least two ranks closer than the // enemy pawn in order to help the potentially backward pawn advance. - backward = (b | (Us == WHITE ? b << 8 : b >> 8)) & theirPawns; + backward = (b | shift_bb(b)) & theirPawns; } assert(opposed | passed | (attack_span_mask(Us, s) & theirPawns)); @@ -208,8 +209,8 @@ Entry* probe(const Position& pos, Table& entries) { Bitboard wPawns = pos.pieces(WHITE, PAWN); Bitboard bPawns = pos.pieces(BLACK, PAWN); - e->pawnAttacks[WHITE] = ((wPawns & ~FileHBB) << 9) | ((wPawns & ~FileABB) << 7); - e->pawnAttacks[BLACK] = ((bPawns & ~FileHBB) >> 7) | ((bPawns & ~FileABB) >> 9); + 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); -- 2.39.2