summaryrefslogtreecommitdiff
path: root/src/GNUmakefile
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/GNUmakefile
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/GNUmakefile')
-rw-r--r--src/GNUmakefile8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/GNUmakefile b/src/GNUmakefile
index 3613e40..e6d24d8 100644
--- a/src/GNUmakefile
+++ b/src/GNUmakefile
@@ -97,7 +97,13 @@ ifdef USE_READLINE
endif
ifdef SIXTYFOUR
- PROFILE += -m64
+ # -mpopcnt: every x86-64 chip built since ~2008 (and this box's Ryzen
+ # 9 3900X) has the POPCNT instruction, but clang won't emit it for
+ # __builtin_popcountll without this -- without it, the builtin lowers
+ # to a ~15-instruction SWAR bit-trick sequence instead (still faster
+ # than the old CDECL-call CountBits, but not the ~1-3 cycle single
+ # instruction the "fast" eval.c wrappers were assumed to get).
+ PROFILE += -m64 -mpopcnt
NASMFLAGS += -d_X64_
else
PROFILE += -m32