X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fpawns.cpp;h=c314c4ae6634bad6fc97bd9831dd89a6f2c32ee7;hb=6096ca7a95f2f3bc1049b4fe240b21b7fbc389f9;hp=5a789ef24bf376063cbbccdddee49d781a2ad035;hpb=4ce08482c3b0685691162bfc9115ccc7656674b4;p=stockfish diff --git a/src/pawns.cpp b/src/pawns.cpp index 5a789ef2..c314c4ae 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -110,12 +110,13 @@ namespace { /// PawnInfoTable c'tor and d'tor instantiated one each thread -PawnInfoTable::PawnInfoTable(unsigned numOfEntries) : size(numOfEntries) { +PawnInfoTable::PawnInfoTable() { + + entries = new PawnInfo[PawnTableSize]; - entries = new PawnInfo[size]; if (!entries) { - std::cerr << "Failed to allocate " << (numOfEntries * sizeof(PawnInfo)) + std::cerr << "Failed to allocate " << (PawnTableSize * sizeof(PawnInfo)) << " bytes for pawn hash table." << std::endl; Application::exit_with_failure(); } @@ -128,16 +129,6 @@ PawnInfoTable::~PawnInfoTable() { } -/// PawnInfo::clear() resets to zero the PawnInfo entry. Note that -/// kingSquares[] is initialized to SQ_NONE instead. - -void PawnInfo::clear() { - - memset(this, 0, sizeof(PawnInfo)); - kingSquares[WHITE] = kingSquares[BLACK] = SQ_NONE; -} - - /// PawnInfoTable::get_pawn_info() takes a position object as input, computes /// a PawnInfo object, and returns a pointer to it. The result is also stored /// in a hash table, so we don't have to recompute everything when the same @@ -148,7 +139,7 @@ PawnInfo* PawnInfoTable::get_pawn_info(const Position& pos) const { assert(pos.is_ok()); Key key = pos.get_pawn_key(); - unsigned index = unsigned(key & (size - 1)); + unsigned index = unsigned(key & (PawnTableSize - 1)); PawnInfo* pi = entries + index; // If pi->key matches the position's pawn hash key, it means that we @@ -158,7 +149,8 @@ PawnInfo* PawnInfoTable::get_pawn_info(const Position& pos) const { return pi; // Clear the PawnInfo object, and set the key - pi->clear(); + memset(pi, 0, sizeof(PawnInfo)); + pi->kingSquares[WHITE] = pi->kingSquares[BLACK] = SQ_NONE; pi->key = key; // Calculate pawn attacks @@ -185,7 +177,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, Rank r; int bonus; bool passed, isolated, doubled, opposed, chain, backward, candidate; - Score value = make_score(0, 0); + Score value = SCORE_ZERO; const Square* ptr = pos.piece_list_begin(Us, PAWN); // Initialize pawn storm scores by giving bonuses for open files @@ -268,7 +260,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, // Mark the pawn as passed. Pawn will be properly scored in evaluation // because we need full attack info to evaluate passed pawns. if (passed) - set_bit(&(pi->passedPawns), s); + set_bit(&(pi->passedPawns[Us]), s); // Score this pawn if (isolated) @@ -328,22 +320,3 @@ int PawnInfoTable::evaluate_pawn_storm(Square s, Rank r, File f, Bitboard theirP } return bonus; } - - -/// 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) { - - Bitboard pawns = pos.pieces(PAWN, c) & this_and_neighboring_files_bb(ksq); - unsigned shelter = 0; - 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; -}