From: Marco Costalba Date: Sun, 8 Nov 2009 16:56:41 +0000 (+0100) Subject: Don't copy the key in do_move X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=f35ddb04af2a00bd9facf5b66ec97e4ab28d4480;hp=ef6fca98a0b70b82ba701e6969a80cd9daf78705 Don't copy the key in do_move It will be overwritten anyway. Also other little small touches that seem to increase speed more then the whole enum Score patch series :-( Optimization is really a black art. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/position.cpp b/src/position.cpp index edfe6b2a..77a6d604 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -718,7 +718,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { // ones which are recalculated from scratch anyway, then switch our state // pointer to point to the new, ready to be updated, state. struct ReducedStateInfo { - Key key, pawnKey, materialKey; + Key pawnKey, materialKey; int castleRights, rule50, pliesFromNull; Square epSquare; Value value; @@ -758,16 +758,15 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { Piece piece = piece_on(from); PieceType pt = type_of_piece(piece); + PieceType capture = ep ? PAWN : type_of_piece_on(to); assert(color_of_piece_on(from) == us); assert(color_of_piece_on(to) == them || square_is_empty(to)); assert(!(ep || pm) || piece == piece_of_color_and_type(us, PAWN)); assert(!pm || relative_rank(us, to) == RANK_8); - st->capture = ep ? PAWN : type_of_piece_on(to); - - if (st->capture) - do_capture_move(key, st->capture, them, to, ep); + if (capture) + do_capture_move(key, capture, them, to, ep); // Update hash key key ^= zobrist[us][pt][from] ^ zobrist[us][pt][to]; @@ -817,7 +816,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { st->pawnKey ^= zobrist[us][PAWN][from] ^ zobrist[us][PAWN][to]; // Set en passant square, only if moved pawn can be captured - if (abs(int(to) - int(from)) == 16) + if ((to ^ from) == 16) { if (attacks_from(from + (us == WHITE ? DELTA_N : DELTA_S), us) & pieces(PAWN, them)) { @@ -830,6 +829,9 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { // Update incremental scores st->value += pst_delta(piece, from, to); + // Set capture piece + st->capture = capture; + if (pm) // promotion ? { PieceType promotion = move_promotion_piece(m); diff --git a/src/position.h b/src/position.h index e2365a68..09c63006 100644 --- a/src/position.h +++ b/src/position.h @@ -87,12 +87,13 @@ enum Phase { /// must be passed as a parameter. struct StateInfo { - Key key, pawnKey, materialKey; + Key pawnKey, materialKey; int castleRights, rule50, pliesFromNull; Square epSquare; Score value; Value npMaterial[2]; + Key key; PieceType capture; Bitboard checkersBB; StateInfo* previous;