Files
StarForth/src/word_source
Robert Allan JamesandClaude Sonnet 5 70db955ac9 Fix M/MOD: hand-rolled 128/64 bit-serial division (FABRIC-3.md §XII.4)
mixed_math_word_m_slash_mod() had the identical bug class already fixed
in M* (commit 9a09949): it reconstructed the dividend from
`(dhigh << 32) | (dlow & 0xFFFFFFFF)`, the same wrong "32-bit halves of a
64-bit value" assumption. Latent for small inputs (fits in 32 bits, so the
reconstruction coincidentally worked), confirmed genuinely broken for a
true wide double -- feeding M*'s own correct 10^24 output into it gave a
quotient/remainder wrong by many orders of magnitude and the wrong sign.

Unlike M*, this one can't just switch to __int128 -- __int128's own `/`/`%`
need libgcc's __udivti3/__umodti3 for 128-bit division, unavailable in
this freestanding, -nostdlib build (the exact constraint
src/starkernel/arch/amd64/timer.c's own doc comment already flagged:
__int128 multiply/shift-by-constant/compare/subtract all compile clean,
only division doesn't). Fixed instead with a hand-rolled unsigned
128-by-64-bit bit-serial (restoring) long division -- 128 iterations of
shift-by-1/compare/subtract only, all in the safe set. Operates on
magnitudes via unsigned negation from 0 (well-defined even for the
extreme negative edge); signs reapplied afterward matching the same C99
truncating-toward-zero convention the previous, narrower implementation
already used, unchanged.

Verified: rebuilt all three architectures, confirmed clean link with no
__udivti3/__umodti3 undefined-symbol errors. Booted and tested all three,
identical results: 1000000000000 1000000000000 M* SWAP 1000000 M/MOD ->
1000000000000000000 remainder 0 (exact division, the case that was wrong
by orders of magnitude before); three sign-combination cases all correct
(-+, +-, --), confirming sign handling survived the magnitude-only
rewrite. T15 (original small-input case) unaffected. Full 24-case
exerciser reran clean on all three, no regressions.

All bugs found by the std79 exerciser campaign, including this one found
while fixing another, are now closed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXieurDfDSsDFdnSyusuWo
2026-09-11 10:28:34 -04:00
..

src/word_source/

FORTH-79 word implementations, one file per category, registered into the dictionary via include/word_registry.h. Each .c file here has a matching header in src/word_source/include/ and (for most categories) a matching test module in src/test_runner/modules/.

FORTH-79 core

  • arithmetic_words.c, mixed_arithmetic_words.c — + - * / MOD ABS MIN MAX and mixed-precision arithmetic.
  • stack_words.c — DUP DROP SWAP ROT OVER NIP TUCK.
  • control_words.c — IF ELSE THEN DO LOOP BEGIN UNTIL WHILE.
  • defining_words.c — : ; CREATE DOES> VARIABLE CONSTANT.
  • memory_words.c — @ ! C@ C! MOVE FILL.
  • return_stack_words.c — >R R> R@ RDROP 2>R 2R@ 2R>.
  • double_words.c — 2DUP 2DROP 2SWAP 2@ 2! D+ D-.
  • logical_words.c — AND OR XOR NOT INVERT LSHIFT RSHIFT.
  • io_words.c — EMIT KEY TYPE CR TAB SPACE ACCEPT.
  • string_words.c — S" SLITERAL and other string operations.
  • block_words.c — BLOCK BUFFER LOAD THRU FLUSH.
  • format_words.c — .( .R .S HEX DECIMAL BASE.
  • system_words.c — BYE ABORT INCLUDE STATE.
  • dictionary_words.c — FIND SEARCH-WORDLIST WORDS.
  • dictionary_manipulation_words.c — dictionary entry manipulation words.
  • vocabulary_words.c — VOCABULARY DEFINITIONS FORTH-WORDLIST.
  • editor_words.c — block editor words.
  • defer_words.c — DEFER/IS deferred-word mechanism, used by the Tripod message-dispatch shim (see tools/hermes_tripod_smoke.sh).

StarForth-specific extensions

  • q48_16_words.c, q48_words.c — Q48.16 fixed-point word bindings.
  • starforth_words.c — StarForth-specific extensions.
  • acl_words.c — word-level ACL system's FORTH-callable primitives (see docs/03-architecture/word-acl/).
  • lifecycle_words_hosted.c — hosted-build VM lifecycle words (birth/run primitives on the hosted side; kernel-only primitives live in src/starkernel/capsule/mama_forth_words.c).
  • log_words.c — FORTH-callable logging primitives.
  • inference_words.c — FORTH-callable bindings for the statistical inference engine (Loops #5/#6).
  • physics_benchmark_words.c — benchmark harness for the 7 physics feedback loops.
  • physics_diagnostic_words.c — physics diagnostics (WORD-ENTROPY).
  • physics_freeze_words.c — PHYSICS-FREEZE / PHYSICS-THAW.
  • physics_pipelining_diagnostic_words.c — Loop #4 pipelining diagnostics.
  • dictionary_heat_diagnostic_words.c — Loop #1 heat diagnostics.

See src/word_source/include/ for the matching headers (also includes mama_forth_words.h, whose .c implementation lives under src/starkernel/capsule/ since it's kernel-only).