Simplification. Tests show that the "shift-and-superpose" trick is no longer
necessary. The speed benefit of avoiding a popcount is no longer relevant
on modern machines.
Passed STC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 41675 W: 9168 L: 9086 D: 23421
http://tests.stockfishchess.org/tests/view/
5a840bcc0ebc590297cc80b5
Passed LTC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 117728 W: 19875 L: 19911 D: 77942
http://tests.stockfishchess.org/tests/view/
5a8444800ebc590297cc80ca
No functional change.
score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16);
}
}
score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16);
}
}
- // Penalty when our king is on a pawnless flank
- if (!(pos.pieces(PAWN) & KingFlank[file_of(ksq)]))
- score -= PawnlessFlank;
- // King tropism: firstly, find attacked squares in our king flank
- b = attackedBy[Them][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
+ Bitboard kf = KingFlank[file_of(ksq)];
- assert(((Us == WHITE ? b << 4 : b >> 4) & b) == 0);
- assert(popcount(Us == WHITE ? b << 4 : b >> 4) == popcount(b));
+ // Penalty when our king is on a pawnless flank
+ if (!(pos.pieces(PAWN) & kf))
+ score -= PawnlessFlank;
- // Secondly, add the squares which are attacked twice in that flank and
- // which are not defended by our pawns.
- b = (Us == WHITE ? b << 4 : b >> 4)
- | (b & attackedBy2[Them] & ~attackedBy[Us][PAWN]);
+ // Find the squares that opponent attacks in our king flank, and the squares
+ // which are attacked twice in that flank but not defended by our pawns.
+ b1 = attackedBy[Them][ALL_PIECES] & kf & Camp;
+ b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN];
- score -= CloseEnemies * popcount(b);
+ // King tropism, to anticipate slow motion attacks on our king
+ score -= CloseEnemies * (popcount(b1) + popcount(b2));
if (T)
Trace::add(KING, Us, score);
if (T)
Trace::add(KING, Us, score);