<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>boot2, branch HEAD</title>
<subtitle>Playing with the boostrap
</subtitle>
<entry>
<id>354384eae6863bd903d5ea4ed4511c54e11636b4</id>
<published>2026-04-25T10:03:52Z</published>
<updated>2026-04-25T10:03:52Z</updated>
<title>Refactor scheme1.P1pp: use tag idioms, lexer helpers, %die, %alignup</title>
<link rel="alternate" type="text/html" href="commit/354384eae6863bd903d5ea4ed4511c54e11636b4.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 354384eae6863bd903d5ea4ed4511c54e11636b4
parent 925240dd23966009f0b742a6199d87f1661e79fa
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Sat, 25 Apr 2026 03:03:52 -0700

Refactor scheme1.P1pp: use tag idioms, lexer helpers, %die, %alignup

The tag-idiom macros (%car, %cdr, %tagof, %hdr_type, %mkfix,
%untag_fix, %untag_sym) were defined but unused -- every call site
inlined the underlying instruction. Now the file routes every tag
operation through them so the layout is documented in one place.

Adds scheme1-local helpers and uses them at the obvious sites:
  %readbuf_byte    -- load one byte at readbuf_buf[off] (skip_ws,
                      parse_one, parse_list, parse_atom scan loop)
  %is_ws_branch    -- 4-way ASCII whitespace check (same callers)
  %symtab_entry    -- base + idx*SYMENT.SIZE (intern, sym_global,
                      sym_set_global)
  %die(msg, code)  -- print_cstr + sys_exit, replacing seven copies
                      of the same la/call/li/call/spin block

