1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-02 01:29:36 +00:00

Small tweak in is_pseudo_legal()

This is difficult code becuase a bug here could lead
to very subtle crashes in case of SMP games where we
have TT move corruption due to concurrent access.

Anyhow I have fully verified te code throwing at it
random moves. It shoudl work.

No functional change.
This commit is contained in:
Marco Costalba 2012-12-25 11:22:55 +01:00
parent 158014b39d
commit 423c6d8a8a

View file

@ -542,7 +542,6 @@ bool Position::move_is_legal(const Move m) const {
bool Position::is_pseudo_legal(const Move m) const { bool Position::is_pseudo_legal(const Move m) const {
Color us = sideToMove; Color us = sideToMove;
Color them = ~sideToMove;
Square from = from_sq(m); Square from = from_sq(m);
Square to = to_sq(m); Square to = to_sq(m);
Piece pc = piece_moved(m); Piece pc = piece_moved(m);
@ -587,7 +586,7 @@ bool Position::is_pseudo_legal(const Move m) const {
case DELTA_SE: case DELTA_SE:
// Capture. The destination square must be occupied by an enemy // Capture. The destination square must be occupied by an enemy
// piece (en passant captures was handled earlier). // piece (en passant captures was handled earlier).
if (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != them) if (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != ~us)
return false; return false;
// From and to files must be one file apart, avoids a7h5 // From and to files must be one file apart, avoids a7h5
@ -636,14 +635,12 @@ bool Position::is_pseudo_legal(const Move m) const {
{ {
if (type_of(pc) != KING) if (type_of(pc) != KING)
{ {
Bitboard b = checkers(); // Double check? In this case a king move is required
Square checksq = pop_lsb(&b); if (more_than_one(checkers()))
if (b) // double check ? In this case a king move is required
return false; return false;
// Our move must be a blocking evasion or a capture of the checking piece // Our move must be a blocking evasion or a capture of the checking piece
if (!((between_bb(checksq, king_square(us)) | checkers()) & to)) if (!((between_bb(lsb(checkers()), king_square(us)) | checkers()) & to))
return false; return false;
} }
// In case of king moves under check we have to remove king so to catch // In case of king moves under check we have to remove king so to catch