const int PawnTableSize = 16384;
const int MaterialTableSize = 1024;
- // Array which gives the number of nonzero bits in an 8-bit integer
- uint8_t BitCount8Bit[256];
-
// Function prototypes
template<bool HasPopCnt>
Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID);
// Probe the material hash table
ei.mi = MaterialTable[threadID]->get_material_info(pos);
- ei.mgValue += ei.mi->mg_value();
- ei.egValue += ei.mi->eg_value();
+ ei.mgValue += ei.mi->material_value();
+ ei.egValue += ei.mi->material_value();
// If we have a specialized evaluation function for the current material
// configuration, call it and return
// Initialize pawn attack bitboards for both sides
ei.attackedBy[WHITE][PAWN] = ((pos.pawns(WHITE) << 9) & ~FileABB) | ((pos.pawns(WHITE) << 7) & ~FileHBB);
ei.attackedBy[BLACK][PAWN] = ((pos.pawns(BLACK) >> 7) & ~FileABB) | ((pos.pawns(BLACK) >> 9) & ~FileHBB);
- ei.kingAttackersCount[WHITE] = count_1s_max_15<HasPopCnt>(ei.attackedBy[WHITE][PAWN] & ei.attackedBy[BLACK][KING])/2;
- ei.kingAttackersCount[BLACK] = count_1s_max_15<HasPopCnt>(ei.attackedBy[BLACK][PAWN] & ei.attackedBy[WHITE][KING])/2;
+ Bitboard b1 = ei.attackedBy[WHITE][PAWN] & ei.attackedBy[BLACK][KING];
+ Bitboard b2 = ei.attackedBy[BLACK][PAWN] & ei.attackedBy[WHITE][KING];
+ if (b1)
+ ei.kingAttackersCount[WHITE] = count_1s_max_15<HasPopCnt>(b1)/2;
+
+ if (b2)
+ ei.kingAttackersCount[BLACK] = count_1s_max_15<HasPopCnt>(b2)/2;
// Evaluate pieces
for (Color c = WHITE; c <= BLACK; c++)
if (!MaterialTable[i])
MaterialTable[i] = new MaterialInfoTable(MaterialTableSize);
}
-
- for (Bitboard b = 0ULL; b < 256ULL; b++)
- {
- assert(count_1s(b) == int(uint8_t(count_1s(b))));
- BitCount8Bit[b] = (uint8_t)count_1s(b);
- }
}
}
}
- inline Bitboard shiftRowsDown(const Bitboard& b, int num) {
-
- return b >> (num << 3);
- }
// evaluate_king<>() assigns bonuses and penalties to a king of a given color.
// King shelter
if (relative_rank(us, s) <= RANK_4)
{
- // 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 += BitCount8Bit[shiftRowsDown(pawns, r+i*sign) & 0xFF] * (128 >> i);
-
- // Cache shelter value in pawn info
- ei.pi->setKingShelter(us, s, shelter);
- }
+ shelter = ei.pi->get_king_shelter(p, us, s);
ei.mgValue += sign * Value(shelter);
}