Adds a generic %alignup(rd, rs, align, scratch) to libp1pp; uses it
in p1_main&#39;s heap_next setup and alloc_hdr. Drops the dead ::spin
labels after %die-style sys_exit calls (sys_exit doesn&#39;t return).
parse_one&#39;s frame is 0 since the body never touches sp slots.

Bumps M1PP_MACRO_BODY_CAP from 0x18000 to 0x30000: the new helper
macros plus the larger amd64 backend pushed the body-token pool
past the old cap.

Notes:
- parse_atom&#39;s first-byte dispatch keeps the inline la/ld/add/lb
  sequence; routing it through %readbuf_byte caused the apply
  dispatch to read a non-PRIM value on aarch64 in a way I haven&#39;t
  fully diagnosed.
- amd64 and riscv64 still fail tests/scheme1/00-exit with &quot;not a
  procedure&quot; -- pre-existing on the baseline, unchanged here.

</content>
</entry>
<entry>
<id>925240dd23966009f0b742a6199d87f1661e79fa</id>
<published>2026-04-25T10:03:32Z</published>
<updated>2026-04-25T10:03:32Z</updated>
<title>Add scheme1 phase-1 interpreter spine and test runner</title>
<link rel="alternate" type="text/html" href="commit/925240dd23966009f0b742a6199d87f1661e79fa.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 925240dd23966009f0b742a6199d87f1661e79fa
parent 6ce02250c5f5982da088c191b4da1ac0ce6a4958
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Sat, 25 Apr 2026 03:03:32 -0700

Add scheme1 phase-1 interpreter spine and test runner

Tag-dispatched eval/apply over a bump heap, linear-scan symbol intern
table, and a single sys-exit primitive. Adds a scheme1 Make target,
.P1pp build pipeline support in boot-build-p1pp.sh, and a scheme1
suite in run-tests.sh that diffs stdout and exit code against
.expected / .expected-exit fixtures.

Also bumps the m1pp INPUT/OUTPUT/TEXT caps so combined.M1pp inputs
that include libp1pp + scheme1 fit through the expander.

</content>
</entry>
<entry>
<id>6ce02250c5f5982da088c191b4da1ac0ce6a4958</id>
<published>2026-04-25T03:39:45Z</published>
<updated>2026-04-25T03:39:45Z</updated>
<title>Refactor M1pp.P1 boilerplate: BSS init loop, lex helper, char-class table</title>
<link rel="alternate" type="text/html" href="commit/6ce02250c5f5982da088c191b4da1ac0ce6a4958.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 6ce02250c5f5982da088c191b4da1ac0ce6a4958
parent d87400a1c88fefd1ead7b3d84d9a7a03f3f276c9
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 20:39:45 -0700

Refactor M1pp.P1 boilerplate: BSS init loop, lex helper, char-class table

Four independent simplifications, 57 lines net:
- p1_main&#39;s BSS pointer-slot init is now a table walk over bss_init_tbl
  instead of 16 unrolled 4-line blocks.
- The five single-char lex blocks (lex_lparen/rparen/comma/lbrace/rbrace)
  share a new lex_punct1 helper; each block is now 4 lines.
- lex_loop and lex_word_scan dispatch via a 256-byte lex_char_class table
  in rodata, collapsing two linear char-comparison ladders.
- err_* stubs drop their explicit message length; fatal computes it via
  an inline strlen loop, and msg_* strings are NUL-terminated.

Adds ZERO4 and :lex_punct_kind. P1 backend tables regenerated by the
prune step pick up a handful of new register/offset combos.

</content>
</entry>
<entry>
<id>d87400a1c88fefd1ead7b3d84d9a7a03f3f276c9</id>
<published>2026-04-25T01:20:20Z</published>
<updated>2026-04-25T01:20:20Z</updated>
<title>Move M1pp.P1&#39;s BSS-style buffers past ELF_end; bump ph_memsz to 8MB</title>
<link rel="alternate" type="text/html" href="commit/d87400a1c88fefd1ead7b3d84d9a7a03f3f276c9.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit d87400a1c88fefd1ead7b3d84d9a7a03f3f276c9
parent 1a73629687b8843765b1ef6a00e4ee8a6cec6843
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 18:20:20 -0700

Move M1pp.P1&#39;s BSS-style buffers past ELF_end; bump ph_memsz to 8MB

Previously M1pp/M1pp.P1 reserved its working buffers (input_buf,
output_buf, source_tokens, macros, expand_pool, ...) inline as ZERO32
padding inside the file. Each `ZERO32` token expanded into M0&#39;s output
as a 66-char `&#39;00...00&#39;` quoted literal, so the 133,784 ZERO32 tokens
ballooned prog.hex2 to 8.9 MB even though the actual program code is
only ~38 KB. hex2-0 then had to walk that 8.9 MB of zeros byte by byte;
under qemu-x86_64-static on Apple Silicon that took many minutes.

Refactor:

* All 16 ZERO32-using buffers move to BSS past ELF_end. Each gets an
  OFF_&lt;name&gt; DEFINE (offset from ELF_end) and an 8-byte pointer slot
  (input_buf_ptr, output_buf_ptr, ...). p1_main initializes every slot
  once at startup as ELF_end + OFF_&lt;name&gt;.

* All 72 `la_&lt;reg&gt; &amp;&lt;buf&gt;` references rewritten to the cached-pointer
  pattern: `la_&lt;reg&gt; &amp;&lt;buf&gt;_ptr` then `ld_&lt;reg&gt;,&lt;reg&gt;,0`. Same dest reg
  for both ops — no scratch register needed, no clobbering of caller
  state.

* vendor/seed/{aarch64,amd64,riscv64}/ELF.hex2: ph_memsz hardcoded to
  8 MB (0x800000). The kernel zero-fills the gap between ph_filesz and
  ph_memsz at load, so the BSS is free.

scripts/refactor-m1pp-bss.py drove the source-level transform; kept in
the tree for reference.

Numbers (aarch64 m1pp build):

* M1pp.P1:   22931 -&gt; 6382 lines  (-72%)
* prog.hex2: 8.9 MB -&gt; 97 KB      (-99%)
* m1pp ELF:  4.3 MB -&gt; 38 KB      (-99%)

Build times (clean):

* aarch64 m1pp: ~5s  (was ~12s)
* amd64 m1pp:   ~15s (was many minutes / never finished)
* full `make test` across all 3 arches: 29s, 75/75 pass.

</content>
</entry>
<entry>
<id>1a73629687b8843765b1ef6a00e4ee8a6cec6843</id>
<published>2026-04-25T01:02:46Z</published>
<updated>2026-04-25T01:02:46Z</updated>
<title>Drop parens on zero-arg macro calls</title>
<link rel="alternate" type="text/html" href="commit/1a73629687b8843765b1ef6a00e4ee8a6cec6843.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 1a73629687b8843765b1ef6a00e4ee8a6cec6843
parent 6f73803c2215ca80eee97a3c0c85d1238d6113a1
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 18:02:46 -0700

Drop parens on zero-arg macro calls

M1pp accepts `%name` as a parenless invocation of any zero-parameter
macro (test 13-parenless covers the contract). Adopt that style across
P1 source: control-flow ops (`%ret`, `%eret`, `%syscall`), syscall-
number macros (`%sys_write`, `%p1_sys_*`), backend-internal helpers
(`%amd_cqo`, `%aa64_ret`, `%rv_ecall`, ...), and paste-dispatch sites
(`%amd_reg_##r`, `%rv_is_sp_##r`, ...). Macro definition headers stay
paren&#39;d — the header parser still requires `%macro NAME(...)`.

</content>
</entry>
<entry>
<id>6f73803c2215ca80eee97a3c0c85d1238d6113a1</id>
<published>2026-04-25T00:52:57Z</published>
<updated>2026-04-25T00:52:57Z</updated>
<title>rm post, moved to site</title>
<link rel="alternate" type="text/html" href="commit/6f73803c2215ca80eee97a3c0c85d1238d6113a1.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 6f73803c2215ca80eee97a3c0c85d1238d6113a1
parent 5d78449f72b14b1a16ce75235d12da6c4e14d1c5
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 17:52:57 -0700

rm post, moved to site

</content>
</entry>
<entry>
<id>5d78449f72b14b1a16ce75235d12da6c4e14d1c5</id>
<published>2026-04-25T00:52:49Z</published>
<updated>2026-04-25T00:52:49Z</updated>
<title>P1.LI: take immediate as a macro arg</title>
<link rel="alternate" type="text/html" href="commit/5d78449f72b14b1a16ce75235d12da6c4e14d1c5.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 5d78449f72b14b1a16ce75235d12da6c4e14d1c5
parent 2216e63bcd1f8209385688b28c0547a4cf370dff
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 17:52:49 -0700

P1.LI: take immediate as a macro arg

Make the front-end `%li(rd, imm)` symmetric with `%la(rd, target)` and
`%addi(rd, ra, imm)`. The backend `p1_li(rd, imm)` now owns both the
opcode prefix and the literal-pool word, so portable source no longer
encodes the literal width inline.

Syscall-number macros (`p1_sys_*`) return integer atoms instead of raw
8-byte emissions so they compose through M1pp&#39;s expression evaluator
inside `%li(a0, %sys_write())`.

</content>
</entry>
<entry>
<id>2216e63bcd1f8209385688b28c0547a4cf370dff</id>
<published>2026-04-25T00:32:50Z</published>
<updated>2026-04-25T00:32:50Z</updated>
<title>M1pp.P1 correct tokens end</title>
<link rel="alternate" type="text/html" href="commit/2216e63bcd1f8209385688b28c0547a4cf370dff.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 2216e63bcd1f8209385688b28c0547a4cf370dff
parent 22ad7bf0fac945c332a1f325cd292508bedb4953
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 17:32:50 -0700

M1pp.P1 correct tokens end

</content>
</entry>
<entry>
<id>22ad7bf0fac945c332a1f325cd292508bedb4953</id>
<published>2026-04-25T00:05:32Z</published>
<updated>2026-04-25T00:05:32Z</updated>
<title>Pass ARCH via env, drop arg-list noise from script invocations</title>
<link rel="alternate" type="text/html" href="commit/22ad7bf0fac945c332a1f325cd292508bedb4953.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 22ad7bf0fac945c332a1f325cd292508bedb4953
parent 5757513857ba4807e5642573a662659b4a4ad398
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 17:05:32 -0700

Pass ARCH via env, drop arg-list noise from script invocations

Every script in scripts/ now reads ARCH from its environment and derives
the per-arch fixed paths (P1/P1-$ARCH.M1, vendor/seed/$ARCH/ELF.hex2,
build/$ARCH/tools/, build/$ARCH/m1pp, build/$ARCH/.work/$NAME) from
that. Only the variable per-call inputs (source, output) are passed
positionally.

Make&#39;s PODMAN macro now adds `-e ARCH=$(1)`, so any boot-* script
invoked through it sees the arch automatically. Lint runs `ARCH=$* sh
scripts/lint.sh &lt;src&gt;` from the recipe.

Concretely:
  boot1.sh             ARCH only       (was &lt;arch&gt; &lt;out-dir&gt;)
  boot2.sh             ARCH only       (already)
  boot-build-p1.sh     ARCH + src out  (was 6 positional args)
  boot-build-p1pp.sh   ARCH + src out  (was 8 positional args)
  lint.sh              ARCH + src(s)   (was &lt;table&gt; &lt;src&gt;...)
  run-tests.sh         passes ARCH=    via container env to boot-* calls

Make rule recipes go from multi-line continuations to single calls:
  $(call PODMAN,$*) sh scripts/boot-build-p1.sh M1pp/M1pp.P1 $@

Verified: make all + make hello + make run print &quot;Hello, World!&quot;; aarch64
m1pp suite 20/20 in ~6s.

</content>
</entry>
<entry>
<id>5757513857ba4807e5642573a662659b4a4ad398</id>
<published>2026-04-24T23:57:08Z</published>
<updated>2026-04-24T23:57:08Z</updated>
<title>Push container builds onto tmpfs; restructure scripts/ around boot-* convention</title>
<link rel="alternate" type="text/html" href="commit/5757513857ba4807e5642573a662659b4a4ad398.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 5757513857ba4807e5642573a662659b4a4ad398
parent 56dfcbf7c27c97396b11fa3e71bee8d9a03a6eed
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 16:57:08 -0700

Push container builds onto tmpfs; restructure scripts/ around boot-* convention

* Convention: every script invoked via `podman run` is named boot*.sh.
  Rename scripts/bootstrap.sh -&gt; scripts/boot1.sh; new scripts/boot2.sh
  builds M1pp + pokem inside the container; scripts/boot-build-p1.sh and
  scripts/boot-build-p1pp.sh are the generic in-container builders called
  by Make for individual programs and test fixtures.
* Make becomes the single source of truth for build dependencies. The old
  host-side dispatchers scripts/build-p1.sh and scripts/build-p1pp.sh are
  gone; their work now lives in boot-build-p1.sh / boot-build-p1pp.sh, and
  Make rules wrap them with `podman run ... sh scripts/boot-*.sh ARGS` —
  no inline shell.
* /tmp inside the container is now a real RAM tmpfs (--tmpfs /tmp:size=512M).
  Previously /tmp fell through to the container overlay, still backed by
  virtiofs on Apple Silicon, so the stage0 tools&#39; per-byte fputc/fgetc
  paid a virtiofs round-trip per byte. Real RAM tmpfs cuts a clean m1pp
  build ~3s and is propagated to all podman invocations (Make + run-tests).
* boot1.sh stages its hex0/hex1/hex2-0/catm/M0 chain entirely through /tmp
  and copies the final tools to the bind mount at the end; intermediates
  never touch virtiofs.
* Pre-prune the per-arch P1 backend tables once, check in the result.
  scripts/prune-p1-table.sh emits P1/P1-&lt;arch&gt;.M1 from the full generated
  table (now at build/p1/&lt;arch&gt;.M1) keeping only the DEFINEs referenced by
  M1pp/M1pp.P1, pokem/pokem.P1, and tests/M1pp/*.M1. Routine builds skip
  the per-build prune; `make tables` regenerates after editing P1/gen/*.py
  or the prune-source set.
* Drop the ELF p_filesz trim. The kernel zero-fills BSS at load time, so
  the trailing zero padding in raw hex2-0 output is wasted bytes on disk
  but functionally identical at exec.
* Drop NATIVE=1 mode. The bootstrap chain is now the only path; the host
  native tools (build-native-tools.sh / `make tools-native`) are kept as
  an opt-in helper but no longer wired into any default rule.

Verified: make all + make hello + make run print &quot;Hello, World!&quot;; the
aarch64 m1pp suite passes 20/20 in ~5s. Cross-arch m1pp builds run under
qemu-user emulation and are slow but correct (per-byte syscalls × qemu
overhead). The .P1pp suite still hits the known self-hosted m1pp buffer
overflow on the combined backend+frontend+source — to be fixed by bumping
M1pp_*_CAP constants in M1pp/M1pp.P1.

</content>
</entry>
<entry>
<id>56dfcbf7c27c97396b11fa3e71bee8d9a03a6eed</id>
<published>2026-04-24T23:04:52Z</published>
<updated>2026-04-24T23:04:52Z</updated>
<title>Drop &quot;v2&quot; from P1 naming everywhere</title>
<link rel="alternate" type="text/html" href="commit/56dfcbf7c27c97396b11fa3e71bee8d9a03a6eed.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 56dfcbf7c27c97396b11fa3e71bee8d9a03a6eed
parent ccb69f1c9fcd1e3b5222653b3ba3255ba05efc79
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 16:04:52 -0700

Drop &quot;v2&quot; from P1 naming everywhere

The &quot;v2&quot; suffix was a transitional label from the P1 redesign and no
longer needs distinguishing. Replace P1v2 / P1 v2 / P1v2-{32,64} with
P1 / P1-{32,64} in docs, comments, and source headers. Rename the
generated-table build path build/p1v2/ -&gt; build/p1/, and the docs/P1v2.md
references that already point at docs/P1.md.

</content>
</entry>
<entry>
<id>ccb69f1c9fcd1e3b5222653b3ba3255ba05efc79</id>
<published>2026-04-24T22:58:07Z</published>
<updated>2026-04-24T22:58:07Z</updated>
<title>Restructure build into scripts/, vendor seeds, unify ARCH paths</title>
<link rel="alternate" type="text/html" href="commit/ccb69f1c9fcd1e3b5222653b3ba3255ba05efc79.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit ccb69f1c9fcd1e3b5222653b3ba3255ba05efc79
parent ffe72f13e339e8411d89985ad324f01a6483a4e6
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 15:58:07 -0700

Restructure build into scripts/, vendor seeds, unify ARCH paths

* Move build helpers into scripts/: bootstrap.sh, build-p1.sh,
  build-p1pp.sh, build-native-tools.sh, lint.sh, run-tests.sh, plus
  Containerfile.busybox. Drop the per-suite m1pp/test.sh, m1pp/build*.sh
  and tests/p1/test.sh runners.
* Vendor stage0-posix seed sources into vendor/seed/&lt;arch&gt;/. The chain
  no longer needs a sibling live-bootstrap checkout; populate-upstream.sh
  is gone.
* Switch every podman invocation to one per-arch boot2-busybox:&lt;arch&gt;
  image (busybox:musl base, built from scripts/Containerfile.busybox).
  Drop the alpine pin and the obsolete amd64 PF_X-&gt;PF_R hex0-seed patch.
* Single unified test runner scripts/run-tests.sh with --suite/--arch;
  m1pp and p1 suites both fan out across all three arches.
* Every program (m1pp, pokem, hello) and every test path drives off a
  single ARCH= (default aarch64); the lone aarch64 specialisation left
  is the host-side tools-native target.
* Rename p1-&gt;P1, m1pp-&gt;M1pp, tests/{p1,m1pp}-&gt;tests/{P1,M1pp},
  p1pp.P1pp-&gt;P1pp.P1pp, m1pp.{c,P1}-&gt;M1pp.{c,P1}; py generators move
  into P1/gen/. Repo rebrand lispcc-&gt;boot2.
* Drop tests/{hello,demo}.M1 (pre-rename register names); the make hello
  showcase now points at tests/M1pp/00-hello.M1.

Verified: 60 m1pp + 15 p1 tests pass on aarch64/amd64/riscv64.

</content>
</entry>
<entry>
<id>ffe72f13e339e8411d89985ad324f01a6483a4e6</id>
<published>2026-04-24T22:54:38Z</published>
<updated>2026-04-24T22:54:38Z</updated>
<title>Add amd64 / riscv64 P1v2 generators; explicit ARCHES wiring</title>
<link rel="alternate" type="text/html" href="commit/ffe72f13e339e8411d89985ad324f01a6483a4e6.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit ffe72f13e339e8411d89985ad324f01a6483a4e6
parent d7398ef3945e0d7f61cc44a36a2cb86a7ab47093
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 15:54:38 -0700

Add amd64 / riscv64 P1v2 generators; explicit ARCHES wiring

Mirrors p1/gen/aarch64.py; each backend encodes the same byte
sequences as its p1/P1-&lt;arch&gt;.M1pp counterpart.

Drop the ARCH_REGISTRY indirection in common.py. Each arch module now
exposes ARCH = ArchDef(...); p1_gen.py builds an explicit ARCHES dict.

</content>
</entry>
<entry>
<id>d7398ef3945e0d7f61cc44a36a2cb86a7ab47093</id>
<published>2026-04-24T22:25:46Z</published>
<updated>2026-04-24T22:25:46Z</updated>
<title>Add readme</title>
<link rel="alternate" type="text/html" href="commit/d7398ef3945e0d7f61cc44a36a2cb86a7ab47093.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit d7398ef3945e0d7f61cc44a36a2cb86a7ab47093
parent 56144e7b4c2059d04a00c2c87f8f8423f3ba2c1b
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 15:25:46 -0700

Add readme

</content>
</entry>
<entry>
<id>56144e7b4c2059d04a00c2c87f8f8423f3ba2c1b</id>
<published>2026-04-24T22:17:00Z</published>
<updated>2026-04-24T22:17:00Z</updated>
<title>rm old P1 lisp</title>
<link rel="alternate" type="text/html" href="commit/56144e7b4c2059d04a00c2c87f8f8423f3ba2c1b.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 56144e7b4c2059d04a00c2c87f8f8423f3ba2c1b
parent 7e769ab87300ff635a3aaf9227db798f9a642ad6
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 15:17:00 -0700

rm old P1 lisp

</content>
</entry>
<entry>
<id>7e769ab87300ff635a3aaf9227db798f9a642ad6</id>
<published>2026-04-24T22:03:38Z</published>
<updated>2026-04-24T22:03:38Z</updated>
<title>Simplify P1-amd64.M1pp helpers; drop native reg tables from P1.md</title>
<link rel="alternate" type="text/html" href="commit/7e769ab87300ff635a3aaf9227db798f9a642ad6.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 7e769ab87300ff635a3aaf9227db798f9a642ad6
parent b024f5b4fca4986de572255327cb70230dd51001
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 15:03:38 -0700

Simplify P1-amd64.M1pp helpers; drop native reg tables from P1.md

Introduces `amd_maybe_rex_b` to collapse the _lo/_hi/dispatch triplets
on push/pop/jmp_r/call_r/mov_imm32_prefix, and a per-name `amd_is_sp`
predicate to collapse the 48-macro per-(op,base) `p1_mem` fan-out into
a single dispatcher. Native register assignment is unchanged (still
C-ABI-aligned for args 0-3).

Also removes the per-arch native register mapping tables from
docs/P1.md — the P1↔native mapping is backend-internal and was
creating the illusion of a portable contract. Target-notes bullets
generalized accordingly.

</content>
</entry>
<entry>
<id>b024f5b4fca4986de572255327cb70230dd51001</id>
<published>2026-04-24T20:33:54Z</published>
<updated>2026-04-24T20:33:54Z</updated>
<title>Fold LA_BR into branch/call/tail at P1.M1pp layer</title>
<link rel="alternate" type="text/html" href="commit/b024f5b4fca4986de572255327cb70230dd51001.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit b024f5b4fca4986de572255327cb70230dd51001
parent 13564bfed1d3e4f66117aeaf9a24138c72696475
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 13:33:54 -0700

Fold LA_BR into branch/call/tail at P1.M1pp layer

The portable P1 spec keeps LA_BR explicit because it makes the
target-materialization step uniform across backends. The P1.M1pp
ergonomic layer doesn&#39;t owe users that uniformity, so collapse the
two-step &quot;load branch target / consume&quot; pattern into single macros
that take the label as an argument:

  %b(target), %call(target), %tail(target)
  %beq(ra, rb, target), %bne, %blt, %bltu
  %beqz(ra, target), %bnez, %bltz
  %la(rd, target)

%la_br is gone from the user-facing surface; backend hooks
(%p1_labr, %p1_b, %p1_call, %p1_condb, %p1_tail) are unchanged.
Output binaries are byte-identical for every test fixture on every
backend.

</content>
</entry>
<entry>
<id>13564bfed1d3e4f66117aeaf9a24138c72696475</id>
<published>2026-04-24T19:06:51Z</published>
<updated>2026-04-24T19:06:51Z</updated>
<title>Add libp1pp v1 utility library (p1/p1pp.P1pp)</title>
<link rel="alternate" type="text/html" href="commit/13564bfed1d3e4f66117aeaf9a24138c72696475.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 13564bfed1d3e4f66117aeaf9a24138c72696475
parent 455667f35b962f3ef09f2aa17490c4afc458fc6b
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 12:06:51 -0700

Add libp1pp v1 utility library (p1/p1pp.P1pp)

Implements the contract from docs/LIBP1PP.md: control-flow macros
(%if_/ifelse_/while_/do_while_/for_lt/loop plus tagged variants with
%break/%continue), %fn function-definer using M1PP scopes, %assert_
macros, and C-level primitives for bytes/strings/ints, character
predicates, raw syscalls, print helpers, file helpers, bump allocator,
and panic. Targets P1v2-64 only. Verified with smoke tests on
aarch64, amd64, and riscv64.

</content>
</entry>
<entry>
<id>455667f35b962f3ef09f2aa17490c4afc458fc6b</id>
<published>2026-04-24T19:06:44Z</published>
<updated>2026-04-24T19:06:44Z</updated>
<title>Bump M1PP macro cap from 256 to 512</title>
<link rel="alternate" type="text/html" href="commit/455667f35b962f3ef09f2aa17490c4afc458fc6b.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 455667f35b962f3ef09f2aa17490c4afc458fc6b
parent e2b9951654ab6ba3250b936f286753bb0ca5e274
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 12:06:44 -0700

Bump M1PP macro cap from 256 to 512

Raise MAX_MACROS in the host C expander and M1PP_MACROS_CAP in the
self-hosted m1pp.P1 (byte cap doubled to 0x25000 for 512 × 296-byte
records). amd64 backend + P1 frontend + libp1pp together exceed 256.

</content>
</entry>
<entry>
<id>e2b9951654ab6ba3250b936f286753bb0ca5e274</id>
<published>2026-04-24T18:56:04Z</published>
<updated>2026-04-24T18:56:04Z</updated>
<title>Add %scope / %endscope and :: label rewrite to M1PP</title>
<link rel="alternate" type="text/html" href="commit/e2b9951654ab6ba3250b936f286753bb0ca5e274.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit e2b9951654ab6ba3250b936f286753bb0ca5e274
parent 87e3956d3b23b7ef1e537e75fc304782bd3df6bb
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 11:56:04 -0700

Add %scope / %endscope and :: label rewrite to M1PP

A lexical scope stack driven by `%scope NAME` / `%endscope`. A WORD
token starting with `::` emits as `:scope1__..__scopeN__name` at output
time; `&amp;::name` emits the reference form. With an empty stack the
sigil+name passes through. Resolution is emit-time, so `::foo` inside a
macro body resolves against the caller&#39;s scope — making generic
`%break()` / `%continue()` possible.

Implemented in both `m1pp/m1pp.c` (reference) and `m1pp/m1pp.P1`
(self-hosted). New tests/m1pp/17-scopes covers empty-stack pass-through,
nested scopes, scope name from a macro argument, anaphoric break /
continue, innermost-wins for nested scope-introducing macros, and
`:@` + `::` coexisting in one macro.

Also extend p1_gen.py MEM_OFFS with small positive offsets (2–6) so the
scope check can use `lb_*,*,2` directly; regenerated
`build/p1v2/aarch64/p1_aarch64.M1` (gitignored).

Doc: new Scoped labels section in docs/M1PP.md, updated Directives,
Limits, and Errors. docs/LIBP1PP.md&#39;s %fn / tagged-loop entries
rewritten to reflect scopes being available.

Also scrubs pre-existing phasing / section-number comments (Phase N,
§N, M1PP-EXT) from m1pp.P1 and every tests/m1pp fixture, for a cleaner
description of current behavior.

</content>
</entry>
<entry>
<id>87e3956d3b23b7ef1e537e75fc304782bd3df6bb</id>
<published>2026-04-24T18:11:17Z</published>
<updated>2026-04-24T18:11:17Z</updated>
<title>LIBP1PP.md</title>
<link rel="alternate" type="text/html" href="commit/87e3956d3b23b7ef1e537e75fc304782bd3df6bb.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 87e3956d3b23b7ef1e537e75fc304782bd3df6bb
parent ff0fd1204fcb984c90ec5ba308bef63a3d04d76a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 11:11:17 -0700

LIBP1PP.md

</content>
</entry>
<entry>
<id>ff0fd1204fcb984c90ec5ba308bef63a3d04d76a</id>
<published>2026-04-24T17:41:05Z</published>
<updated>2026-04-24T17:41:05Z</updated>
<title>Rename .M1→.P1 and .P1→.P1pp to reflect toolchain level</title>
<link rel="alternate" type="text/html" href="commit/ff0fd1204fcb984c90ec5ba308bef63a3d04d76a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit ff0fd1204fcb984c90ec5ba308bef63a3d04d76a
parent 5bb6a0ab4ea4e61516278f007bc52516f074d154
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 10:41:05 -0700

Rename .M1→.P1 and .P1→.P1pp to reflect toolchain level

.P1  — hand-written M1 following P1v2 ABI; consumed by M0 directly
       after the p1_arch.M1 DEFINE table is prepended (no m1pp needed).
.P1pp — P1 source using M1PP macros (%li, %syscall, …); consumed by
        m1pp with P1 backend prepended, then M0.

m1pp/m1pp.M1  → m1pp/m1pp.P1
pokem/pokem.M1 → pokem/pokem.P1
tests/p1/*.P1  → tests/p1/*.P1pp

Update build.sh, build-p1.sh, test.sh (m1pp/ and tests/p1/), and
Makefile comment to use the new extensions.

</content>
</entry>
<entry>
<id>5bb6a0ab4ea4e61516278f007bc52516f074d154</id>
<published>2026-04-24T17:23:09Z</published>
<updated>2026-04-24T17:23:09Z</updated>
<title>Port m1pp/pokem to p1_main and emit :_start from p1_gen.py</title>
<link rel="alternate" type="text/html" href="commit/5bb6a0ab4ea4e61516278f007bc52516f074d154.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 5bb6a0ab4ea4e61516278f007bc52516f074d154
parent 5c810d428f71b2b544e9fa4eb524eae88c838895
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 10:23:09 -0700

Port m1pp/pokem to p1_main and emit :_start from p1_gen.py

The P1v2 program-entry model (docs/P1.md §Program Entry) has a
backend-owned :_start stub call p1_main with a0=argc, a1=argv. The
m1pp-driven path already did this via p1/P1-aarch64.M1pp&#39;s p1_entry
macro; the raw-M1 path going through build/p1v2/aarch64/p1_aarch64.M1
still had each program define its own :_start and read argv by
leaning on the portable sp+16 bias.

Emit the aarch64 :_start stub from p1/p1_gen.py (via a new start_stub
field on ArchDef), and convert m1pp.M1, pokem.M1, and the 00-hello
smoke fixture to define :p1_main instead.

</content>
</entry>
<entry>
<id>5c810d428f71b2b544e9fa4eb524eae88c838895</id>
<published>2026-04-24T16:51:49Z</published>
<updated>2026-04-24T16:51:49Z</updated>
<title>Add pokem, a P1 raw-byte file patcher</title>
<link rel="alternate" type="text/html" href="commit/5c810d428f71b2b544e9fa4eb524eae88c838895.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 5c810d428f71b2b544e9fa4eb524eae88c838895
parent 30273099f630eb2e8f787c413fc863ad2e44edfa
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 09:51:49 -0700

Add pokem, a P1 raw-byte file patcher

pokem overlays ASCII-hex-decoded bytes onto a file at a given decimal
offset. The primary use case is patching ELF header fields after
assembly — e.g. bumping p_memsz to reserve a BSS region without
emitting literal zero bytes in the source.

Implementation notes:
- Single fd with O_RDWR; advances position via read-into-scratch, then
  writes in place. No in-memory file buffer, so pokem itself is ~1.8 KB
  and handles files of any size.
- Bootstrap-tool posture: no input validation, no syscall error
  checking. Branchless hex_nibble decode via (c &amp; 15) + 9 * (c &gt;&gt; 6)
  inlined into parse_hex_bytes, which is a leaf with no BSS spill.
- Only uses the P1 common syscall surface (openat, read, write, close,
  exit).

</content>
</entry>
<entry>
<id>30273099f630eb2e8f787c413fc863ad2e44edfa</id>
<published>2026-04-24T16:03:03Z</published>
<updated>2026-04-24T16:03:03Z</updated>
<title>Hide P1 frame header and merge LEAVE+RET into ERET</title>
<link rel="alternate" type="text/html" href="commit/30273099f630eb2e8f787c413fc863ad2e44edfa.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 30273099f630eb2e8f787c413fc863ad2e44edfa
parent d19a402ecc3df0f912aecf4ec2a8d400f26c5f05
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 09:03:03 -0700

Hide P1 frame header and merge LEAVE+RET into ERET

Portable sp after ENTER points to the frame-local base; the saved
retaddr and saved caller sp become backend-private. LEAVE is dropped
as a standalone op — ERET atomically tears down the frame and returns,
mirroring TAIL/TAILR which already bundle the epilogue. Leaves still
return with bare RET.

</content>
</entry>
<entry>
<id>d19a402ecc3df0f912aecf4ec2a8d400f26c5f05</id>
<published>2026-04-24T15:09:38Z</published>
<updated>2026-04-24T15:09:38Z</updated>
<title>Expand post with missing m1pp/P1 features and P1 source examples</title>
<link rel="alternate" type="text/html" href="commit/d19a402ecc3df0f912aecf4ec2a8d400f26c5f05.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit d19a402ecc3df0f912aecf4ec2a8d400f26c5f05
parent 4eba962ec4bb1f6874f10d0ebd5f62371b1a1b7a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 08:09:38 -0700

Expand post with missing m1pp/P1 features and P1 source examples

Adds bullets for %struct/%enum, local labels, and %str in the m1pp
section; a program-entry paragraph in the P1 section; and a new
&#39;Three programs&#39; section walking through argc_exit, hello, and double
with their source inlined.

</content>
</entry>
<entry>
<id>4eba962ec4bb1f6874f10d0ebd5f62371b1a1b7a</id>
<published>2026-04-24T15:09:32Z</published>
<updated>2026-04-24T15:09:32Z</updated>
<title>Add argc_exit and double P1 test fixtures</title>
<link rel="alternate" type="text/html" href="commit/4eba962ec4bb1f6874f10d0ebd5f62371b1a1b7a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 4eba962ec4bb1f6874f10d0ebd5f62371b1a1b7a
parent bf0cbf2005df3b5c84d48c4efa206567563dfa3a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 08:09:32 -0700

Add argc_exit and double P1 test fixtures

argc_exit: bare %ret() returns argc as the process exit status via
the backend entry stub.

double: calls a :double helper through LA_BR + CALL with an ENTER/LEAVE
frame in p1_main, exercising the non-leaf path the spec now requires.

</content>
</entry>
<entry>
<id>bf0cbf2005df3b5c84d48c4efa206567563dfa3a</id>
<published>2026-04-24T15:09:27Z</published>
<updated>2026-04-24T15:09:27Z</updated>
<title>Require active frame for CALL/CALLR in P1 spec</title>
<link rel="alternate" type="text/html" href="commit/bf0cbf2005df3b5c84d48c4efa206567563dfa3a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit bf0cbf2005df3b5c84d48c4efa206567563dfa3a
parent aa0c83900e7fb42f42a0361f46597e9bc5aabbaf
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 08:09:27 -0700

Require active frame for CALL/CALLR in P1 spec

Previously the spec said call/return correctness didn&#39;t depend on a
frame, but the aarch64 and riscv64 backends both lower CALL to a bare
BLR/JALR that clobbers the native link register. A non-leaf caller
without a frame would infinite-loop on RET.

Tighten the contract: any function that issues CALL, CALLR, TAIL, or
TAILR must ENTER a standard frame first. Pure leaves may still omit the
frame. Existing backends are already correct under the new wording.

</content>
</entry>
<entry>
<id>aa0c83900e7fb42f42a0361f46597e9bc5aabbaf</id>
<published>2026-04-24T14:54:52Z</published>
<updated>2026-04-24T14:54:52Z</updated>
<title>Add riscv64 and amd64 P1v2 backends with multi-arch test harness</title>
<link rel="alternate" type="text/html" href="commit/aa0c83900e7fb42f42a0361f46597e9bc5aabbaf.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit aa0c83900e7fb42f42a0361f46597e9bc5aabbaf
parent a570d90096e6f998b88f626c4ea05d870e80e84f
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 07:54:52 -0700

Add riscv64 and amd64 P1v2 backends with multi-arch test harness

- p1/P1-riscv64.M1pp, p1/P1-amd64.M1pp: new M1pp-form P1v2 backends
  mirroring p1/P1-aarch64.M1pp. Native register picks follow docs/P1.md&#39;s
  64-bit mapping table. rv64 lowers every op to a single R/I/S-type
  instruction or a source-before-destination sequence, so no aliasing
  hazards are possible. amd64 handles variable-length encoding (REX,
  ModRM, SIB) and the native syscall/shift register constraints
  (rcx/r11 clobbered by syscall; CL-only shift counts; rdx implicit in
  idiv) via stack saves and a hidden `scratch` / `rbp` pair.

- m1pp/build-p1.sh: per-arch pipeline (host-native m1pp -&gt; M1 -&gt; hex2
  with the matching stage0 ELF header). The m1pp expander is
  architecture-neutral, so one host-compiled binary drives all targets.

- tests/p1/test.sh: rewritten to iterate over every fixture for every
  backend under podman/qemu (`--arch` narrows to one target). Cross-arch
  consistency falls out because every arch must match the same
  &lt;name&gt;.expected stdout.

- tests/p1/p1-call.P1: exercises ENTER / LEAVE / CALL / RET / MOV / ADDI
  on a program with a helper subroutine.

- tests/p1/p1-aliasing.P1: regression coverage for three amd64 contract
  violations fixed in this commit.  Each test picks a register pattern
  that makes the bug observable as a wrong output byte:

    1. DIV/REM with rd == rb == a2 (rdx). Two bugs in one sequence --
       `idiv rb` ran after `cqo` clobbered rdx (so idiv divided by the
       sign-extension of rax instead of the original rb), and the rdx
       restore ran after the rd write (clobbering the quotient when
       rd == a2). Fixed by stashing rb to `scratch` before `cqo` and
       reordering the restore to precede the rd write.

    2. SHL/SHR/SAR reg-count with rd == a3 (rcx). Mirror of (1) -- ra
       was read from rcx after the count overwrite, and the rcx restore
       ran after the rd write. Fixed by the same reordering.

    3. ANDI/ORI with imm &gt; 127 unconditionally used `83 /ext ib`, whose
       sign-extension turned `ANDI rd, 255` into AND with -1. Widened to
       `81 /ext id` for imms outside [-128, 127].

- Makefile: new `test-p1` target invoking tests/p1/test.sh.

15 passed, 0 failed across aarch64 / amd64 / riscv64 on hello, double,
argc_exit, p1-call, p1-aliasing.

</content>
</entry>
<entry>
<id>a570d90096e6f998b88f626c4ea05d870e80e84f</id>
<published>2026-04-24T12:44:59Z</published>
<updated>2026-04-24T12:44:59Z</updated>
<title>Speed up P1 build/test loop ~30-70x via native mescc-tools</title>
<link rel="alternate" type="text/html" href="commit/a570d90096e6f998b88f626c4ea05d870e80e84f.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit a570d90096e6f998b88f626c4ea05d870e80e84f
parent 3b6a3c115744b6b268f83c3a7e122ab4155e78c2
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Fri, 24 Apr 2026 05:44:59 -0700

Speed up P1 build/test loop ~30-70x via native mescc-tools

Default path for m1pp/build.sh now runs host-compiled mescc-tools M1/hex2
instead of the stage0 M0/hex2-0 inside the linux/arm64 VM, cutting a
full P1 test from ~110s to ~3.9s cold / ~1.6s warm. The bootstrap tools
still produce byte-exact output and stay the source of truth; set
M1PP_BOOTSTRAP_TOOLS=1 to force the original container path.

Also caches the built m1pp/m1pp by mtime in both test runners so repeat
runs skip the full expander rebuild when m1pp.M1 and the P1 defs are
unchanged.

</content>
</entry>
<entry>
<id>3b6a3c115744b6b268f83c3a7e122ab4155e78c2</id>
<published>2026-04-24T04:25:10Z</published>
<updated>2026-04-24T04:25:10Z</updated>
<title>Add P1v2 program-entry model (aarch64 _start stub calling p1_main)</title>
<link rel="alternate" type="text/html" href="commit/3b6a3c115744b6b268f83c3a7e122ab4155e78c2.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 3b6a3c115744b6b268f83c3a7e122ab4155e78c2
parent f10eab299b822884ec68f4c6b3b8285859515ca9
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 21:25:10 -0700

Add P1v2 program-entry model (aarch64 _start stub calling p1_main)

P1.M1pp now unconditionally invokes the backend %p1_entry() macro, which
on aarch64 emits :_start: read argc from [sp], compute argv=sp+8, call
p1_main, sys_exit its return value. Portable sources just define
:p1_main; hello.P1 is converted accordingly.

</content>
</entry>
<entry>
<id>f10eab299b822884ec68f4c6b3b8285859515ca9</id>
<published>2026-04-24T04:14:37Z</published>
<updated>2026-04-24T04:14:37Z</updated>
<title>Update Lisp plan for P1</title>
<link rel="alternate" type="text/html" href="commit/f10eab299b822884ec68f4c6b3b8285859515ca9.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit f10eab299b822884ec68f4c6b3b8285859515ca9
parent 2bf50d2a8f56b2106a737e260c4900abfb98d07a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 21:14:37 -0700

Update Lisp plan for P1

</content>
</entry>
<entry>
<id>2bf50d2a8f56b2106a737e260c4900abfb98d07a</id>
<published>2026-04-24T03:28:36Z</published>
<updated>2026-04-24T03:28:36Z</updated>
<title>M1PP doc</title>
<link rel="alternate" type="text/html" href="commit/2bf50d2a8f56b2106a737e260c4900abfb98d07a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 2bf50d2a8f56b2106a737e260c4900abfb98d07a
parent 687ee15acc1661be78ff6cd8922ad95dd19a2100
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 20:28:36 -0700

M1PP doc

</content>
</entry>
<entry>
<id>687ee15acc1661be78ff6cd8922ad95dd19a2100</id>
<published>2026-04-24T03:15:53Z</published>
<updated>2026-04-24T03:15:53Z</updated>
<title>rm old docs</title>
<link rel="alternate" type="text/html" href="commit/687ee15acc1661be78ff6cd8922ad95dd19a2100.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 687ee15acc1661be78ff6cd8922ad95dd19a2100
parent 79aedea7287b895e3089ff72a8ff80482bda1083
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 20:15:53 -0700

rm old docs

</content>
</entry>
<entry>
<id>79aedea7287b895e3089ff72a8ff80482bda1083</id>
<published>2026-04-24T03:09:23Z</published>
<updated>2026-04-24T03:09:23Z</updated>
<title>update post</title>
<link rel="alternate" type="text/html" href="commit/79aedea7287b895e3089ff72a8ff80482bda1083.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 79aedea7287b895e3089ff72a8ff80482bda1083
parent 592d347926f1abf565a5cd11a360a18a3a645432
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 20:09:23 -0700

update post

</content>
</entry>
<entry>
<id>592d347926f1abf565a5cd11a360a18a3a645432</id>
<published>2026-04-24T03:09:14Z</published>
<updated>2026-04-24T03:09:14Z</updated>
<title>shell.scm</title>
<link rel="alternate" type="text/html" href="commit/592d347926f1abf565a5cd11a360a18a3a645432.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 592d347926f1abf565a5cd11a360a18a3a645432
parent 2dfba4fcce1a94138f06d44d816896ca76f89065
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 20:09:14 -0700

shell.scm

</content>
</entry>
<entry>
<id>2dfba4fcce1a94138f06d44d816896ca76f89065</id>
<published>2026-04-24T03:08:40Z</published>
<updated>2026-04-24T03:08:40Z</updated>
<title>lisp docs</title>
<link rel="alternate" type="text/html" href="commit/2dfba4fcce1a94138f06d44d816896ca76f89065.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 2dfba4fcce1a94138f06d44d816896ca76f89065
parent 955cc50921de523481bdfc77a37f49725a4cb554
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 20:08:40 -0700

lisp docs

</content>
</entry>
<entry>
<id>955cc50921de523481bdfc77a37f49725a4cb554</id>
<published>2026-04-24T01:22:32Z</published>
<updated>2026-04-24T01:22:32Z</updated>
<title>m1pp.M1: port %struct and %enum directives</title>
<link rel="alternate" type="text/html" href="commit/955cc50921de523481bdfc77a37f49725a4cb554.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 955cc50921de523481bdfc77a37f49725a4cb554
parent 87d0cf252b91a60d2736c898ed9e5a08fa24c09a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 18:22:32 -0700

m1pp.M1: port %struct and %enum directives

Adds :define_fielded + :df_emit_field + :df_render_decimal to the P1
expander, plus line-start dispatch branches (:proc_check_struct,
:proc_check_enum) that shim into define_fielded with the stride /
totalizer-name parameter pair. State lives in df_* BSS slots +
df_name_scratch (256 B) + df_digit_scratch (24 B) so append_text calls
don&#39;t clobber it.

Test suite: all 19 m1pp fixtures pass byte-identical against the
C oracle.

</content>
</entry>
<entry>
<id>87d0cf252b91a60d2736c898ed9e5a08fa24c09a</id>
<published>2026-04-24T01:22:26Z</published>
<updated>2026-04-24T01:22:26Z</updated>
<title>m1pp: add %struct and %enum directives</title>
<link rel="alternate" type="text/html" href="commit/87d0cf252b91a60d2736c898ed9e5a08fa24c09a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 87d0cf252b91a60d2736c898ed9e5a08fa24c09a
parent dd82213eb8aa8db05b2bfaddfde3317d69f80d86
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 18:22:26 -0700

m1pp: add %struct and %enum directives

Implements §5 and §6 of docs/M1PP-EXT.md. Both share define_fielded(),
parameterized by stride and totalizer name:

  %struct NAME { f1 f2 ... }   -&gt;  NAME.field_k = k*8,  NAME.SIZE  = N*8
  %enum   NAME { l1 l2 ... }   -&gt;  NAME.label_k = k,    NAME.COUNT = N

Each synthesized field expands as a zero-parameter macro, consumed via
paren-less access (§4) at use sites. Two fixtures cover the 4-field
struct + %frame wrapper composition and a 7-label enum with a
%(=) compile-time COUNT sanity check.

</content>
</entry>
<entry>
<id>dd82213eb8aa8db05b2bfaddfde3317d69f80d86</id>
<published>2026-04-24T00:44:16Z</published>
<updated>2026-04-24T00:44:16Z</updated>
<title>tests/m1pp/12-braced-args: compose §1 local labels in WHILE_NEZ</title>
<link rel="alternate" type="text/html" href="commit/dd82213eb8aa8db05b2bfaddfde3317d69f80d86.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit dd82213eb8aa8db05b2bfaddfde3317d69f80d86
parent 6bb13576cb3eaa4c6bf33ad1104009f019b79512
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:44:16 -0700

tests/m1pp/12-braced-args: compose §1 local labels in WHILE_NEZ

Replace the literal `:loop__` label (which would collide if the macro
were invoked twice) with `:@loop` / `&amp;@loop`, demonstrating §1+§2
composing. WHILE_NEZ is expansion id 2 in this fixture, so the output
becomes `:loop__2` / `&amp;loop__2`.

</content>
</entry>
<entry>
<id>6bb13576cb3eaa4c6bf33ad1104009f019b79512</id>
<published>2026-04-24T00:22:45Z</published>
<updated>2026-04-24T00:22:45Z</updated>
<title>Merge feature: braced block arguments (§2)</title>
<link rel="alternate" type="text/html" href="commit/6bb13576cb3eaa4c6bf33ad1104009f019b79512.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 6bb13576cb3eaa4c6bf33ad1104009f019b79512
parent 04089609068b2758302653f0bf1488525c8eb499
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:22:45 -0700

Merge feature: braced block arguments (§2)

</content>
</entry>
<entry>
<id>04089609068b2758302653f0bf1488525c8eb499</id>
<published>2026-04-24T00:22:42Z</published>
<updated>2026-04-24T00:22:42Z</updated>
<title>Merge feature: local labels :@name / &amp;@name (§1)</title>
<link rel="alternate" type="text/html" href="commit/04089609068b2758302653f0bf1488525c8eb499.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 04089609068b2758302653f0bf1488525c8eb499
parent 51e51fb86495f1a6cbfb8fde625b5db1eab2dac1
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:22:42 -0700

Merge feature: local labels :@name / &amp;@name (§1)

</content>
</entry>
<entry>
<id>51e51fb86495f1a6cbfb8fde625b5db1eab2dac1</id>
<published>2026-04-24T00:22:38Z</published>
<updated>2026-04-24T00:22:38Z</updated>
<title>Merge feature: %str stringification builtin (§7)</title>
<link rel="alternate" type="text/html" href="commit/51e51fb86495f1a6cbfb8fde625b5db1eab2dac1.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 51e51fb86495f1a6cbfb8fde625b5db1eab2dac1
parent 6def9f0029040c6df23519bf58d44b45de20a5d6
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:22:38 -0700

Merge feature: %str stringification builtin (§7)

</content>
</entry>
<entry>
<id>6def9f0029040c6df23519bf58d44b45de20a5d6</id>
<published>2026-04-24T00:22:35Z</published>
<updated>2026-04-24T00:22:35Z</updated>
<title>Merge feature: strlen expression op (§3)</title>
<link rel="alternate" type="text/html" href="commit/6def9f0029040c6df23519bf58d44b45de20a5d6.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 6def9f0029040c6df23519bf58d44b45de20a5d6
parent 5b828f7a0aa7a329a933fedb0576854a30bddd03
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:22:35 -0700

Merge feature: strlen expression op (§3)

</content>
</entry>
<entry>
<id>5b828f7a0aa7a329a933fedb0576854a30bddd03</id>
<published>2026-04-24T00:22:30Z</published>
<updated>2026-04-24T00:22:30Z</updated>
<title>Merge feature: paren-less 0-arg macro calls (§4)</title>
<link rel="alternate" type="text/html" href="commit/5b828f7a0aa7a329a933fedb0576854a30bddd03.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 5b828f7a0aa7a329a933fedb0576854a30bddd03
parent dca693c3073799b8d46cc9f6479839ea4c8d913d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:22:30 -0700

Merge feature: paren-less 0-arg macro calls (§4)

</content>
</entry>
<entry>
<id>5b1416eeda2c4dc29373ef07c50dd1106b4708db</id>
<published>2026-04-24T00:21:42Z</published>
<updated>2026-04-24T00:21:42Z</updated>
<title>m1pp.M1: port %str stringification builtin</title>
<link rel="alternate" type="text/html" href="commit/5b1416eeda2c4dc29373ef07c50dd1106b4708db.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 5b1416eeda2c4dc29373ef07c50dd1106b4708db
parent ba016341a809dc6bc748baa48219eabb8bf8fdea
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:21:42 -0700

m1pp.M1: port %str stringification builtin

</content>
</entry>
<entry>
<id>d0c704cfef090603c28aae04be29a82233d07761</id>
<published>2026-04-24T00:20:31Z</published>
<updated>2026-04-24T00:20:31Z</updated>
<title>m1pp.M1: port strlen expression op</title>
<link rel="alternate" type="text/html" href="commit/d0c704cfef090603c28aae04be29a82233d07761.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit d0c704cfef090603c28aae04be29a82233d07761
parent ce22557fc8cb164acd92288a244669cc4651ec03
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:20:31 -0700

m1pp.M1: port strlen expression op

</content>
</entry>
<entry>
<id>cf5649c34ff07930d8d5bff5b9c6f37d332d5aba</id>
<published>2026-04-24T00:20:19Z</published>
<updated>2026-04-24T00:20:19Z</updated>
<title>m1pp.M1: port local labels (:@name, &amp;@name)</title>
<link rel="alternate" type="text/html" href="commit/cf5649c34ff07930d8d5bff5b9c6f37d332d5aba.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit cf5649c34ff07930d8d5bff5b9c6f37d332d5aba
parent 48971a6c16a856b6b0fd6beafa72d2a170cab648
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:20:19 -0700

m1pp.M1: port local labels (:@name, &amp;@name)

</content>
</entry>
<entry>
<id>0948ad4bcc40d174469f825a24cf35415eea6f44</id>
<published>2026-04-24T00:19:25Z</published>
<updated>2026-04-24T00:19:25Z</updated>
<title>m1pp.M1: port braced block arguments</title>
<link rel="alternate" type="text/html" href="commit/0948ad4bcc40d174469f825a24cf35415eea6f44.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 0948ad4bcc40d174469f825a24cf35415eea6f44
parent 968ba690fb1865bd72df6f2486c58db5807445f6
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:19:25 -0700

m1pp.M1: port braced block arguments

</content>
</entry>
<entry>
<id>61dd8df03718c8672dbc70ace7d9d846e2f06a6d</id>
<published>2026-04-24T00:17:40Z</published>
<updated>2026-04-24T00:17:40Z</updated>
<title>m1pp.M1: allow paren-less invocation of 0-arg macros</title>
<link rel="alternate" type="text/html" href="commit/61dd8df03718c8672dbc70ace7d9d846e2f06a6d.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 61dd8df03718c8672dbc70ace7d9d846e2f06a6d
parent 09299304297f9244d866289eafc912422be489e7
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:17:40 -0700

m1pp.M1: allow paren-less invocation of 0-arg macros

</content>
</entry>
<entry>
<id>ba016341a809dc6bc748baa48219eabb8bf8fdea</id>
<published>2026-04-24T00:06:38Z</published>
<updated>2026-04-24T00:06:38Z</updated>
<title>m1pp: add %str stringification builtin</title>
<link rel="alternate" type="text/html" href="commit/ba016341a809dc6bc748baa48219eabb8bf8fdea.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit ba016341a809dc6bc748baa48219eabb8bf8fdea
parent dca693c3073799b8d46cc9f6479839ea4c8d913d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:06:38 -0700

m1pp: add %str stringification builtin

</content>
</entry>
<entry>
<id>09299304297f9244d866289eafc912422be489e7</id>
<published>2026-04-24T00:05:40Z</published>
<updated>2026-04-24T00:05:40Z</updated>
<title>m1pp: allow paren-less invocation of 0-arg macros</title>
<link rel="alternate" type="text/html" href="commit/09299304297f9244d866289eafc912422be489e7.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 09299304297f9244d866289eafc912422be489e7
parent dca693c3073799b8d46cc9f6479839ea4c8d913d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:05:40 -0700

m1pp: allow paren-less invocation of 0-arg macros

</content>
</entry>
<entry>
<id>968ba690fb1865bd72df6f2486c58db5807445f6</id>
<published>2026-04-24T00:05:37Z</published>
<updated>2026-04-24T00:05:37Z</updated>
<title>m1pp: add braced block arguments</title>
<link rel="alternate" type="text/html" href="commit/968ba690fb1865bd72df6f2486c58db5807445f6.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 968ba690fb1865bd72df6f2486c58db5807445f6
parent dca693c3073799b8d46cc9f6479839ea4c8d913d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:05:37 -0700

m1pp: add braced block arguments

</content>
</entry>
<entry>
<id>ce22557fc8cb164acd92288a244669cc4651ec03</id>
<published>2026-04-24T00:04:40Z</published>
<updated>2026-04-24T00:04:40Z</updated>
<title>m1pp: add strlen expression op</title>
<link rel="alternate" type="text/html" href="commit/ce22557fc8cb164acd92288a244669cc4651ec03.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit ce22557fc8cb164acd92288a244669cc4651ec03
parent dca693c3073799b8d46cc9f6479839ea4c8d913d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:04:40 -0700

m1pp: add strlen expression op

</content>
</entry>
<entry>
<id>48971a6c16a856b6b0fd6beafa72d2a170cab648</id>
<published>2026-04-24T00:04:31Z</published>
<updated>2026-04-24T00:04:31Z</updated>
<title>m1pp: add local labels (:@name, &amp;@name)</title>
<link rel="alternate" type="text/html" href="commit/48971a6c16a856b6b0fd6beafa72d2a170cab648.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 48971a6c16a856b6b0fd6beafa72d2a170cab648
parent dca693c3073799b8d46cc9f6479839ea4c8d913d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 17:04:31 -0700

m1pp: add local labels (:@name, &amp;@name)

</content>
</entry>
<entry>
<id>dca693c3073799b8d46cc9f6479839ea4c8d913d</id>
<published>2026-04-23T23:58:19Z</published>
<updated>2026-04-23T23:58:19Z</updated>
<title>m1pp: spell XOR as ^ (was \$); drop == alias for =</title>
<link rel="alternate" type="text/html" href="commit/dca693c3073799b8d46cc9f6479839ea4c8d913d.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit dca693c3073799b8d46cc9f6479839ea4c8d913d
parent 6761b0608d69551ae4bfe6e9b5a932ddcafb7b26
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 16:58:19 -0700

m1pp: spell XOR as ^ (was \$); drop == alias for =

XOR is now ^ — the conventional spelling, no longer collides visually
with the \$(...) 8-byte hex builtin marker. Touches both m1pp/m1pp.c
and m1pp/m1pp.M1 (renamed op_dollar -&gt; op_caret in rodata, swapped
the dispatch comparison).

= and == previously both returned EXPR_EQ. The expression language
has no assignment so there&#39;s no ambiguity to resolve, but two ways
to spell one thing is just noise. Dropped == (eliminated the dispatch
block in expr_op_code and the op_eq_eq rodata).

Updated tests/m1pp/04-expr-ops.M1pp accordingly and regenerated the
.expected. All 11 m1pp parity fixtures and the P1 hello fixture pass.

</content>
</entry>
<entry>
<id>6761b0608d69551ae4bfe6e9b5a932ddcafb7b26</id>
<published>2026-04-23T23:53:48Z</published>
<updated>2026-04-23T23:53:48Z</updated>
<title>m1pp extensions doc</title>
<link rel="alternate" type="text/html" href="commit/6761b0608d69551ae4bfe6e9b5a932ddcafb7b26.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 6761b0608d69551ae4bfe6e9b5a932ddcafb7b26
parent ce7dbc4c1ff6509f28aa721ebffdffda6b6bb051
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 16:53:48 -0700

m1pp extensions doc

</content>
</entry>
<entry>
<id>ce7dbc4c1ff6509f28aa721ebffdffda6b6bb051</id>
<published>2026-04-23T23:48:36Z</published>
<updated>2026-04-23T23:48:36Z</updated>
<title>m1pp/m1pp.M1: scrub evolutionary comments</title>
<link rel="alternate" type="text/html" href="commit/ce7dbc4c1ff6509f28aa721ebffdffda6b6bb051.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit ce7dbc4c1ff6509f28aa721ebffdffda6b6bb051
parent a52dc7712af059af01946616204fd6aebefc7652
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 16:48:36 -0700

m1pp/m1pp.M1: scrub evolutionary comments

Comments now describe current state and intent only. No phase numbers,
no track / layer / oracle references, no &quot;this used to do X&quot; narratives.

Section dividers renamed from &quot;Phase N STUBS:&quot; to topic-named blocks
(e.g. &quot;Stream stack + expansion-pool lifetime&quot;, &quot;Argument parsing&quot;).
Inline `Oracle: m1pp.c:NAME.` per-function refs deleted; oracle-anchored
prose (&quot;matches C oracle&quot;, &quot;the oracle spells xor as $&quot;, &quot;the C oracle
uses 512-byte tmp&quot;) rephrased to state the rule directly. Stale sizing
notes (32 macros, 256 expand slots) updated to match current caps.

Behavior unchanged: all 11 m1pp oracle-parity fixtures and the P1 hello
fixture still pass.

</content>
</entry>
<entry>
<id>a52dc7712af059af01946616204fd6aebefc7652</id>
<published>2026-04-23T23:27:51Z</published>
<updated>2026-04-23T23:27:51Z</updated>
<title>tests/p1: hello.P1 + harness exercising the full P1 -&gt; ELF pipeline</title>
<link rel="alternate" type="text/html" href="commit/a52dc7712af059af01946616204fd6aebefc7652.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit a52dc7712af059af01946616204fd6aebefc7652
parent adbf3758d169db6ab5e662c4b1e436fcdfd9da06
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 16:27:51 -0700

tests/p1: hello.P1 + harness exercising the full P1 -&gt; ELF pipeline

First end-to-end test that drives a P1-language program through every
layer of the stack:

  cat p1/P1-aarch64.M1pp p1/P1.M1pp tests/p1/hello.P1
    -&gt; m1pp (M1 build)   -&gt; .M1   macro / builtin substitution
    -&gt; m1pp/build.sh     -&gt; aarch64 ELF  lint, M0, hex2-0
  podman run binary -&gt; diff stdout vs .expected

hello.P1 is the smallest useful program: write(stdout, &quot;Hello, World!\n&quot;)
then exit(0), spelled with the P1 frontend&#39;s macros (%li, %la, %syscall,
%sys_write, %sys_exit). Proves that:

  - the cat-three-files convention works (define-before-use holds across
    arch backend, portable frontend, and user program)
  - m1pp accepts inputs above its previous 8 KB cap (combined source is
    ~15 KB), and that its emit_hex_value output round-trips through M0
    (the recent quoted-hex change makes this work)
  - the full toolchain produces a runnable ELF that the kernel actually
    invokes

Filenames starting with `_` are skipped (parked), matching m1pp/test.sh.

</content>
</entry>
<entry>
<id>adbf3758d169db6ab5e662c4b1e436fcdfd9da06</id>
<published>2026-04-23T23:27:38Z</published>
<updated>2026-04-23T23:27:38Z</updated>
<title>m1pp: emit !@%$ hex builtins as quoted strings; bump buffers for P1</title>
<link rel="alternate" type="text/html" href="commit/adbf3758d169db6ab5e662c4b1e436fcdfd9da06.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit adbf3758d169db6ab5e662c4b1e436fcdfd9da06
parent 611ad4d2c08121778de01ec03e8e59898617c458
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 16:27:38 -0700

m1pp: emit !@%$ hex builtins as quoted strings; bump buffers for P1

Two infrastructure changes needed to send the P1 frontend through the
m1pp -&gt; M0 -&gt; hex2 pipeline:

1. emit_hex_value now wraps its output in single quotes, e.g. !(0xFF)
   emits &#39;FF&#39; instead of FF. M0 treats bare alphanumeric tokens as
   decimal numerals (so a literal 40000058 from %((| 0x58000040 0))
   was being mis-parsed as decimal 40000058 -&gt; 1 byte 0x3A) but
   passes &#39;XX..&#39; string literals through as raw hex bytes, matching
   the format DEFINE values use.

   Updated both m1pp/m1pp.c (emit kind = TOK_STRING; allocate +2 chars
   for the quotes) and the M1 port (same shape; ehv_scratch grown
   from 16 to 24 bytes for the two extra quote chars). Regenerated
   the affected .expected fixtures with the updated oracle:
     03-builtins, 04-expr-ops, 05-int-atoms, 07-rescan, 10-full-parity.

2. Bumped the m1pp BSS caps so the expander can swallow realistic P1
   inputs (the combined p1/P1-aarch64.M1pp + p1/P1.M1pp + a tiny user
   program is ~15 KB, well above the previous 8 KB INPUT_CAP):
     INPUT_CAP        8 KB -&gt;  64 KB
     OUTPUT_CAP       8 KB -&gt;  64 KB
     TEXT_CAP         4 KB -&gt;  32 KB
     TOKENS_END       6 KB -&gt;  96 KB  (4096 tokens)
     MACROS_CAP    9472 B  -&gt;  76 KB  (256 macros)
     MACRO_BODY_CAP   6 KB -&gt;  96 KB  (4096 tokens)
     EXPAND_CAP       6 KB -&gt;  96 KB  (4096 tokens)
   The corresponding ZERO32-padded BSS arenas were resized to match.
   All 11 m1pp oracle-parity fixtures still pass.

</content>
</entry>
<entry>
<id>611ad4d2c08121778de01ec03e8e59898617c458</id>
<published>2026-04-23T22:52:15Z</published>
<updated>2026-04-23T22:52:15Z</updated>
<title>tests/m1pp: add 7 oracle-parity fixtures + unpark full-parity</title>
<link rel="alternate" type="text/html" href="commit/611ad4d2c08121778de01ec03e8e59898617c458.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 611ad4d2c08121778de01ec03e8e59898617c458
parent 64c477b2cbf7684e884fa53252a8d89b2a09300c
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:52:15 -0700

tests/m1pp: add 7 oracle-parity fixtures + unpark full-parity

Each .expected was generated by running m1pp/m1pp.c (the oracle) on the
fixture, so a passing test means the M1 implementation is byte-for-byte
identical to the C reference on that input.

  03-builtins   - !@%$ at 1/2/4/8-byte sizes, including high-bit values
  04-expr-ops   - every operator: variadic folds, unary -, /, %, shifts, ~,
                  all 6 comparisons, nested expressions
  05-int-atoms  - decimal/hex literals, negatives, multi-digit, high-bit wrap
  06-paste      - multi-paste chain, prefix/suffix patterns, mix on one line
  07-rescan     - macro-in-macro, macro arg holding a call, macro-in-expression
  08-select     - empty branches, multi-token branches, branch with macro call,
                  nested %select
  09-args       - nested parens, depth-1-only commas, 0-param, 16-param, string
                  token containing a comma

Unparks the existing _full-parity fixture (now 10-full-parity) - it has
been passing oracle parity since the integration completed.

</content>
</entry>
<entry>
<id>64c477b2cbf7684e884fa53252a8d89b2a09300c</id>
<published>2026-04-23T22:43:37Z</published>
<updated>2026-04-23T22:43:37Z</updated>
<title>Integrate fix: spell negative addi immediates as negN (lint blind spot)</title>
<link rel="alternate" type="text/html" href="commit/64c477b2cbf7684e884fa53252a8d89b2a09300c.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 64c477b2cbf7684e884fa53252a8d89b2a09300c
parent 84ebd78783a6bbc55059ea0cac96188ac7334c3d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:43:37 -0700

Integrate fix: spell negative addi immediates as negN (lint blind spot)

</content>
</entry>
<entry>
<id>84ebd78783a6bbc55059ea0cac96188ac7334c3d</id>
<published>2026-04-23T22:37:46Z</published>
<updated>2026-04-23T22:37:46Z</updated>
<title>Merge branch &#39;worktree-agent-aecb01d58b541506d&#39; into integrate-m1pp</title>
<link rel="alternate" type="text/html" href="commit/84ebd78783a6bbc55059ea0cac96188ac7334c3d.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 84ebd78783a6bbc55059ea0cac96188ac7334c3d
parent fbf22f4bdb7af44f88f457580832a4d6b925229d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:37:46 -0700

Merge branch &#39;worktree-agent-aecb01d58b541506d&#39; into integrate-m1pp

# Conflicts:
#	m1pp/m1pp.M1

</content>
</entry>
<entry>
<id>fbf22f4bdb7af44f88f457580832a4d6b925229d</id>
<published>2026-04-23T22:36:42Z</published>
<updated>2026-04-23T22:36:42Z</updated>
<title>Merge branch &#39;worktree-agent-a04674a83d5e97483&#39; into integrate-m1pp</title>
<link rel="alternate" type="text/html" href="commit/fbf22f4bdb7af44f88f457580832a4d6b925229d.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit fbf22f4bdb7af44f88f457580832a4d6b925229d
parent 4d156315d79d8c10153cdde943b0edb4bd13c603
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:36:42 -0700

Merge branch &#39;worktree-agent-a04674a83d5e97483&#39; into integrate-m1pp

# Conflicts:
#	m1pp/m1pp.M1

</content>
</entry>
<entry>
<id>4d156315d79d8c10153cdde943b0edb4bd13c603</id>
<published>2026-04-23T22:36:03Z</published>
<updated>2026-04-23T22:36:03Z</updated>
<title>Merge branch &#39;worktree-agent-a63654c7cd13786ed&#39; into integrate-m1pp</title>
<link rel="alternate" type="text/html" href="commit/4d156315d79d8c10153cdde943b0edb4bd13c603.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 4d156315d79d8c10153cdde943b0edb4bd13c603
parent e0a71b2419b2d73e5e8c8c5b453e290c69df7d54
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:36:03 -0700

Merge branch &#39;worktree-agent-a63654c7cd13786ed&#39; into integrate-m1pp

# Conflicts:
#	m1pp/m1pp.M1

</content>
</entry>
<entry>
<id>e0a71b2419b2d73e5e8c8c5b453e290c69df7d54</id>
<published>2026-04-23T22:35:28Z</published>
<updated>2026-04-23T22:35:28Z</updated>
<title>Merge branch &#39;worktree-agent-a55e267523e077156&#39; into integrate-m1pp</title>
<link rel="alternate" type="text/html" href="commit/e0a71b2419b2d73e5e8c8c5b453e290c69df7d54.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit e0a71b2419b2d73e5e8c8c5b453e290c69df7d54
parent 1c9de593e0c3ec9dcc53712e78aa6353f0aaf41a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:35:28 -0700

Merge branch &#39;worktree-agent-a55e267523e077156&#39; into integrate-m1pp

</content>
</entry>
<entry>
<id>2f746287e685ff08457e14c57f847d7a8d6ffc31</id>
<published>2026-04-23T22:35:15Z</published>
<updated>2026-04-23T22:35:15Z</updated>
<title>Track E: builtins (! @ % $ %select)</title>
<link rel="alternate" type="text/html" href="commit/2f746287e685ff08457e14c57f847d7a8d6ffc31.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 2f746287e685ff08457e14c57f847d7a8d6ffc31
parent 9507a3668cd1218bae1aa0f171e7991cc8768afd
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:35:15 -0700

Track E: builtins (! @ % $ %select)

</content>
</entry>
<entry>
<id>edcc64c29178d89a6da0b97ec38e588c79690ece</id>
<published>2026-04-23T22:35:15Z</published>
<updated>2026-04-23T22:35:15Z</updated>
<title>Track D: expression evaluator</title>
<link rel="alternate" type="text/html" href="commit/edcc64c29178d89a6da0b97ec38e588c79690ece.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit edcc64c29178d89a6da0b97ec38e588c79690ece
parent 9507a3668cd1218bae1aa0f171e7991cc8768afd
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:35:15 -0700

Track D: expression evaluator

</content>
</entry>
<entry>
<id>49216446b528bf525f65f87772edea67dbe3d5d6</id>
<published>2026-04-23T22:35:15Z</published>
<updated>2026-04-23T22:35:15Z</updated>
<title>Track C: macro expansion (parse_args, find_macro/param, expand_*)</title>
<link rel="alternate" type="text/html" href="commit/49216446b528bf525f65f87772edea67dbe3d5d6.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 49216446b528bf525f65f87772edea67dbe3d5d6
parent 9507a3668cd1218bae1aa0f171e7991cc8768afd
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:35:15 -0700

Track C: macro expansion (parse_args, find_macro/param, expand_*)

</content>
</entry>
<entry>
<id>02cef1ca5ab2161f25f7761d5e54e8bffd0ea57d</id>
<published>2026-04-23T22:35:14Z</published>
<updated>2026-04-23T22:35:14Z</updated>
<title>Track B: ## token paste compaction</title>
<link rel="alternate" type="text/html" href="commit/02cef1ca5ab2161f25f7761d5e54e8bffd0ea57d.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 02cef1ca5ab2161f25f7761d5e54e8bffd0ea57d
parent 9507a3668cd1218bae1aa0f171e7991cc8768afd
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:35:14 -0700

Track B: ## token paste compaction

</content>
</entry>
<entry>
<id>1c9de593e0c3ec9dcc53712e78aa6353f0aaf41a</id>
<published>2026-04-23T22:35:09Z</published>
<updated>2026-04-23T22:35:09Z</updated>
<title>Track A: stream stack + pool lifetime + process_tokens rewrite</title>
<link rel="alternate" type="text/html" href="commit/1c9de593e0c3ec9dcc53712e78aa6353f0aaf41a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 1c9de593e0c3ec9dcc53712e78aa6353f0aaf41a
parent 9507a3668cd1218bae1aa0f171e7991cc8768afd
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:35:09 -0700

Track A: stream stack + pool lifetime + process_tokens rewrite

</content>
</entry>
<entry>
<id>9507a3668cd1218bae1aa0f171e7991cc8768afd</id>
<published>2026-04-23T22:01:53Z</published>
<updated>2026-04-23T22:01:53Z</updated>
<title>m1pp stubs</title>
<link rel="alternate" type="text/html" href="commit/9507a3668cd1218bae1aa0f171e7991cc8768afd.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 9507a3668cd1218bae1aa0f171e7991cc8768afd
parent de636ed71441d5dd25d5e73eb0bc1cb808acdc17
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 15:01:53 -0700

m1pp stubs

</content>
</entry>
<entry>
<id>de636ed71441d5dd25d5e73eb0bc1cb808acdc17</id>
<published>2026-04-23T21:45:59Z</published>
<updated>2026-04-23T21:45:59Z</updated>
<title>m1pp: Phase 2 — store %macro definitions in arenas</title>
<link rel="alternate" type="text/html" href="commit/de636ed71441d5dd25d5e73eb0bc1cb808acdc17.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit de636ed71441d5dd25d5e73eb0bc1cb808acdc17
parent fa9eb5967ef6ac61d3711e3687f7b2ffdbaf8767
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 14:45:59 -0700

m1pp: Phase 2 — store %macro definitions in arenas

Replace the structural %macro/%endm skip in m1pp.M1 with a real
define_macro that parses the header (name, comma-separated params,
trailing newline) and copies body tokens into macro_body_tokens[]
until a line-start %endm. Records live in a 32-slot macros[] arena
(296 B/record) with running tail pointers. Macros are still not
invoked; defs-only input continues to match the C oracle byte-for-byte.

Adds tests/m1pp/02-defs.{M1pp,expected} as the Phase 2 parity fixture.

</content>
</entry>
<entry>
<id>fa9eb5967ef6ac61d3711e3687f7b2ffdbaf8767</id>
<published>2026-04-23T21:32:34Z</published>
<updated>2026-04-23T21:32:34Z</updated>
<title>docs/M1M-IMPL.md: reconcile with post-Phase-1 state</title>
<link rel="alternate" type="text/html" href="commit/fa9eb5967ef6ac61d3711e3687f7b2ffdbaf8767.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit fa9eb5967ef6ac61d3711e3687f7b2ffdbaf8767
parent 2eb0c7d9d788f25032944b92823867115b2402d7
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 14:32:34 -0700

docs/M1M-IMPL.md: reconcile with post-Phase-1 state

Update the implementation sketch to match what&#39;s now on disk:

- m1pp.M1 description reflects the P1v2 port landing in Phase 1.
- Manual-run example and Phase 0 blurb use
  localhost/distroless-busybox:latest (built from Containerfile.busybox)
  instead of the old localhost/lispcc:aarch64 alpine alias.
- Oracle-compare commands and the Supported Features / Phase 7 / Phase
  10 bullets use .M1pp instead of the old .M1M extension, matching the
  fixture rename and the p1/*.M1pp sources.
- Layer 9 pseudo-code advances s.pos += 24 (matching the 24-byte Token
  record laid out in Core Data Structures) instead of the old 32.

</content>
</entry>
<entry>
<id>2eb0c7d9d788f25032944b92823867115b2402d7</id>
<published>2026-04-23T21:30:07Z</published>
<updated>2026-04-23T21:30:07Z</updated>
<title>post updates</title>
<link rel="alternate" type="text/html" href="commit/2eb0c7d9d788f25032944b92823867115b2402d7.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 2eb0c7d9d788f25032944b92823867115b2402d7
parent 992c8cc15c1e7ae225711195b82fbadcf384327a
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 14:30:07 -0700

post updates

</content>
</entry>
<entry>
<id>992c8cc15c1e7ae225711195b82fbadcf384327a</id>
<published>2026-04-23T21:29:51Z</published>
<updated>2026-04-23T21:29:51Z</updated>
<title>m1pp: switch build.sh and test.sh to a distroless-busybox image</title>
<link rel="alternate" type="text/html" href="commit/992c8cc15c1e7ae225711195b82fbadcf384327a.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 992c8cc15c1e7ae225711195b82fbadcf384327a
parent 7f8ceb9a19fdfb5f894827e596261da1d3c5fb87
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 14:29:51 -0700

m1pp: switch build.sh and test.sh to a distroless-busybox image

Replace the alpine base with a two-stage distroless-static image that
pulls only busybox from another distroless layer. Both digests are
pinned. Gives us the minimal sh/cp/chmod surface needed by build.sh&#39;s
container step without shipping apk or any of alpine&#39;s userland.

build.sh now `podman build`s the image from Containerfile.busybox on
first run instead of aliasing a pinned alpine digest. test.sh shares
the same tag so parity runs and build-pipeline smoke runs execute
under one image.

</content>
</entry>
<entry>
<id>7f8ceb9a19fdfb5f894827e596261da1d3c5fb87</id>
<published>2026-04-23T21:28:39Z</published>
<updated>2026-04-23T21:28:39Z</updated>
<title>m1pp: annotate m1pp.M1 with pseudo-C inline comments</title>
<link rel="alternate" type="text/html" href="commit/7f8ceb9a19fdfb5f894827e596261da1d3c5fb87.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 7f8ceb9a19fdfb5f894827e596261da1d3c5fb87
parent 19c3c3bd465f5e192537c247239a4d27497536e7
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 14:28:39 -0700

m1pp: annotate m1pp.M1 with pseudo-C inline comments

Each logical chunk of assembly now carries a single-line # comment
in pseudo-C form: register/field loads as &quot;name = expr&quot;, branches
as &quot;if (cond) ...&quot;, loops as &quot;for (i = 0; i &lt; len; i++) ...&quot;,
token field accesses as &quot;tok-&gt;kind&quot; / &quot;tok-&gt;text_ptr&quot;, etc.

Function-header ## comments call out args, return value, leaf/non-
leaf status, and relevant invariants (token layout, the shared shape
of the lparen/rparen/comma dispatch, the caller-saved register
juggling in fatal). Distinct hash levels (# vs ##) keep inline
annotations from colliding with the structural section dividers.

No code changes; tests still pass.

</content>
</entry>
<entry>
<id>19c3c3bd465f5e192537c247239a4d27497536e7</id>
<published>2026-04-23T21:00:31Z</published>
<updated>2026-04-23T21:00:31Z</updated>
<title>m1pp: add structural section comments in m1pp.M1</title>
<link rel="alternate" type="text/html" href="commit/19c3c3bd465f5e192537c247239a4d27497536e7.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 19c3c3bd465f5e192537c247239a4d27497536e7
parent c0792835d2bf76ee366e38128102228745deceb0
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 14:00:31 -0700

m1pp: add structural section comments in m1pp.M1

Ten section dividers (constants, runtime shell, helpers, lexer,
output, main processor, %macro skip, error paths, rodata, BSS) each
with a short note on what the block does and how it composes with
its neighbors. The file header docstring now sketches the pipeline
from _start through lex_source, process_tokens, skip_macro_def.

No code changes; tests still pass.

</content>
</entry>
<entry>
<id>c0792835d2bf76ee366e38128102228745deceb0</id>
<published>2026-04-23T20:55:03Z</published>
<updated>2026-04-23T20:55:03Z</updated>
<title>m1pp: Phase 1 — port lexer + pass-through skeleton to P1v2</title>
<link rel="alternate" type="text/html" href="commit/c0792835d2bf76ee366e38128102228745deceb0.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit c0792835d2bf76ee366e38128102228745deceb0
parent cddd94f916f41fad819f4905b6508be0378368d1
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 13:55:03 -0700

m1pp: Phase 1 — port lexer + pass-through skeleton to P1v2

Rewrite m1pp/m1pp.M1 against the P1v2 ISA (a*/t*/s* registers,
enter_0/leave, la_br &amp;label). Covers _start, read/write, lex_source,
emit_token, emit_newline, process_tokens, structural %macro/%endm
skip, plus the append_text / push_source_token / tok_eq_const helpers
the oracle lifts for this slice. BSS now precedes :ELF_end so the
LOAD segment&#39;s filesz = memsz covers it (the stage0 aarch64 header
doesn&#39;t support memsz &gt; filesz).

