X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=e0e9aa3a9b37b316dc1b55f02b00755a3305c42b;hp=443ba88141b6ae9c3303b4c361efd52c62df64a0;hb=da948cc94ebef4988199c90389a5099b087d2088;hpb=48b74142efa52f0da9d4e27f9bbcbe9520499524 diff --git a/src/position.cpp b/src/position.cpp index 443ba881..e0e9aa3a 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -985,17 +985,22 @@ void Position::do_castle_move(Move m) { rto = relative_square(us, SQ_D1); } - // Move the pieces - Bitboard kmove_bb = make_move_bb(kfrom, kto); - do_move_bb(&(byColorBB[us]), kmove_bb); - do_move_bb(&(byTypeBB[KING]), kmove_bb); - do_move_bb(&(byTypeBB[0]), kmove_bb); // HACK: byTypeBB[0] == occupied squares - - Bitboard rmove_bb = make_move_bb(rfrom, rto); - do_move_bb(&(byColorBB[us]), rmove_bb); - do_move_bb(&(byTypeBB[ROOK]), rmove_bb); - do_move_bb(&(byTypeBB[0]), rmove_bb); // HACK: byTypeBB[0] == occupied squares - + // Remove pieces from source squares: + clear_bit(&(byColorBB[us]), kfrom); + clear_bit(&(byTypeBB[KING]), kfrom); + clear_bit(&(byTypeBB[0]), kfrom); // HACK: byTypeBB[0] == occupied squares + clear_bit(&(byColorBB[us]), rfrom); + clear_bit(&(byTypeBB[ROOK]), rfrom); + clear_bit(&(byTypeBB[0]), rfrom); // HACK: byTypeBB[0] == occupied squares + + // Put pieces on destination squares: + set_bit(&(byColorBB[us]), kto); + set_bit(&(byTypeBB[KING]), kto); + set_bit(&(byTypeBB[0]), kto); // HACK: byTypeBB[0] == occupied squares + set_bit(&(byColorBB[us]), rto); + set_bit(&(byTypeBB[ROOK]), rto); + set_bit(&(byTypeBB[0]), rto); // HACK: byTypeBB[0] == occupied squares + // Update board array Piece king = piece_of_color_and_type(us, KING); Piece rook = piece_of_color_and_type(us, ROOK); @@ -1106,6 +1111,7 @@ void Position::undo_move(Move m) { pieceList[us][PAWN][index[to]] = to; } + // Put the piece back at the source square Bitboard move_bb = make_move_bb(to, from); do_move_bb(&(byColorBB[us]), move_bb); @@ -1183,17 +1189,22 @@ void Position::undo_castle_move(Move m) { assert(piece_on(kto) == piece_of_color_and_type(us, KING)); assert(piece_on(rto) == piece_of_color_and_type(us, ROOK)); - - // Put the pieces back at the source square - Bitboard kmove_bb = make_move_bb(kto, kfrom); - do_move_bb(&(byColorBB[us]), kmove_bb); - do_move_bb(&(byTypeBB[KING]), kmove_bb); - do_move_bb(&(byTypeBB[0]), kmove_bb); // HACK: byTypeBB[0] == occupied squares - - Bitboard rmove_bb = make_move_bb(rto, rfrom); - do_move_bb(&(byColorBB[us]), rmove_bb); - do_move_bb(&(byTypeBB[ROOK]), rmove_bb); - do_move_bb(&(byTypeBB[0]), rmove_bb); // HACK: byTypeBB[0] == occupied squares + + // Remove pieces from destination squares: + clear_bit(&(byColorBB[us]), kto); + clear_bit(&(byTypeBB[KING]), kto); + clear_bit(&(byTypeBB[0]), kto); // HACK: byTypeBB[0] == occupied squares + clear_bit(&(byColorBB[us]), rto); + clear_bit(&(byTypeBB[ROOK]), rto); + clear_bit(&(byTypeBB[0]), rto); // HACK: byTypeBB[0] == occupied squares + + // Put pieces on source squares: + set_bit(&(byColorBB[us]), kfrom); + set_bit(&(byTypeBB[KING]), kfrom); + set_bit(&(byTypeBB[0]), kfrom); // HACK: byTypeBB[0] == occupied squares + set_bit(&(byColorBB[us]), rfrom); + set_bit(&(byTypeBB[ROOK]), rfrom); + set_bit(&(byTypeBB[0]), rfrom); // HACK: byTypeBB[0] == occupied squares // Update board board[rto] = board[kto] = EMPTY; @@ -1321,7 +1332,7 @@ int Position::see(Square from, Square to) const { 0, 0 }; - Bitboard attackers, stmAttackers, occ, b; + Bitboard attackers, stmAttackers, b; assert(square_is_ok(from) || from == SQ_NONE); assert(square_is_ok(to)); @@ -1333,10 +1344,7 @@ int Position::see(Square from, Square to) const { // Initialize pieces Piece piece = piece_on(from); Piece capture = piece_on(to); - - // Find all attackers to the destination square, with the moving piece - // removed, but possibly an X-ray attacker added behind it. - occ = occupied_squares(); + Bitboard occ = occupied_squares(); // Handle en passant moves if (st->epSquare == to && type_of_piece_on(from) == PAWN) @@ -1353,6 +1361,8 @@ int Position::see(Square from, Square to) const { while (true) { + // Find all attackers to the destination square, with the moving piece + // removed, but possibly an X-ray attacker added behind it. clear_bit(&occ, from); attackers = (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN)) | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN))