From: Marco Costalba Date: Tue, 30 Oct 2012 18:56:19 +0000 (+0100) Subject: Retire move_attacks_square() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=4e31c39a6494499ba85db0e0014bbbaac9770b1d Retire move_attacks_square() There is only one call site. This patch is a preparation for the next one that will affect functionality. No functional change. --- diff --git a/src/position.cpp b/src/position.cpp index be9e7ac8..50bb8e18 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -473,37 +473,6 @@ Bitboard Position::attacks_from(Piece p, Square s, Bitboard occ) { } -/// Position::move_attacks_square() tests whether a move from the current -/// position attacks a given square. - -bool Position::move_attacks_square(Move m, Square s) const { - - assert(is_ok(m)); - assert(is_ok(s)); - - Bitboard occ, xray; - Square from = from_sq(m); - Square to = to_sq(m); - Piece piece = piece_moved(m); - - assert(!is_empty(from)); - - // Update occupancy as if the piece is moving - occ = pieces() ^ from ^ to; - - // The piece moved in 'to' attacks the square 's' ? - if (attacks_from(piece, to, occ) & s) - return true; - - // Scan for possible X-ray attackers behind the moved piece - xray = (attacks_bb< ROOK>(s, occ) & pieces(color_of(piece), QUEEN, ROOK)) - | (attacks_bb(s, occ) & pieces(color_of(piece), QUEEN, BISHOP)); - - // Verify attackers are triggered by our move and not already existing - return xray && (xray ^ (xray & attacks_from(s))); -} - - /// Position::pl_move_is_legal() tests whether a pseudo-legal move is legal bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { diff --git a/src/position.h b/src/position.h index ff75848e..d09dce08 100644 --- a/src/position.h +++ b/src/position.h @@ -137,7 +137,6 @@ public: // Properties of moves bool move_gives_check(Move m, const CheckInfo& ci) const; - bool move_attacks_square(Move m, Square s) const; bool move_is_legal(const Move m) const; bool pl_move_is_legal(Move m, Bitboard pinned) const; bool is_pseudo_legal(const Move m) const; diff --git a/src/search.cpp b/src/search.cpp index 96e40515..2b51a698 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1411,12 +1411,10 @@ split_point_start: // At split points actual search starts from here assert(!pos.is_capture_or_promotion(m)); assert(!pos.is_passed_pawn_push(m)); - Square mfrom, mto, tfrom, tto; - - mfrom = from_sq(m); - mto = to_sq(m); - tfrom = from_sq(threat); - tto = to_sq(threat); + Square mfrom = from_sq(m); + Square mto = to_sq(m); + Square tfrom = from_sq(threat); + Square tto = to_sq(threat); // Case 1: Don't prune moves which move the threatened piece if (mfrom == tto) @@ -1424,11 +1422,26 @@ split_point_start: // At split points actual search starts from here // Case 2: If the threatened piece has value less than or equal to the // value of the threatening piece, don't prune moves which defend it. - if ( pos.is_capture(threat) + if ( pos.is_capture(threat) && ( PieceValue[MG][pos.piece_on(tfrom)] >= PieceValue[MG][pos.piece_on(tto)] - || type_of(pos.piece_on(tfrom)) == KING) - && pos.move_attacks_square(m, tto)) - return true; + || type_of(pos.piece_on(tfrom)) == KING)) + { + // Update occupancy as if the piece is moving + Bitboard occ = pos.pieces() ^ mfrom ^ mto; + Piece piece = pos.piece_on(mfrom); + + // The moved piece attacks the square 'tto' ? + if (pos.attacks_from(piece, mto, occ) & tto) + return true; + + // Scan for possible X-ray attackers behind the moved piece + Bitboard xray = (attacks_bb< ROOK>(tto, occ) & pos.pieces(color_of(piece), QUEEN, ROOK)) + | (attacks_bb(tto, occ) & pos.pieces(color_of(piece), QUEEN, BISHOP)); + + // Verify attackers are triggered by our move and not already existing + if (xray && (xray ^ (xray & pos.attacks_from(tto)))) + return true; + } // Case 3: If the moving piece in the threatened move is a slider, don't // prune safe moves which block its ray.