X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=788a220769c23cde1e1a15ce1298d8c32651e44f;hp=197e1e31fa3c628ec59fa02182da53d60681af50;hb=5f12069cbfc882fdf989d04618ad9c33e603c419;hpb=1f4798a173ea6579ef42a423d71f2e36d3894a03 diff --git a/src/position.cpp b/src/position.cpp index 197e1e31..788a2207 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -274,7 +274,7 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; ++rsq) {} else if (token >= 'A' && token <= 'H') - rsq = File(token - 'A') | relative_rank(c, RANK_1); + rsq = make_square(File(token - 'A'), relative_rank(c, RANK_1)); else continue; @@ -286,7 +286,7 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { if ( ((ss >> col) && (col >= 'a' && col <= 'h')) && ((ss >> row) && (row == '3' || row == '6'))) { - st->epSquare = File(col - 'a') | Rank(row - '1'); + st->epSquare = make_square(File(col - 'a'), Rank(row - '1')); if (!(attackers_to(st->epSquare) & pieces(sideToMove, PAWN))) st->epSquare = SQ_NONE; @@ -392,14 +392,14 @@ const string Position::fen() const { { for (File file = FILE_A; file <= FILE_H; ++file) { - for (emptyCnt = 0; file <= FILE_H && empty(file | rank); ++file) + for (emptyCnt = 0; file <= FILE_H && empty(make_square(file, rank)); ++file) ++emptyCnt; if (emptyCnt) ss << emptyCnt; if (file <= FILE_H) - ss << PieceToChar[piece_on(file | rank)]; + ss << PieceToChar[piece_on(make_square(file, rank))]; } if (rank > RANK_1) @@ -664,7 +664,7 @@ bool Position::gives_check(Move m, const CheckInfo& ci) const { // the captured pawn. case ENPASSANT: { - Square capsq = file_of(to) | rank_of(from); + Square capsq = make_square(file_of(to), rank_of(from)); Bitboard b = (pieces() ^ from ^ capsq) | to; return (attacks_bb< ROOK>(ci.ksq, b) & pieces(sideToMove, QUEEN, ROOK)) @@ -863,7 +863,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI // Update the key with the final value st->key = k; - // Update checkers bitboard: piece must be already moved + // Update checkers bitboard: piece must be already moved due to attacks_from() st->checkersBB = 0; if (moveIsCheck) @@ -877,7 +877,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI st->checkersBB |= to; // Discovered checks - if (ci.dcCandidates && (ci.dcCandidates & from)) + if (unlikely(ci.dcCandidates) && (ci.dcCandidates & from)) { if (pt != ROOK) st->checkersBB |= attacks_from(king_square(them)) & pieces(us, QUEEN, ROOK); @@ -904,24 +904,20 @@ void Position::undo_move(Move m) { sideToMove = ~sideToMove; Color us = sideToMove; - Color them = ~us; Square from = from_sq(m); Square to = to_sq(m); PieceType pt = type_of(piece_on(to)); - PieceType captured = st->capturedType; assert(empty(from) || type_of(m) == CASTLING); - assert(captured != KING); + assert(st->capturedType != KING); if (type_of(m) == PROMOTION) { - PieceType promotion = promotion_type(m); - - assert(promotion == pt); + assert(pt == promotion_type(m)); assert(relative_rank(us, to) == RANK_8); - assert(promotion >= KNIGHT && promotion <= QUEEN); + assert(promotion_type(m) >= KNIGHT && promotion_type(m) <= QUEEN); - remove_piece(to, us, promotion); + remove_piece(to, us, promotion_type(m)); put_piece(to, us, PAWN); pt = PAWN; } @@ -930,28 +926,27 @@ void Position::undo_move(Move m) { { Square rfrom, rto; do_castling(from, to, rfrom, rto); - - captured = NO_PIECE_TYPE; - pt = KING; } else - move_piece(to, from, us, pt); // Put the piece back at the source square - - if (captured) { - Square capsq = to; + move_piece(to, from, us, pt); // Put the piece back at the source square - if (type_of(m) == ENPASSANT) + if (st->capturedType) { - capsq -= pawn_push(us); + Square capsq = to; - assert(pt == PAWN); - assert(to == st->previous->epSquare); - assert(relative_rank(us, to) == RANK_6); - assert(piece_on(capsq) == NO_PIECE); - } + if (type_of(m) == ENPASSANT) + { + capsq -= pawn_push(us); + + assert(pt == PAWN); + assert(to == st->previous->epSquare); + assert(relative_rank(us, to) == RANK_6); + assert(piece_on(capsq) == NO_PIECE); + } - put_piece(capsq, them, captured); // Restore the captured piece + put_piece(capsq, ~us, st->capturedType); // Restore the captured piece + } } // Finally point our state pointer back to the previous state @@ -1181,9 +1176,7 @@ void Position::flip() { /// Position::pos_is_ok() performs some consistency checks for the position object. /// This is meant to be helpful when debugging. -bool Position::pos_is_ok(int* failedStep) const { - - int dummy, *step = failedStep ? failedStep : &dummy; +bool Position::pos_is_ok(int* step) const { // Which parts of the position should be verified? const bool all = false; @@ -1196,19 +1189,17 @@ bool Position::pos_is_ok(int* failedStep) const { const bool testPieceList = all || false; const bool testCastlingSquares = all || false; - if (*step = 1, sideToMove != WHITE && sideToMove != BLACK) - return false; - - if ((*step)++, piece_on(king_square(WHITE)) != W_KING) - return false; - - if ((*step)++, piece_on(king_square(BLACK)) != B_KING) - return false; + if (step) + *step = 1; - if ((*step)++, ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6) + if ( (sideToMove != WHITE && sideToMove != BLACK) + || piece_on(king_square(WHITE)) != W_KING + || piece_on(king_square(BLACK)) != B_KING + || ( ep_square() != SQ_NONE + && relative_rank(sideToMove, ep_square()) != RANK_6)) return false; - if ((*step)++, testBitboards) + if (step && ++*step, testBitboards) { // The intersection of the white and black pieces must be empty if (pieces(WHITE) & pieces(BLACK)) @@ -1226,7 +1217,7 @@ bool Position::pos_is_ok(int* failedStep) const { return false; } - if ((*step)++, testState) + if (step && ++*step, testState) { StateInfo si; set_state(&si); @@ -1240,22 +1231,22 @@ bool Position::pos_is_ok(int* failedStep) const { return false; } - if ((*step)++, testKingCount) + if (step && ++*step, testKingCount) if ( std::count(board, board + SQUARE_NB, W_KING) != 1 || std::count(board, board + SQUARE_NB, B_KING) != 1) return false; - if ((*step)++, testKingCapture) + if (step && ++*step, testKingCapture) if (attackers_to(king_square(~sideToMove)) & pieces(sideToMove)) return false; - if ((*step)++, testPieceCounts) + if (step && ++*step, testPieceCounts) for (Color c = WHITE; c <= BLACK; ++c) for (PieceType pt = PAWN; pt <= KING; ++pt) if (pieceCount[c][pt] != popcount(pieces(c, pt))) return false; - if ((*step)++, testPieceList) + if (step && ++*step, testPieceList) for (Color c = WHITE; c <= BLACK; ++c) for (PieceType pt = PAWN; pt <= KING; ++pt) for (int i = 0; i < pieceCount[c][pt]; ++i) @@ -1263,7 +1254,7 @@ bool Position::pos_is_ok(int* failedStep) const { || index[pieceList[c][pt][i]] != i) return false; - if ((*step)++, testCastlingSquares) + if (step && ++*step, testCastlingSquares) for (Color c = WHITE; c <= BLACK; ++c) for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1)) { @@ -1276,6 +1267,5 @@ bool Position::pos_is_ok(int* failedStep) const { return false; } - *step = 0; return true; }