Skip to content

Commit 7a7bcd6

Browse files
protonspringsnicolet
authored andcommitted
Simplify signature of remove_piece()
This is a non-functional simplification. Instead of passing the piece type for remove_piece, we can rely on the board. The only exception is en-passant which must be explicitly set because the destination square for the capture is not the same as the piece to remove. Verified also in the Chess960 castling case by running a couple of perft, see the pull request discussion: #2460 STC LLR: 2.94 (-2.94,2.94) [-3.00,1.00] Total: 18624 W: 4147 L: 4070 D: 10407 Ptnml(0-2): 223, 1933, 4945, 1938, 260 http://tests.stockfishchess.org/tests/view/5dfeaa93e70446e17e451163 No functional change
1 parent bcf9282 commit 7a7bcd6

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

src/position.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -743,8 +743,6 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
743743
assert(relative_rank(us, to) == RANK_6);
744744
assert(piece_on(to) == NO_PIECE);
745745
assert(piece_on(capsq) == make_piece(them, PAWN));
746-
747-
board[capsq] = NO_PIECE; // Not done by remove_piece()
748746
}
749747

750748
st->pawnKey ^= Zobrist::psq[captured][capsq];
@@ -753,7 +751,10 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
753751
st->nonPawnMaterial[them] -= PieceValue[MG][captured];
754752

755753
// Update board and piece lists
756-
remove_piece(captured, capsq);
754+
remove_piece(capsq);
755+
756+
if (type_of(m) == ENPASSANT)
757+
board[capsq] = NO_PIECE;
757758

758759
// Update material hash key and prefetch access to materialTable
759760
k ^= Zobrist::psq[captured][capsq];
@@ -784,7 +785,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
784785

785786
// Move the piece. The tricky Chess960 castling is handled earlier
786787
if (type_of(m) != CASTLING)
787-
move_piece(pc, from, to);
788+
move_piece(from, to);
788789

789790
// If the moving piece is a pawn do some special extra work
790791
if (type_of(pc) == PAWN)
@@ -804,7 +805,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
804805
assert(relative_rank(us, to) == RANK_8);
805806
assert(type_of(promotion) >= KNIGHT && type_of(promotion) <= QUEEN);
806807

807-
remove_piece(pc, to);
808+
remove_piece(to);
808809
put_piece(promotion, to);
809810

810811
// Update hash keys
@@ -884,7 +885,7 @@ void Position::undo_move(Move m) {
884885
assert(type_of(pc) == promotion_type(m));
885886
assert(type_of(pc) >= KNIGHT && type_of(pc) <= QUEEN);
886887

887-
remove_piece(pc, to);
888+
remove_piece(to);
888889
pc = make_piece(us, PAWN);
889890
put_piece(pc, to);
890891
}
@@ -896,7 +897,7 @@ void Position::undo_move(Move m) {
896897
}
897898
else
898899
{
899-
move_piece(pc, to, from); // Put the piece back at the source square
900+
move_piece(to, from); // Put the piece back at the source square
900901

901902
if (st->capturedPiece)
902903
{
@@ -936,9 +937,9 @@ void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Squ
936937
to = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
937938

938939
// Remove both pieces first since squares could overlap in Chess960
939-
remove_piece(make_piece(us, KING), Do ? from : to);
940-
remove_piece(make_piece(us, ROOK), Do ? rfrom : rto);
941-
board[Do ? from : to] = board[Do ? rfrom : rto] = NO_PIECE; // Since remove_piece doesn't do it for us
940+
remove_piece(Do ? from : to);
941+
remove_piece(Do ? rfrom : rto);
942+
board[Do ? from : to] = board[Do ? rfrom : rto] = NO_PIECE; // Since remove_piece doesn't do this for us
942943
put_piece(make_piece(us, KING), Do ? to : from);
943944
put_piece(make_piece(us, ROOK), Do ? rto : rfrom);
944945
}

src/position.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ class Position {
174174

175175
// Other helpers
176176
void put_piece(Piece pc, Square s);
177-
void remove_piece(Piece pc, Square s);
178-
void move_piece(Piece pc, Square from, Square to);
177+
void remove_piece(Square s);
178+
void move_piece(Square from, Square to);
179179
template<bool Do>
180180
void do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto);
181181

@@ -412,12 +412,13 @@ inline void Position::put_piece(Piece pc, Square s) {
412412
psq += PSQT::psq[pc][s];
413413
}
414414

415-
inline void Position::remove_piece(Piece pc, Square s) {
415+
inline void Position::remove_piece(Square s) {
416416

417417
// WARNING: This is not a reversible operation. If we remove a piece in
418418
// do_move() and then replace it in undo_move() we will put it at the end of
419419
// the list and not in its original place, it means index[] and pieceList[]
420420
// are not invariant to a do_move() + undo_move() sequence.
421+
Piece pc = board[s];
421422
byTypeBB[ALL_PIECES] ^= s;
422423
byTypeBB[type_of(pc)] ^= s;
423424
byColorBB[color_of(pc)] ^= s;
@@ -430,10 +431,11 @@ inline void Position::remove_piece(Piece pc, Square s) {
430431
psq -= PSQT::psq[pc][s];
431432
}
432433

433-
inline void Position::move_piece(Piece pc, Square from, Square to) {
434+
inline void Position::move_piece(Square from, Square to) {
434435

435436
// index[from] is not updated and becomes stale. This works as long as index[]
436437
// is accessed just by known occupied squares.
438+
Piece pc = board[from];
437439
Bitboard fromTo = from | to;
438440
byTypeBB[ALL_PIECES] ^= fromTo;
439441
byTypeBB[type_of(pc)] ^= fromTo;

0 commit comments

Comments
 (0)