Simplify tests/m1pp/ fixture format: shape is picked by extension.
&lt;name&gt;.M1 is a standalone P1v2 program; stdout is diffed against
&lt;name&gt;.expected. &lt;name&gt;.M1pp is expander input; runner builds
m1pp/m1pp.M1 once, runs it as `m1pp &lt;name&gt;.M1pp &lt;out&gt;`, diffs the
output file against &lt;name&gt;.expected. Filenames starting with `_`
are skipped — used here to park the pre-existing full-parity fixture
until Phases 2–10 land.

tests/m1pp/01-passthrough.M1pp is the Phase 1 parity fixture: a
definition-only input that exercises the lexer, pass-through emit
path, and structural %macro skip against the C oracle.

</content>
</entry>
<entry>
<id>cddd94f916f41fad819f4905b6508be0378368d1</id>
<published>2026-04-23T20:25:10Z</published>
<updated>2026-04-23T20:25:10Z</updated>
<title>m1pp: alias container image as localhost/lispcc:aarch64; add port pointers</title>
<link rel="alternate" type="text/html" href="commit/cddd94f916f41fad819f4905b6508be0378368d1.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit cddd94f916f41fad819f4905b6508be0378368d1
parent 049c1ea756097264ad88f7a22003d26259543ee3
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 13:25:10 -0700

