It does not change often and is not so fast
to calculate.
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
// King shelter
if (relative_rank(us, s) <= RANK_4)
{
// King shelter
if (relative_rank(us, s) <= RANK_4)
{
- Bitboard pawns = p.pawns(us) & this_and_neighboring_files_bb(s);
- Rank r = square_rank(s);
- for (int i = 1; i < 4; i++)
- shelter += count_1s_8bit(shiftRowsDown(pawns, r+i*sign)) * (128>>i);
-
+ // Shelter cache lookup
+ shelter = ei.pi->kingShelter(us, s);
+ if (shelter == -1)
+ {
+ shelter = 0;
+ Bitboard pawns = p.pawns(us) & this_and_neighboring_files_bb(s);
+ Rank r = square_rank(s);
+ for (int i = 1; i < 4; i++)
+ shelter += count_1s_8bit(shiftRowsDown(pawns, r+i*sign)) * (128>>i);
+
+ // Cache shelter value in pawn info
+ ei.pi->setKingShelter(us, s, shelter);
+ }
ei.mgValue += sign * Value(shelter);
}
ei.mgValue += sign * Value(shelter);
}
int file_is_half_open(Color c, File f) const;
int has_open_file_to_left(Color c, File f) const;
int has_open_file_to_right(Color c, File f) const;
int file_is_half_open(Color c, File f) const;
int has_open_file_to_left(Color c, File f) const;
int has_open_file_to_right(Color c, File f) const;
+ int kingShelter(Color c, Square ksq) const;
+ void setKingShelter(Color c, Square ksq, int value);
private:
void clear();
Key key;
Bitboard passedPawns;
private:
void clear();
Key key;
Bitboard passedPawns;
+ Square kingSquares[2];
+ int16_t kingShelters[2];
int16_t mgValue, egValue;
int16_t ksStormValue[2], qsStormValue[2];
uint8_t halfOpenFiles[2];
int16_t mgValue, egValue;
int16_t ksStormValue[2], qsStormValue[2];
uint8_t halfOpenFiles[2];
return halfOpenFiles[c] & ~((1 << int(f+1)) - 1);
}
return halfOpenFiles[c] & ~((1 << int(f+1)) - 1);
}
+inline int PawnInfo::kingShelter(Color c, Square ksq) const {
+ return (kingSquares[c] == ksq ? kingShelters[c] : -1);
+}
+
+inline void PawnInfo::setKingShelter(Color c, Square ksq, int value) {
+ kingSquares[c] = ksq;
+ kingShelters[c] = (int16_t)value;
+}
+
inline void PawnInfo::clear() {
passedPawns = EmptyBoardBB;
inline void PawnInfo::clear() {
passedPawns = EmptyBoardBB;
ksStormValue[WHITE] = ksStormValue[BLACK] = 0;
qsStormValue[WHITE] = qsStormValue[BLACK] = 0;
halfOpenFiles[WHITE] = halfOpenFiles[BLACK] = 0xFF;
ksStormValue[WHITE] = ksStormValue[BLACK] = 0;
qsStormValue[WHITE] = qsStormValue[BLACK] = 0;
halfOpenFiles[WHITE] = halfOpenFiles[BLACK] = 0xFF;
+ kingSquares[WHITE] = kingSquares[BLACK] = SQ_NONE;