1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

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 <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2009-02-23 12:06:06 +01:00
parent 0bf45823da
commit da7a62852a
2 changed files with 26 additions and 9 deletions

View file

@ -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 /// Position::do_move() makes a move, and saves all information necessary
/// to a StateInfo object. The move is assumed to be legal. /// to a StateInfo object. The move is assumed to be legal.
/// Pseudo-legal moves should be filtered out before this function is called. /// 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(is_ok());
assert(move_is_ok(m)); 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(). // in update_checkers().
Bitboard oldDcCandidates = discovered_check_candidates(side_to_move()); Bitboard oldDcCandidates = discovered_check_candidates(side_to_move());
// Copy the old state to our new StateInfo object (except the // Copy some fields of old state to our new StateInfo object (except the
// captured piece, which is taken care of later. // captured piece, which is taken care of later) and switch state pointer
// TODO do not copy pinners and checkersBB because are recalculated // to point to the new, ready to be updated, state.
// anyway. init_new_state(newSt);
newSt = *st;
newSt.capture = NO_PIECE_TYPE;
newSt.previous = st;
st = &newSt; st = &newSt;
// Save the current key to the history[] array, in order to be able to // Save the current key to the history[] array, in order to be able to

View file

@ -83,10 +83,10 @@ struct StateInfo {
Key key, pawnKey, materialKey; Key key, pawnKey, materialKey;
int castleRights, rule50; int castleRights, rule50;
Square epSquare; Square epSquare;
Move lastMove;
Value mgValue, egValue; Value mgValue, egValue;
PieceType capture; PieceType capture;
StateInfo* previous; StateInfo* previous;
Move lastMove;
}; };
@ -294,6 +294,7 @@ private:
void allow_ooo(Color c); void allow_ooo(Color c);
// Helper functions for doing and undoing moves // 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_capture_move(Move m, PieceType capture, Color them, Square to);
void do_castle_move(Move m); void do_castle_move(Move m);
void do_promotion_move(Move m); void do_promotion_move(Move m);