m1pp: alias container image as localhost/lispcc:aarch64; add port pointers

Tag the digest-pinned alpine arm64 image as localhost/lispcc:aarch64
on first run from m1pp/build.sh; both build.sh and test.sh now run
podman against the short tag. The Makefile keeps the digest as the
canonical pin; the tag is just an alias for ergonomics so the long
SHA doesn&#39;t have to appear in commands or docs.

Expand docs/M1M-IMPL.md with a &quot;Working on the port&quot; section: file
map, command cheatsheet (build, test, manual container run, regen
defs, C-oracle parity, lint), and a P1v2 quick-reference. Each phase
now lists the oracle entry points in m1pp/m1pp.c that the M1 port
should lift, so a session picking up mid-port can find the relevant
C routines by symbol name.

</content>
</entry>
<entry>
<id>049c1ea756097264ad88f7a22003d26259543ee3</id>
<published>2026-04-23T20:19:28Z</published>
<updated>2026-04-23T20:19:28Z</updated>
<title>m1pp: Phase 0 build infra; split aarch64 LI/LA literal prefix</title>
<link rel="alternate" type="text/html" href="commit/049c1ea756097264ad88f7a22003d26259543ee3.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 049c1ea756097264ad88f7a22003d26259543ee3
parent 92f3cc91a2b73dc490ae6048309beb6da7382c96
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 13:19:28 -0700

