From 28240d375c837f2342163e84675bc9230124cd30 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Nicolet?= Date: Wed, 21 Sep 2016 09:32:00 +0200 Subject: [PATCH] Simplify pinners conditions in SEE() Use the following transformations: - to check that A is included in B, testing "(A & ~B) == 0" is faster than "(A & B) == A" - to remove the intersection of A and B from A, doing "A &= ~B;" is as fast as "if (A & B) A &= ~B;" but is simpler. Overall, the simpler patch version is 0.3% than current master. No functional change. --- src/position.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index f5081bd1..9fe5f893 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1010,11 +1010,9 @@ Value Position::see(Move m) const { occupied ^= to; // For the case when captured piece is a pinner // Don't allow pinned pieces to attack pieces except the king as long all - // pinners are on their original square. When a pinner moves to the - // exchange-square or get captured on it, we fall back to standard SEE behaviour. - if ( (stmAttackers & pinned_pieces(stm)) - && (st->pinnersForKing[stm] & occupied) == st->pinnersForKing[stm]) - stmAttackers &= ~pinned_pieces(stm); + // pinners are on their original square. + if (!(st->pinnersForKing[stm] & ~occupied)) + stmAttackers &= ~st->blockersForKing[stm]; if (!stmAttackers) return swapList[0]; @@ -1037,10 +1035,11 @@ Value Position::see(Move m) const { nextVictim = min_attacker(byTypeBB, to, stmAttackers, occupied, attackers); stm = ~stm; stmAttackers = attackers & pieces(stm); - if ( nextVictim != KING - && (stmAttackers & pinned_pieces(stm)) - && (st->pinnersForKing[stm] & occupied) == st->pinnersForKing[stm]) - stmAttackers &= ~pinned_pieces(stm); + + // Don't allow pinned pieces to attack pieces except the king + if ( nextVictim != KING + && !(st->pinnersForKing[stm] & ~occupied)) + stmAttackers &= ~st->blockersForKing[stm]; ++slIndex; -- 2.39.2