From: Marco Costalba Date: Mon, 23 Feb 2009 11:06:06 +0000 (+0100) Subject: Do not copy the whole old state in do_move() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=da7a62852ab5e96d24bb4fd2f062d488684738b1;hp=0bf45823da3d76d25d0e3cfdf131bf8823ecb58e 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 --- 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);