m1pp: Phase 0 build infra; split aarch64 LI/LA literal prefix

Add m1pp/build.sh and m1pp/test.sh: build a P1v2 .M1 fixture against
build/p1v2/aarch64/p1_aarch64.M1, run it in the aarch64 alpine
container, diff against .expected. Wired in via `make test-m1pp`.
Phase 0 fixture tests/m1pp/00-hello.M1 is a hello-world that exercises
the full pipeline end to end.

Split the aarch64 literal-pool prefix. LI stays 64-bit (ldr x, b PC+12)
so any one-word constant fits. LA and LA_BR move to a 32-bit zero-
extending prefix (ldr w, b PC+8). Label addresses fit in 32 bits under
the stage0 layout, so source now writes `la_a2 &amp;msg` without padding
the literal pool entry to 8 bytes. Codified in docs/P1v2.md.

Moves the full-parity fixture from tests/m1m/ to tests/m1pp/ so per-
phase fixtures live together.

The prior 64-bit prefix had b PC+8 where it needed b PC+12 and would
have SIGILL&#39;d any call site; no in-tree code had run against it, so
the bug surfaced only when Phase 0 drove it.

</content>
</entry>
<entry>
<id>92f3cc91a2b73dc490ae6048309beb6da7382c96</id>
<published>2026-04-23T18:55:22Z</published>
<updated>2026-04-23T18:55:22Z</updated>
<title>move files around</title>
<link rel="alternate" type="text/html" href="commit/92f3cc91a2b73dc490ae6048309beb6da7382c96.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 92f3cc91a2b73dc490ae6048309beb6da7382c96
parent 90d6018d786c42cf3a053508647144dceca2167e
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 11:55:22 -0700

