summaryrefslogtreecommitdiff
path: root/src/see.c
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2026-09-16 08:02:21 -0700
committerScott Gasch <[email protected]>2026-09-16 08:02:21 -0700
commit966a0ef4da9cf3911eb3da0533179199808717b4 (patch)
treee09363b574215ef0d8996155a5ab24314db2dd69 /src/see.c
parentb91c8453f3fe21c8ccd3568923d8e39141c9c945 (diff)
Retire cPawns/cNonPawns piece-location lists in favor of bbPawns/bbPieces/cKingSq, and hoist two redundant TotalNonPawnCount POPCNT calls out of per-node hot loops.
POSITION no longer stores cPawns[2][8], cNonPawns[2][16], uPawnCount[2], uNonPawnCount[2][8], or uWhiteSqBishopCount[2] -- every reader now goes through PawnMaterial/TotalNonPawnCount/WhiteSqBishopCount/KingPosition (chess.h), computed from the already-incrementally-maintained bbPawns/ bbPieces/cKingSq bitboards via a single -mpopcnt POPCNT instead of a stored counter. move.c's make/unmake loses the list-swap-on-removal bookkeeping entirely. GNUmakefile now passes -mpopcnt so the popcount builtins actually compile to one instruction instead of clang's ~15-op SWAR fallback. Measured a small but real nps regression from the naive swap (search.c's QSearch move-filter and eval.c's _EvalKing were each recomputing the same TotalNonPawnCount sum on every candidate move / twice per node); hoisted both to a single call per node instead. Net result across a same-code self-play match: ~1541.5 knps candidate vs ~1505.7 knps head_reference. A third hoist (FindEnprisePiece out of SelectBestWithHistory) was tried and reverted -- its cache isn't actually loop-invariant within a node (populated from inside Eval(), which doesn't run before every selection call), caught by a DEBUG-build ASSERT before it landed. Co-Authored-By: Claude Sonnet 5 <[email protected]>
Diffstat (limited to 'src/see.c')
-rw-r--r--src/see.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/see.c b/src/see.c
index 893a9bb..47efd30 100644
--- a/src/see.c
+++ b/src/see.c
@@ -112,9 +112,9 @@ Return value:
ULONG u;
bbAttackers = g_KnightAttacksBB[cSquare] & pos->bbPieces[uSide][KNIGHT];
- if (DISTANCE(cSquare, pos->cNonPawns[uSide][0]) == 1)
+ if (DISTANCE(cSquare, KingPosition(pos, uSide)) == 1)
{
- bbAttackers |= COOR_TO_BB(pos->cNonPawns[uSide][0]);
+ bbAttackers |= COOR_TO_BB(KingPosition(pos, uSide));
}
// Measured slower: deriving the needed direction(s) directly from
@@ -703,7 +703,7 @@ Return value:
// would exposes his king to check, skip it and try the
// next least valuable.
//
- cKing = pos->cNonPawns[uColor][0];
+ cKing = KingPosition(pos, uColor);
c = ExposesCheck(pos, pList->data[x].cLoc, cKing);
//
@@ -795,7 +795,7 @@ Return value:
// would exposes his king to check, skip it and try the
// next least valuable.
//
- cKing = pos->cNonPawns[uColor][0];
+ cKing = KingPosition(pos, uColor);
c = ExposesCheck(pos, pList->data[x].cLoc, cKing);
//