mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Retire do_capture_move()
It is called only in do_move() that now has been fully expanded. This is the most time consuming function of all the engine. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
08abe8b4a3
commit
fd5d6c5340
2 changed files with 58 additions and 67 deletions
124
src/position.cpp
124
src/position.cpp
|
@ -781,11 +781,66 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
|
||||||
|
|
||||||
assert(color_of(piece_on(from)) == us);
|
assert(color_of(piece_on(from)) == us);
|
||||||
assert(color_of(piece_on(to)) == them || square_is_empty(to));
|
assert(color_of(piece_on(to)) == them || square_is_empty(to));
|
||||||
assert(!(ep || pm) || piece == make_piece(us, PAWN));
|
assert(capture != KING);
|
||||||
assert(!pm || relative_rank(us, to) == RANK_8);
|
|
||||||
|
|
||||||
if (capture)
|
if (capture)
|
||||||
do_capture_move(key, capture, them, to, ep);
|
{
|
||||||
|
Square capsq = to;
|
||||||
|
|
||||||
|
// If the captured piece was a pawn, update pawn hash key, otherwise
|
||||||
|
// update non-pawn material.
|
||||||
|
if (capture == PAWN)
|
||||||
|
{
|
||||||
|
if (ep) // En passant?
|
||||||
|
{
|
||||||
|
capsq += pawn_push(them);
|
||||||
|
|
||||||
|
assert(pt == PAWN);
|
||||||
|
assert(to == st->epSquare);
|
||||||
|
assert(relative_rank(us, to) == RANK_6);
|
||||||
|
assert(piece_on(to) == PIECE_NONE);
|
||||||
|
assert(piece_on(capsq) == make_piece(them, PAWN));
|
||||||
|
|
||||||
|
board[capsq] = PIECE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
st->pawnKey ^= zobrist[them][PAWN][capsq];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
st->npMaterial[them] -= PieceValueMidgame[capture];
|
||||||
|
|
||||||
|
// Remove captured piece
|
||||||
|
clear_bit(&byColorBB[them], capsq);
|
||||||
|
clear_bit(&byTypeBB[capture], capsq);
|
||||||
|
clear_bit(&byTypeBB[0], capsq);
|
||||||
|
|
||||||
|
// Update hash key
|
||||||
|
key ^= zobrist[them][capture][capsq];
|
||||||
|
|
||||||
|
// Update incremental scores
|
||||||
|
st->value -= pst(make_piece(them, capture), capsq);
|
||||||
|
|
||||||
|
// Update piece count
|
||||||
|
pieceCount[them][capture]--;
|
||||||
|
|
||||||
|
// Update material hash key
|
||||||
|
st->materialKey ^= zobrist[them][capture][pieceCount[them][capture]];
|
||||||
|
|
||||||
|
// Update piece list, move the last piece at index[capsq] position
|
||||||
|
//
|
||||||
|
// WARNING: This is a not perfectly revresible operation. When we
|
||||||
|
// will reinsert the captured piece in undo_move() we will put it
|
||||||
|
// at the end of the list and not in its original place, it means
|
||||||
|
// index[] and pieceList[] are not guaranteed to be invariant to a
|
||||||
|
// do_move() + undo_move() sequence.
|
||||||
|
Square lastPieceSquare = pieceList[them][capture][pieceCount[them][capture]];
|
||||||
|
index[lastPieceSquare] = index[capsq];
|
||||||
|
pieceList[them][capture][index[lastPieceSquare]] = lastPieceSquare;
|
||||||
|
pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
|
||||||
|
|
||||||
|
// Reset rule 50 counter
|
||||||
|
st->rule50 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Update hash key
|
// Update hash key
|
||||||
key ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
|
key ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
|
||||||
|
@ -930,69 +985,6 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position::do_capture_move() is a private method used to update captured
|
|
||||||
/// piece info. It is called from the main Position::do_move function.
|
|
||||||
|
|
||||||
void Position::do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep) {
|
|
||||||
|
|
||||||
assert(capture != KING);
|
|
||||||
|
|
||||||
Square capsq = to;
|
|
||||||
|
|
||||||
// If the captured piece was a pawn, update pawn hash key,
|
|
||||||
// otherwise update non-pawn material.
|
|
||||||
if (capture == PAWN)
|
|
||||||
{
|
|
||||||
if (ep) // en passant ?
|
|
||||||
{
|
|
||||||
capsq = to + pawn_push(them);
|
|
||||||
|
|
||||||
assert(to == st->epSquare);
|
|
||||||
assert(relative_rank(flip(them), to) == RANK_6);
|
|
||||||
assert(piece_on(to) == PIECE_NONE);
|
|
||||||
assert(piece_on(capsq) == make_piece(them, PAWN));
|
|
||||||
|
|
||||||
board[capsq] = PIECE_NONE;
|
|
||||||
}
|
|
||||||
st->pawnKey ^= zobrist[them][PAWN][capsq];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
st->npMaterial[them] -= PieceValueMidgame[capture];
|
|
||||||
|
|
||||||
// Remove captured piece
|
|
||||||
clear_bit(&byColorBB[them], capsq);
|
|
||||||
clear_bit(&byTypeBB[capture], capsq);
|
|
||||||
clear_bit(&byTypeBB[0], capsq);
|
|
||||||
|
|
||||||
// Update hash key
|
|
||||||
key ^= zobrist[them][capture][capsq];
|
|
||||||
|
|
||||||
// Update incremental scores
|
|
||||||
st->value -= pst(make_piece(them, capture), capsq);
|
|
||||||
|
|
||||||
// Update piece count
|
|
||||||
pieceCount[them][capture]--;
|
|
||||||
|
|
||||||
// Update material hash key
|
|
||||||
st->materialKey ^= zobrist[them][capture][pieceCount[them][capture]];
|
|
||||||
|
|
||||||
// Update piece list, move the last piece at index[capsq] position
|
|
||||||
//
|
|
||||||
// WARNING: This is a not perfectly revresible operation. When we
|
|
||||||
// will reinsert the captured piece in undo_move() we will put it
|
|
||||||
// at the end of the list and not in its original place, it means
|
|
||||||
// index[] and pieceList[] are not guaranteed to be invariant to a
|
|
||||||
// do_move() + undo_move() sequence.
|
|
||||||
Square lastPieceSquare = pieceList[them][capture][pieceCount[them][capture]];
|
|
||||||
index[lastPieceSquare] = index[capsq];
|
|
||||||
pieceList[them][capture][index[lastPieceSquare]] = lastPieceSquare;
|
|
||||||
pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
|
|
||||||
|
|
||||||
// Reset rule 50 counter
|
|
||||||
st->rule50 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Position::do_castle_move() is a private method used to do/undo a castling
|
/// Position::do_castle_move() is a private method used to do/undo a castling
|
||||||
/// move. Note that castling moves are encoded as "king captures friendly rook"
|
/// move. Note that castling moves are encoded as "king captures friendly rook"
|
||||||
/// moves, for instance white short castling in a non-Chess960 game is encoded
|
/// moves, for instance white short castling in a non-Chess960 game is encoded
|
||||||
|
|
|
@ -217,7 +217,6 @@ private:
|
||||||
bool move_is_legal(const Move m) const;
|
bool move_is_legal(const Move m) const;
|
||||||
|
|
||||||
// Helper functions for doing and undoing moves
|
// Helper functions for doing and undoing moves
|
||||||
void do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep);
|
|
||||||
template<bool Do> void do_castle_move(Move m);
|
template<bool Do> void do_castle_move(Move m);
|
||||||
|
|
||||||
template<bool FindPinned>
|
template<bool FindPinned>
|
||||||
|
|
Loading…
Add table
Reference in a new issue