move files around

</content>
</entry>
<entry>
<id>90d6018d786c42cf3a053508647144dceca2167e</id>
<published>2026-04-23T18:52:00Z</published>
<updated>2026-04-23T18:52:00Z</updated>
<title>post update</title>
<link rel="alternate" type="text/html" href="commit/90d6018d786c42cf3a053508647144dceca2167e.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 90d6018d786c42cf3a053508647144dceca2167e
parent add01712f59b79acb21ef42924bdb260357ef6b8
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 11:52:00 -0700

post update

</content>
</entry>
<entry>
<id>add01712f59b79acb21ef42924bdb260357ef6b8</id>
<published>2026-04-23T18:42:13Z</published>
<updated>2026-04-23T18:42:13Z</updated>
<title>drop i386, expand register set, add BLTU</title>
<link rel="alternate" type="text/html" href="commit/add01712f59b79acb21ef42924bdb260357ef6b8.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit add01712f59b79acb21ef42924bdb260357ef6b8
parent 932b2491b2cd4b0d21da8e12eb8796f6deb74da5
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 11:42:13 -0700

drop i386, expand register set, add BLTU

</content>
</entry>
<entry>
<id>932b2491b2cd4b0d21da8e12eb8796f6deb74da5</id>
<published>2026-04-23T18:15:21Z</published>
<updated>2026-04-23T18:15:21Z</updated>
<title>post update</title>
<link rel="alternate" type="text/html" href="commit/932b2491b2cd4b0d21da8e12eb8796f6deb74da5.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 932b2491b2cd4b0d21da8e12eb8796f6deb74da5
parent 67f4606e7e4c31112760ac9855384a4315e3a7df
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 11:15:21 -0700

