From 84d6fe0f31069bc612f856ab7cd54d9aad7907ca Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 20 Sep 2009 10:47:59 +0100 Subject: [PATCH] Retire attackers_to(Square s, Color c) Use the definition in the few places where is needed. As a nice side effect there is also an optimization in generate_evasions() where the bitboard of enemy pieces is computed only once and out of a tight loop. No functional change. Signed-off-by: Marco Costalba --- src/movegen.cpp | 9 +++++---- src/position.cpp | 22 +++++++++++----------- src/position.h | 6 ------ 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index 2d96ec4c..ed09d44b 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -254,12 +254,13 @@ MoveStack* generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pin // Generate evasions for king Bitboard b1 = pos.piece_attacks_from(ksq) & ~pos.pieces_of_color(us) & ~checkersAttacks; + Bitboard enemy = pos.pieces_of_color(them); while (b1) { to = pop_1st_bit(&b1); // Note that we can use attackers_to() only because we // have already removed slider checkers. - if (!pos.attackers_to(to, them)) + if (!(pos.attackers_to(to) & enemy)) (*mlist++).move = make_move(ksq, to); } @@ -441,7 +442,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { // is occupied or under attack. for (s = Min(from, g1); s <= Max(from, g1); s++) if ( (s != from && s != to && !pos.square_is_empty(s)) - || pos.attackers_to(s, them)) + ||(pos.attackers_to(s) & pos.pieces_of_color(them))) illegal = true; // Check if any of the squares between king and rook @@ -472,7 +473,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { for (s = Min(from, c1); s <= Max(from, c1); s++) if( (s != from && s != to && !pos.square_is_empty(s)) - || pos.attackers_to(s, them)) + ||(pos.attackers_to(s) & pos.pieces_of_color(them))) illegal = true; for (s = Min(to, d1); s <= Max(to, d1); s++) @@ -942,7 +943,7 @@ namespace { // It is a bit complicated to correctly handle Chess960 for (s = Min(ksq, s1); s <= Max(ksq, s1); s++) if ( (s != ksq && s != rsq && pos.square_is_occupied(s)) - || pos.attackers_to(s, them)) + ||(pos.attackers_to(s) & pos.pieces_of_color(them))) illegal = true; for (s = Min(rsq, s2); s <= Max(rsq, s2); s++) diff --git a/src/position.cpp b/src/position.cpp index ecd0b829..9b9ca22a 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -452,7 +452,7 @@ bool Position::move_attacks_square(Move m, Square s) const { void Position::find_checkers() { Color us = side_to_move(); - st->checkersBB = attackers_to(king_square(us), opposite_color(us)); + st->checkersBB = attackers_to(king_square(us)) & pieces_of_color(opposite_color(us)); } @@ -509,7 +509,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { // If the moving piece is a king, check whether the destination // square is attacked by the opponent. if (type_of_piece_on(from) == KING) - return !attackers_to(move_to(m), opposite_color(us)); + return !(attackers_to(move_to(m)) & pieces_of_color(opposite_color(us))); // A non-king move is legal if and only if it is not pinned or it // is moving along the ray towards or away from the king. @@ -864,7 +864,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { // Update checkers bitboard, piece must be already moved if (ep | pm) - st->checkersBB = attackers_to(king_square(them), us); + st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us); else { st->checkersBB = EmptyBoardBB; @@ -1041,7 +1041,7 @@ void Position::do_castle_move(Move m) { st->rule50 = 0; // Update checkers BB - st->checkersBB = attackers_to(king_square(them), us); + st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us); // Finish sideToMove = opposite_color(sideToMove); @@ -1358,12 +1358,12 @@ int Position::see(Square from, Square to) const { while (true) { clear_bit(&occ, from); - attackers = (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN)) - | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN)) - | (piece_attacks_from(to) & pieces(KNIGHT)) - | (piece_attacks_from(to) & pieces(KING)) - | (pawn_attacks_from(to, WHITE) & pieces(PAWN, BLACK)) - | (pawn_attacks_from(to, BLACK) & pieces(PAWN, WHITE)); + attackers = (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN)) + | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN)) + | (piece_attacks_from(to) & pieces(KNIGHT)) + | (piece_attacks_from(to) & pieces(KING)) + | (pawn_attacks_from(to, WHITE) & pieces(PAWN, BLACK)) + | (pawn_attacks_from(to, BLACK) & pieces(PAWN, WHITE)); if (from != SQ_NONE) break; @@ -1923,7 +1923,7 @@ bool Position::is_ok(int* failedStep) const { Color us = side_to_move(); Color them = opposite_color(us); Square ksq = king_square(them); - if (attackers_to(ksq, us)) + if (attackers_to(ksq) & pieces_of_color(us)) return false; } diff --git a/src/position.h b/src/position.h index 9b5129a9..187fa72a 100644 --- a/src/position.h +++ b/src/position.h @@ -197,7 +197,6 @@ public: // Information about attacks to or from a given square Bitboard attackers_to(Square s) const; - Bitboard attackers_to(Square s, Color c) const; Bitboard piece_attacks_from(Piece p, Square s) const; Bitboard pawn_attacks_from(Square s, Color c) const; template Bitboard piece_attacks_from(Square s) const; @@ -470,11 +469,6 @@ inline bool Position::is_check() const { return st->checkersBB != EmptyBoardBB; } -inline Bitboard Position::attackers_to(Square s, Color c) const { - - return attackers_to(s) & pieces_of_color(c); -} - inline bool Position::pawn_is_passed(Color c, Square s) const { return !(pieces(PAWN, opposite_color(c)) & passed_pawn_mask(c, s)); } -- 2.39.2