From da7a62852ab5e96d24bb4fd2f062d488684738b1 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 23 Feb 2009 12:06:06 +0100 Subject: [PATCH] Do not copy the whole old state in do_move() Instead of copy the old state in the new one, copy only fields that will be updated incrementally, not the ones that will be recalculcated anyway. This let us copy 13 bytes instead of 28 for each do_move() call. Signed-off-by: Marco Costalba --- src/position.cpp | 32 ++++++++++++++++++++++++-------- src/position.h | 3 ++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 0a7ebadd..7c8399e0 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -676,6 +676,25 @@ inline void Position::update_checkers(Bitboard* pCheckersBB, Square ksq, Square } +/// Position::init_new_state() copies from the current state the fields +/// that will be updated incrementally, skips the fields, like bitboards +/// that will be recalculated form scratch anyway. + +void Position::init_new_state(StateInfo& newSt) { + + newSt.key = st->key; + newSt.pawnKey = st->pawnKey; + newSt.materialKey = st->materialKey; + newSt.castleRights = st->castleRights; + newSt.rule50 = st->rule50; + newSt.epSquare = st->epSquare; + newSt.mgValue = st->mgValue; + newSt.egValue = st->egValue; + newSt.capture = NO_PIECE_TYPE; + newSt.previous = st; +} + + /// Position::do_move() makes a move, and saves all information necessary /// to a StateInfo object. The move is assumed to be legal. /// Pseudo-legal moves should be filtered out before this function is called. @@ -685,17 +704,14 @@ void Position::do_move(Move m, StateInfo& newSt) { assert(is_ok()); assert(move_is_ok(m)); - // Get now the current (pre-move) dc candidates that we will use + // Get now the current (before to move) dc candidates that we will use // in update_checkers(). Bitboard oldDcCandidates = discovered_check_candidates(side_to_move()); - // Copy the old state to our new StateInfo object (except the - // captured piece, which is taken care of later. - // TODO do not copy pinners and checkersBB because are recalculated - // anyway. - newSt = *st; - newSt.capture = NO_PIECE_TYPE; - newSt.previous = st; + // Copy some fields of old state to our new StateInfo object (except the + // captured piece, which is taken care of later) and switch state pointer + // to point to the new, ready to be updated, state. + init_new_state(newSt); st = &newSt; // Save the current key to the history[] array, in order to be able to diff --git a/src/position.h b/src/position.h index 981bad3e..ae750697 100644 --- a/src/position.h +++ b/src/position.h @@ -83,10 +83,10 @@ struct StateInfo { Key key, pawnKey, materialKey; int castleRights, rule50; Square epSquare; - Move lastMove; Value mgValue, egValue; PieceType capture; StateInfo* previous; + Move lastMove; }; @@ -294,6 +294,7 @@ private: void allow_ooo(Color c); // Helper functions for doing and undoing moves + void init_new_state(StateInfo& newSt); void do_capture_move(Move m, PieceType capture, Color them, Square to); void do_castle_move(Move m); void do_promotion_move(Move m); -- 2.39.2