X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=17ca9d1e3228181a365cf203ea20e5f674645b9f;hp=d0523ab6ae6980cd4ca42693b4cd407cade6c81a;hb=080a4995a3977a0fe7071e62151dc4d716a13302;hpb=20224a5bbf2844b5b64eec1de199c2d51b8d93d4 diff --git a/src/pawns.cpp b/src/pawns.cpp index d0523ab6..17ca9d1e 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -385,3 +385,21 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) { pi->egValue = int16_t(egValue[WHITE] - egValue[BLACK]); return pi; } + + +/// PawnInfo::updateShelter calculates and caches king shelter. It is called +/// only when king square changes, about 20% of total get_king_shelter() calls. +int PawnInfo::updateShelter(const Position& pos, Color c, Square ksq) { + + int shelter = 0; + Bitboard pawns = pos.pawns(c) & this_and_neighboring_files_bb(ksq); + unsigned r = ksq & (7 << 3); + for (int i = 1, k = (c ? -8 : 8); i < 4; i++) + { + r += k; + shelter += BitCount8Bit[(pawns >> r) & 0xFF] * (128 >> i); + } + kingSquares[c] = ksq; + kingShelters[c] = shelter; + return shelter; +}