post update

</content>
</entry>
<entry>
<id>67f4606e7e4c31112760ac9855384a4315e3a7df</id>
<published>2026-04-23T18:06:35Z</published>
<updated>2026-04-23T18:06:35Z</updated>
<title>rename to m1pp</title>
<link rel="alternate" type="text/html" href="commit/67f4606e7e4c31112760ac9855384a4315e3a7df.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 67f4606e7e4c31112760ac9855384a4315e3a7df
parent f0abcca8fab5acb18dbfbfcea898ffc3bdc6d176
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 11:06:35 -0700

rename to m1pp

</content>
</entry>
<entry>
<id>f0abcca8fab5acb18dbfbfcea898ffc3bdc6d176</id>
<published>2026-04-23T18:03:01Z</published>
<updated>2026-04-23T18:03:01Z</updated>
<title>Use !@%$ vs %le32/le64 in m1pp</title>
<link rel="alternate" type="text/html" href="commit/f0abcca8fab5acb18dbfbfcea898ffc3bdc6d176.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit f0abcca8fab5acb18dbfbfcea898ffc3bdc6d176
parent c40935b691eabb80b07e5bb9d65d5d86c402dbe1
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 11:03:01 -0700

Use !@%$ vs %le32/le64 in m1pp

</content>
</entry>
<entry>
<id>c40935b691eabb80b07e5bb9d65d5d86c402dbe1</id>
<published>2026-04-23T15:58:37Z</published>
<updated>2026-04-23T15:58:37Z</updated>
<title>Regularize M1M macro oracle</title>
<link rel="alternate" type="text/html" href="commit/c40935b691eabb80b07e5bb9d65d5d86c402dbe1.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit c40935b691eabb80b07e5bb9d65d5d86c402dbe1
parent a0b1dde7214f0ea5574565c1c0fbcdd16fedef90
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 08:58:37 -0700

