diff options
| author | Scott Gasch <[email protected]> | 2026-09-04 09:22:46 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2026-09-04 09:22:46 -0700 |
| commit | be420bb8d1d5d16a4e24ab6fd706a5ae898eaa85 (patch) | |
| tree | 1dff11ecfec08780abfb7e95715ed0f14df1aac5 /src/board.c | |
| parent | 6c045be8a37a8eae1ea6aed250944e22af2335a1 (diff) | |
Add bitboard-backed GetAttacks (section 2/3), verified faster than asm
Board-representation migration, sections 2-3 (GetAttacks half):
- board.c: VerifyPositionConsistency's bbPieces consistency check
(migration section 2), verified clean via gmake TEST=1 with the
assert live.
- POSITION.bbPawns[2]: new incrementally-maintained per-color pawn
location bitboard (chess.h), maintained at the same 6 move.c sites
as bbPieces, populated from scratch in fen.c. Distinct from the
pawn-hash-keyed bbPawnLocations; this one needs no
SEARCHER_THREAD_CONTEXT, so it's reachable from GetAttacks's actual
call sites (which only ever have a POSITION*).
- data.c/chess.h/main.c: g_RookRayAll/g_BishopRayAll (all 4 per-square
ray directions pre-ORed) and g_PawnAttackOriginBB[2][128] startup
tables, plus FastFirstBit/FastLastBit (static inline bsf/bsr
wrappers, chess.h) -- supporting tables/helpers for the primitive
below.
- see.c: _WhoAttacksSquareBB (bitboard "who attacks square X" query)
and _GetAttacksBB (SEE_LIST-populating PoC wrapping it), side by
side with the existing SlowGetAttacks/asm GetAttacks -- not wired
into the GetAttacks macro yet (section 6), pure addition.
- testsee.c: SeeListsAreEqual made order-independent (SEE() sorts the
list right after GetAttacks returns, so order was never semantically
significant); TestGetAttacks extended to run _GetAttacksBB as a
third comparison across the existing 20,000-random-position sweep;
added an interleaved asm/Slow/BB cycles-per-call benchmark across
opening/middlegame/endgame positions.
- testsup.c: fixed GenerateRandomLegalPosition (used by the sweep
above) to maintain bbPieces/bbPawns at its two hand-placement sites
-- a latent gap since section 1 that made its own
VerifyPositionConsistency legality gate almost always reject
generated positions, causing large, variable retry-loop slowdowns.
Verified: 20,000-position x every-square x both-colors correctness
sweep passes (gmake TEST=1), precommit_check.sh clean (self-test +
DEBUG smoke test). Benchmark: _GetAttacksBB is ~0.53-0.55x asm
GetAttacks's cycles/call (opening/middlegame) and ~0.89x (endgame) --
faster, not just equivalent, primarily from replacing bbOccupied's
up-to-16-iteration pawn loop with two bbPawns ORs, plus a
g_PawnAttackOriginBB table lookup replacing per-call pawn-delta
arithmetic and per-direction/per-side-group early-outs in the slider
walk. See board_representation/MIGRATION.md section 3 for the full
writeup, including a reverted approach that measured slower and why,
and the CountKingSafetyDefects half's re-scoped (not yet implemented)
design.
Also confirmed (not caused by this work, not fixed here): a
pre-existing non-deterministic MP-race assertion in util.c:1093's PV
printing, reproduced independently on a clean HEAD checkout.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Jntky4yGUTyQVaGCXms4F2
Diffstat (limited to 'src/board.c')
| -rwxr-xr-x | src/board.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/board.c b/src/board.c index 0c5f4df..0b195be 100755 --- a/src/board.c +++ b/src/board.c @@ -169,6 +169,7 @@ Return value: "Extra pieces on board that are not accounted for", "Fifty move counter is too high", "bbPieces bitboard doesn't match piece list", + "bbPawns bitboard doesn't match pawn list", }; ULONG u, v; COOR c; @@ -177,6 +178,7 @@ Return value: ULONG uNonPawnMaterial[2] = {0, 0}; ULONG uNonPawnCount[2][7]; BITBOARD bbPieces[2][8]; + BITBOARD bbPawns[2]; ULONG uSigmaNonPawnCount[2] = {0, 0}; ULONG uWhiteSqBishopCount[2] = {0, 0}; UINT64 u64Computed; @@ -186,6 +188,7 @@ Return value: memset(uNonPawnCount, 0, sizeof(uNonPawnCount)); memset(bbPieces, 0, sizeof(bbPieces)); + memset(bbPawns, 0, sizeof(bbPawns)); u64Computed = ComputeSig(pos); if (pos->u64NonPawnSig != u64Computed) { @@ -268,6 +271,7 @@ Return value: } uPawnMaterial[u] += VALUE_PAWN; uPawnCount[u]++; + bbPawns[u] |= COOR_TO_BB(c); } } @@ -364,6 +368,12 @@ Return value: } } + if (pos->bbPawns[u] != bbPawns[u]) + { + uReason = 22; + goto end; + } + // // Note: the 0th spot in the array is the sum of all non pawns // |