Regularize M1M macro oracle

</content>
</entry>
<entry>
<id>a0b1dde7214f0ea5574565c1c0fbcdd16fedef90</id>
<published>2026-04-23T15:07:10Z</published>
<updated>2026-04-23T15:07:10Z</updated>
<title>m1m simplify spec</title>
<link rel="alternate" type="text/html" href="commit/a0b1dde7214f0ea5574565c1c0fbcdd16fedef90.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit a0b1dde7214f0ea5574565c1c0fbcdd16fedef90
parent 608c2bdc5926f697bace3c4d9881226acd06f792
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 08:07:10 -0700

m1m simplify spec

</content>
</entry>
<entry>
<id>608c2bdc5926f697bace3c4d9881226acd06f792</id>
<published>2026-04-23T14:19:12Z</published>
<updated>2026-04-23T14:19:12Z</updated>
<title>Implement initial P1 m1m tokenizer slice</title>
<link rel="alternate" type="text/html" href="commit/608c2bdc5926f697bace3c4d9881226acd06f792.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 608c2bdc5926f697bace3c4d9881226acd06f792
parent 6408a180a619872e0e96da5be7871cb7ad81ad54
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 07:19:12 -0700

Implement initial P1 m1m tokenizer slice

</content>
</entry>
<entry>
<id>6408a180a619872e0e96da5be7871cb7ad81ad54</id>
<published>2026-04-23T13:54:52Z</published>
<updated>2026-04-23T13:54:52Z</updated>
<title>Describe m1m bootstrap path</title>
<link rel="alternate" type="text/html" href="commit/6408a180a619872e0e96da5be7871cb7ad81ad54.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 6408a180a619872e0e96da5be7871cb7ad81ad54
parent 4ea652af1d9ea5e7dc9869386da837c95ff76f49
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 06:54:52 -0700

Describe m1m bootstrap path

</content>
</entry>
<entry>
<id>4ea652af1d9ea5e7dc9869386da837c95ff76f49</id>
<published>2026-04-23T13:54:48Z</published>
<updated>2026-04-23T13:54:48Z</updated>
<title>Document m1macro P1 port plan</title>
<link rel="alternate" type="text/html" href="commit/4ea652af1d9ea5e7dc9869386da837c95ff76f49.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 4ea652af1d9ea5e7dc9869386da837c95ff76f49
parent c24e386d1f9da71804e861ccfa961b6db0f6d924
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 06:54:48 -0700

Document m1macro P1 port plan

</content>
</entry>
<entry>
<id>c24e386d1f9da71804e861ccfa961b6db0f6d924</id>
<published>2026-04-23T13:54:42Z</published>
<updated>2026-04-23T13:54:42Z</updated>
<title>Add P1 m1m bootstrap stub</title>
<link rel="alternate" type="text/html" href="commit/c24e386d1f9da71804e861ccfa961b6db0f6d924.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit c24e386d1f9da71804e861ccfa961b6db0f6d924
parent b67850fbf7de470673af34368fe0342900082d26
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Thu, 23 Apr 2026 06:54:42 -0700

Add P1 m1m bootstrap stub

</content>
</entry>
<entry>
<id>b67850fbf7de470673af34368fe0342900082d26</id>
<published>2026-04-23T04:19:56Z</published>
<updated>2026-04-23T04:19:56Z</updated>
<title>p1.m1m</title>
<link rel="alternate" type="text/html" href="commit/b67850fbf7de470673af34368fe0342900082d26.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit b67850fbf7de470673af34368fe0342900082d26
parent c34eadeb5a6d1e48435c97d722fcc15a677a6a54
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 21:19:56 -0700

p1.m1m

</content>
</entry>
<entry>
<id>c34eadeb5a6d1e48435c97d722fcc15a677a6a54</id>
<published>2026-04-23T00:51:03Z</published>
<updated>2026-04-23T00:51:03Z</updated>
<title>p1v2</title>
<link rel="alternate" type="text/html" href="commit/c34eadeb5a6d1e48435c97d722fcc15a677a6a54.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit c34eadeb5a6d1e48435c97d722fcc15a677a6a54
parent 1b11e9dca9efcdb09fd2917b96b240e43c8ec91d
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 17:51:03 -0700

p1v2

</content>
</entry>
<entry>
<id>1b11e9dca9efcdb09fd2917b96b240e43c8ec91d</id>
<published>2026-04-22T18:17:23Z</published>
<updated>2026-04-22T18:17:23Z</updated>
<title>Vendor AArch64 catm hex2 source</title>
<link rel="alternate" type="text/html" href="commit/1b11e9dca9efcdb09fd2917b96b240e43c8ec91d.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 1b11e9dca9efcdb09fd2917b96b240e43c8ec91d
parent a84e4ca4303eb3dcad5cf34ca83c2f119019ef1e
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 11:17:23 -0700

Vendor AArch64 catm hex2 source

</content>
</entry>
<entry>
<id>a84e4ca4303eb3dcad5cf34ca83c2f119019ef1e</id>
<published>2026-04-22T18:17:03Z</published>
<updated>2026-04-22T18:17:03Z</updated>
<title>build: ~30x faster + 75% smaller lisp binary</title>
<link rel="alternate" type="text/html" href="commit/a84e4ca4303eb3dcad5cf34ca83c2f119019ef1e.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit a84e4ca4303eb3dcad5cf34ca83c2f119019ef1e
parent b97e3d36e52f0da1c9260fb3f5c56dcc35e6ee4f
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 11:17:03 -0700

build: ~30x faster + 75% smaller lisp binary

Three orthogonal wins stacked into one build pass:

- Prune unused DEFINEs: awk filter keeps only the ~350 of 7,293
  p1_&lt;arch&gt;.M1 DEFINEs that lisp.M1 actually references, cutting M0&#39;s
  input ~50% and its O(macros × tokens) Set_Expression scan ~20x.

- tmpfs staging: M0/hex2-0 issue one read()/write() syscall per byte
  (custom unbuffered fgetc/fputc, not libc). Going through the virtiofs
  bind mount on Apple Silicon podman costs ~90s per 340KB stream; the
  same stream through the container&#39;s own overlayfs /tmp costs ~2s. All
  per-byte I/O now lives on /tmp; virtiofs only sees bulk cp traffic.

- BSS via the ELF header: new src/elf/ELF-&lt;arch&gt;.hex2 declares
  p_memsz = :ELF_bss_end - :ELF_base (kernel-zero-filled) while
  p_filesz stays at :ELF_end. lisp.M1 splits accordingly: :ELF_end
  lands before the ZERO32-heavy BSS region, :ELF_bss_end sits at the
  very end. :mark_stack_next drops its &amp;mark_stack init (gc_mark_all
  re-seeds it every pass). A post-link truncate reads p_filesz from
  byte offset 0x60 and drops the trailing zero bytes hex2 had to emit
  to advance IP. The stock stage0-posix ELF-*.hex2 files under
  build/upstream/ stay untouched because bootstrap.sh still uses them
  to link M0 itself (no BSS there).

Measured (aarch64, clean build): ~124s -&gt; ~5s; binary 159,293 -&gt; 38,541
bytes. All 28 lisp tests pass on aarch64/amd64/riscv64.

</content>
</entry>
<entry>
<id>b97e3d36e52f0da1c9260fb3f5c56dcc35e6ee4f</id>
<published>2026-04-22T16:16:36Z</published>
<updated>2026-04-22T16:16:36Z</updated>
<title>lisp.M1: move 14 primitives to Scheme prelude for reviewability</title>
<link rel="alternate" type="text/html" href="commit/b97e3d36e52f0da1c9260fb3f5c56dcc35e6ee4f.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit b97e3d36e52f0da1c9260fb3f5c56dcc35e6ee4f
parent 1721f75a69bfd518d1f4c1c7327118b7353b1393
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 09:16:36 -0700

lisp.M1: move 14 primitives to Scheme prelude for reviewability

Promoted all fixed-arity helpers that can be derived from the
remaining primitives:

  arithmetic:  &lt;=, &gt;=, zero?, negative?, positive?, abs
  list:        list?, length, reverse, assoc, member
  vector:      vector-&gt;list, list-&gt;vector
  structural:  equal? (+ removes equal_helper and eq_* sub-labels)

Also adds Scheme-side nice-to-haves that were never P1 primitives but
are commonly expected: not, caar/cadr/cdar/cddr/caddr, list-ref,
for-each.

Variadic primitives (list, append, min, max) stay in P1 because
env_extend doesn&#39;t yet support (lambda args body) or dotted-tail
params; revisit after that lands. Remaining primitive code ids are
renumbered contiguously 0..45.

lisp.M1 shrinks ~560 lines; src/prelude.scm grows ~150. Tests
28/28 on aarch64 and amd64 (riscv64 in progress at commit time).

</content>
</entry>
<entry>
<id>1721f75a69bfd518d1f4c1c7327118b7353b1393</id>
<published>2026-04-22T16:16:29Z</published>
<updated>2026-04-22T16:16:29Z</updated>
<title>lisp update TODO</title>
<link rel="alternate" type="text/html" href="commit/1721f75a69bfd518d1f4c1c7327118b7353b1393.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 1721f75a69bfd518d1f4c1c7327118b7353b1393
parent 07de70b206e96bc65e95c530a6b487101f218640
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 09:16:29 -0700

lisp update TODO

</content>
</entry>
<entry>
<id>07de70b206e96bc65e95c530a6b487101f218640</id>
<published>2026-04-22T14:19:54Z</published>
<updated>2026-04-22T14:19:54Z</updated>
<title>P1.md: clarify leaf-function semantics (CALLable in, not out)</title>
<link rel="alternate" type="text/html" href="commit/07de70b206e96bc65e95c530a6b487101f218640.html" />
<author>
<name>Ryan Sepassi</name>
<email>rsepassi@gmail.com</email>
</author>
<content>commit 07de70b206e96bc65e95c530a6b487101f218640
parent e05d709edfb9f6f42bff02097a80ebb58282b4e6
Author: Ryan Sepassi &lt;rsepassi@gmail.com&gt;
Date:   Wed, 22 Apr 2026 07:19:54 -0700

P1.md: clarify leaf-function semantics (CALLable in, not out)

The prior rewording left ambiguous whether a leaf could be CALLed
at all. Split the leaf contract into the three operations it may
(or may not) perform internally: RET is fine, tail-branch via
li_br+B is fine and lets the target&#39;s RET skip the leaf in the
return chain, only inner CALL is forbidden. Being CALLed is always
fine — the restriction is on what the leaf does, not on who invokes
it.

</content>
</entry>
</feed>
