commit 56dfcbf7c27c97396b11fa3e71bee8d9a03a6eed
parent ccb69f1c9fcd1e3b5222653b3ba3255ba05efc79
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Fri, 24 Apr 2026 16:04:52 -0700
Drop "v2" from P1 naming everywhere
The "v2" 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/ -> build/p1/, and the docs/P1v2.md
references that already point at docs/P1.md.
Diffstat:
15 files changed, 80 insertions(+), 79 deletions(-)
diff --git a/M1pp/M1pp.P1 b/M1pp/M1pp.P1
@@ -1,4 +1,4 @@
-## m1pp.M1 — bootstrap M1 macro-expander, P1v2.
+## m1pp.M1 — bootstrap M1 macro-expander, P1.
##
## Runtime shape: m1pp input.M1 output.M1
##
@@ -20,7 +20,7 @@
## macro_body_tokens[]; consume through the %endm line
## without emitting output.
##
-## P1v2 ABI: a0..a3 arg/return, t0..t2 caller-saved temps, s0..s3 callee-saved
+## P1 ABI: a0..a3 arg/return, t0..t2 caller-saved temps, s0..s3 callee-saved
## (unused here). Non-leaf functions use enter_0 / eret. Entry is the portable
## p1_main (a0=argc, a1=argv); the backend-owned :_start stub captures
## argc/argv from the native entry state and sys_exits p1_main's return value.
@@ -1514,7 +1514,7 @@ DEFINE EXPR_INVALID 1200000000000000
## --- %macro storage: parse header + body into macros[] / macro_body_tokens --
## Called at proc_pos == line-start `%macro`. Leaves proc_pos past the %endm
## line with proc_line_start = 1. Uses BSS scratch (def_m_ptr, def_param_ptr,
-## def_body_line_start) since P1v2 enter/eret does not save s* registers.
+## def_body_line_start) since P1 enter/eret does not save s* registers.
##
## Macro record layout (296 bytes, see M1PP_MACRO_RECORD_SIZE):
## +0 name.ptr (8)
@@ -5960,7 +5960,7 @@ ZERO8
:paste_scratch
ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 ZERO32 ZERO32
-## parse_args + expand_macro_tokens + find_param spill slots (P1v2 has
+## parse_args + expand_macro_tokens + find_param spill slots (P1 has
## no callee-save spill on enter, and find_param's inner byte compare
## needs every caller-saved register; parse_args + expand_macro_tokens
## carry state across iterations and nested calls). One u64 each (ZERO8).
diff --git a/Makefile b/Makefile
@@ -89,31 +89,31 @@ $(TOOLS_DIR)/M0 $(TOOLS_DIR)/hex2-0 $(TOOLS_DIR)/catm $(TOOLS_DIR)/hex0 $(TOOLS_
tools-native:
sh scripts/build-native-tools.sh
-# --- P1v2 backend tables --------------------------------------------------
+# --- P1 backend tables --------------------------------------------------
#
-# build/p1v2/<arch>/p1_<arch>.M1 is the M1-format DEFINE table for that
+# build/p1/<arch>/p1_<arch>.M1 is the M1-format DEFINE table for that
# arch, generated by P1/gen/p1_gen.py. Used by scripts/build-p1.sh (the .P1
# pipeline; .P1pp uses the M1pp form under P1/P1-<arch>.M1pp instead).
-build/p1v2/aarch64/p1_aarch64.M1: $(wildcard P1/gen/*.py)
- python3 P1/gen/p1_gen.py --arch aarch64 build/p1v2
+build/p1/aarch64/p1_aarch64.M1: $(wildcard P1/gen/*.py)
+ python3 P1/gen/p1_gen.py --arch aarch64 build/p1
-build/p1v2/amd64/p1_amd64.M1: $(wildcard P1/gen/*.py)
- python3 P1/gen/p1_gen.py --arch amd64 build/p1v2
+build/p1/amd64/p1_amd64.M1: $(wildcard P1/gen/*.py)
+ python3 P1/gen/p1_gen.py --arch amd64 build/p1
-build/p1v2/riscv64/p1_riscv64.M1: $(wildcard P1/gen/*.py)
- python3 P1/gen/p1_gen.py --arch riscv64 build/p1v2
+build/p1/riscv64/p1_riscv64.M1: $(wildcard P1/gen/*.py)
+ python3 P1/gen/p1_gen.py --arch riscv64 build/p1
# --- Programs (per arch) --------------------------------------------------
m1pp: $(OUT_DIR)/m1pp
pokem: $(OUT_DIR)/pokem
-$(OUT_DIR)/m1pp: M1pp/M1pp.P1 build/p1v2/$(ARCH)/p1_$(ARCH).M1 \
+$(OUT_DIR)/m1pp: M1pp/M1pp.P1 build/p1/$(ARCH)/p1_$(ARCH).M1 \
scripts/build-p1.sh scripts/lint.sh
sh scripts/build-p1.sh $(ARCH) M1pp/M1pp.P1 $@
-$(OUT_DIR)/pokem: pokem/pokem.P1 build/p1v2/$(ARCH)/p1_$(ARCH).M1 \
+$(OUT_DIR)/pokem: pokem/pokem.P1 build/p1/$(ARCH)/p1_$(ARCH).M1 \
scripts/build-p1.sh scripts/lint.sh
sh scripts/build-p1.sh $(ARCH) pokem/pokem.P1 $@
@@ -123,7 +123,7 @@ HELLO_SRC := tests/M1pp/00-hello.M1
hello: $(OUT_DIR)/hello
-$(OUT_DIR)/hello: $(HELLO_SRC) build/p1v2/$(ARCH)/p1_$(ARCH).M1 \
+$(OUT_DIR)/hello: $(HELLO_SRC) build/p1/$(ARCH)/p1_$(ARCH).M1 \
scripts/build-p1.sh scripts/lint.sh $(TOOLS_DIR)/M0
M1PP_BOOTSTRAP_TOOLS=1 sh scripts/build-p1.sh $(ARCH) $(HELLO_SRC) $@
@@ -153,7 +153,7 @@ ifeq ($(SUITE),)
else
@$(MAKE) --no-print-directory \
$(foreach a,$(TEST_ARCHES),image-$(a)) \
- $(foreach a,$(TEST_ARCHES),build/p1v2/$(a)/p1_$(a).M1)
+ $(foreach a,$(TEST_ARCHES),build/p1/$(a)/p1_$(a).M1)
ifeq ($(SUITE),m1pp)
sh scripts/run-tests.sh --suite=m1pp $(if $(ARCH_FILTER),--arch=$(ARCH_FILTER))
else ifeq ($(SUITE),p1)
diff --git a/P1/P1-aarch64.M1pp b/P1/P1-aarch64.M1pp
@@ -1,4 +1,4 @@
-# aarch64.M1M -- P1v2 aarch64 backend expressed in m1macro.
+# aarch64.M1M -- P1 aarch64 backend expressed in m1macro.
#
# This mirrors p1/aarch64.py using the m1macro integer builtins:
# %(sexpr), $(sexpr), and %select(cond, then, else).
@@ -504,7 +504,7 @@
%endm
%macro p1_entry()
-# :_start stub emitted by the aarch64 backend per the P1v2 program-entry
+# :_start stub emitted by the aarch64 backend per the P1 program-entry
# model. Captures argc from [sp] into a0, computes argv=sp+8 into a1,
# calls p1_main under the one-word direct-result convention, then issues
# a native Linux sys_exit with p1_main's return value as the exit status.
diff --git a/P1/P1-amd64.M1pp b/P1/P1-amd64.M1pp
@@ -1,4 +1,4 @@
-# P1-amd64.M1pp -- P1v2 amd64 backend expressed in m1macro.
+# P1-amd64.M1pp -- P1 amd64 backend expressed in m1macro.
#
# Mirrors p1/P1-aarch64.M1pp. Native register mapping is backend-private;
# see the amd_reg_* table below. amd64 is variable-length, so every op
@@ -835,7 +835,7 @@
%endm
%macro p1_entry()
-# :_start stub per the P1v2 program-entry model. Linux amd64 puts argc
+# :_start stub per the P1 program-entry model. Linux amd64 puts argc
# at [rsp] and argv starting at [rsp+8]. Load argc into a0 (rdi),
# compute &argv[0] into a1 (rsi), call p1_main under the one-word
# direct-result convention, then issue sys_exit with p1_main's return
diff --git a/P1/P1-riscv64.M1pp b/P1/P1-riscv64.M1pp
@@ -1,4 +1,4 @@
-# P1-riscv64.M1pp -- P1v2 riscv64 backend expressed in m1macro.
+# P1-riscv64.M1pp -- P1 riscv64 backend expressed in m1macro.
#
# Mirrors p1/P1-aarch64.M1pp; same macro surface, different encodings.
# Native register picks follow docs/P1.md's 64-bit mapping table.
@@ -479,7 +479,7 @@
%endm
%macro p1_entry()
-# :_start stub per the P1v2 program-entry model. Linux riscv64 puts argc
+# :_start stub per the P1 program-entry model. Linux riscv64 puts argc
# at [sp] and argv starting at [sp+8], matching the generic SysV entry
# stack. Load argc into a0, compute &argv[0] into a1, call p1_main under
# the one-word direct-result convention, then issue sys_exit with the
diff --git a/P1/P1.M1pp b/P1/P1.M1pp
@@ -1,4 +1,4 @@
-# P1.M1M -- portable P1v2 macro front-end.
+# P1.M1M -- portable P1 macro front-end.
#
# This file assumes an arch-specific backend M1M has already been prepended.
# The backend must provide the target hooks used below:
@@ -246,7 +246,7 @@ target
# ---- Program entry --------------------------------------------------------
#
-# The portable P1v2 program-entry model emits a backend-specific `:_start`
+# The portable P1 program-entry model emits a backend-specific `:_start`
# stub that captures argc/argv from the native entry state, calls the
# portable label `p1_main` under the one-word direct-result convention
# (a0=argc, a1=argv), and sys_exits p1_main's return value. The stub is
diff --git a/P1/P1pp.P1pp b/P1/P1pp.P1pp
@@ -5,7 +5,7 @@
#
# catm P1-<arch>.M1pp P1.M1pp p1pp.P1pp usersrc.P1pp > program.M1
#
-# Targets P1v2-64 only (WORD = 8). All internal labels use the
+# Targets P1-64 only (WORD = 8). All internal labels use the
# `libp1pp__` prefix; public entry points are unprefixed.
#
# See docs/LIBP1PP.md for the public contract.
diff --git a/P1/gen/llvm_disasm_aarch64.py b/P1/gen/llvm_disasm_aarch64.py
@@ -23,7 +23,7 @@ def repo_root():
def default_input_path():
- return repo_root() / 'build' / 'p1v2' / 'aarch64' / 'p1_aarch64.M1'
+ return repo_root() / 'build' / 'p1' / 'aarch64' / 'p1_aarch64.M1'
def ensure_generated(path: Path):
diff --git a/P1/gen/p1_gen.py b/P1/gen/p1_gen.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
-"""Generate P1 v2 DEFINE tables.
+"""Generate P1 DEFINE tables.
-This is a fresh generator for docs/P1v2.md. The ISA surface is described by
+This is a fresh generator for docs/P1.md. The ISA surface is described by
plain namedtuple rows, and each backend registers a simple row-type -> encoder
mapping. The emitted immediate/offset domains are still curated tables rather
than the full theoretical spec space, so extending coverage is a one-line data
@@ -79,7 +79,7 @@ ENTER_SIZES = tuple(range(0, 129))
HEADER = """## p1_{arch}.M1 — GENERATED by p1/gen/p1_gen.py. Do not edit by hand.
##
-## This table targets the P1 v2 ISA described in docs/P1v2.md.
+## This table targets the P1 ISA described in docs/P1.md.
## Row shapes are shared; per-arch lowering lives in p1/gen/<arch>.py.
"""
@@ -221,7 +221,7 @@ def parse_args(argv):
else:
positional.append(arg)
i += 1
- build_root = positional[0] if positional else os.path.join('build', 'p1v2')
+ build_root = positional[0] if positional else os.path.join('build', 'p1')
if not archs:
archs = list(sorted(ARCHES))
return check, archs, build_root
diff --git a/docs/LIBP1PP.md b/docs/LIBP1PP.md
@@ -25,10 +25,10 @@ definitions.
### Width
-libp1pp v1 targets **P1v2-64 only**. Word size is 8 bytes. Pointer values,
+libp1pp v1 targets **P1-64 only**. Word size is 8 bytes. Pointer values,
integer results, and syscall arguments are all one word.
-Porting libp1pp to P1v2-32 is out of scope for this document.
+Porting libp1pp to P1-32 is out of scope for this document.
### Syscall numbers
@@ -94,7 +94,7 @@ allocator: `bump_alloc` called before `bump_init` returns `0` (the
other libp1pp function is callable from the first instruction of
`p1_main`.
-`p1_main` itself inherits the portable entry contract from P1 v2:
+`p1_main` itself inherits the portable entry contract from P1:
`a0` = `argc`, `a1` = `argv`. libp1pp does not wrap or interpose on
`p1_main`.
@@ -266,7 +266,7 @@ picking names, and their local labels cannot collide.
## Frame locals
libp1pp does not introduce a new local-variable macro. Use M1PP's `%struct`
-directly: its 8-byte stride matches `WORD` on P1v2-64, and it already
+directly: its 8-byte stride matches `WORD` on P1-64, and it already
synthesizes `%name.SIZE` for `ENTER`.
%struct parse_f { state cursor endp tmp }
@@ -554,6 +554,6 @@ The following were considered and deferred:
- Multiple bump arenas — one global arena covers bootstrap needs.
- `strcpy` / `strcat` — length-aware callers should use `memcpy` with an
explicit byte count.
-- P1v2-32 support.
+- P1-32 support.
- `envp` / auxv / command-line-aware helpers beyond what `p1_main`
already receives.
diff --git a/docs/LISP-C.md b/docs/LISP-C.md
@@ -33,8 +33,8 @@ not the source. The source is M1PP-preprocessed P1 assembly.
## Word size
-P1v2-64 is the initial target. Every heap word is 8 bytes; every object
-is 8-byte aligned. P1v2-32 is out of scope for the first pass; porting
+P1-64 is the initial target. Every heap word is 8 bytes; every object
+is 8-byte aligned. P1-32 is out of scope for the first pass; porting
would require a parallel layout story because M1PP's `%struct` stride
is fixed at 8.
@@ -285,7 +285,7 @@ switch wider than ~3 cases, which we use for the special-form
cascade in `eval`.
Each entry is 8 bytes: a 4-byte M1 label reference plus 4 bytes of
-pad. P1v2-64 has no 4-byte load, only full-word `LD`, so padding to
+pad. P1-64 has no 4-byte load, only full-word `LD`, so padding to
a word is the cheap path.
```
diff --git a/docs/P1.md b/docs/P1.md
@@ -1,13 +1,13 @@
-# P1 v2
+# P1
## Scope
-P1 v2 is a portable pseudo-ISA for standalone executables.
+P1 is a portable pseudo-ISA for standalone executables.
-P1 v2 has two width variants:
+P1 has two width variants:
-- **P1v2-64** — one word is one 64-bit integer or pointer value
-- **P1v2-32** — one word is one 32-bit integer or pointer value
+- **P1-64** — one word is one 64-bit integer or pointer value
+- **P1-32** — one word is one 32-bit integer or pointer value
Portable source may use any number of word arguments. The first four argument
registers are explicit, and additional argument words are passed through a
@@ -18,7 +18,7 @@ portable indirect-result convention described below.
## Toolchain envelope
-P1 v2 must be assemblable through the existing `M0` + `hex2` path, with
+P1 must be assemblable through the existing `M0` + `hex2` path, with
`catm` as the only composition primitive between source or generated fragments.
The spec therefore assumes only the following toolchain features:
@@ -56,7 +56,7 @@ as `LA rd, %label` and `LA_BR %label`.
### Exposed registers
-P1 v2 exposes the following source-level registers:
+P1 exposes the following source-level registers:
- `a0`–`a3` — argument registers. Also caller-saved general registers.
- `t0`–`t2` — caller-saved temporaries.
@@ -78,7 +78,7 @@ No hidden register may carry a live P1 value across an instruction boundary.
### Arguments and return values
-P1 v2 defines three result conventions: one-word direct, two-word direct, and
+P1 defines three result conventions: one-word direct, two-word direct, and
indirect.
In the one-word direct-result convention:
@@ -155,7 +155,7 @@ before a frame is established.
### Incoming stack-argument area
-P1 v2 defines an abstract incoming stack-argument area for explicit argument
+P1 defines an abstract incoming stack-argument area for explicit argument
words that do not fit in registers.
- Slot `0` is the first stack-passed explicit argument word.
@@ -210,8 +210,8 @@ and the backend chooses its layout and total allocation size.
Word sizes:
-- `WORD = 8` in P1v2-64
-- `WORD = 4` in P1v2-32
+- `WORD = 8` in P1-64
+- `WORD = 4` in P1-32
`STACK_ALIGN` is target-defined and must satisfy the native call ABI at
every call boundary.
@@ -223,7 +223,7 @@ Leaf functions that need no frame-local storage may omit the frame entirely.
- A function that allocates a frame must restore `sp` before returning.
- Callee-saved registers modified by the function must be restored before
returning.
-- The standard frame layout is the only frame shape recognized by P1 v2.
+- The standard frame layout is the only frame shape recognized by P1.
## Op Set Summary
@@ -251,7 +251,7 @@ Portable source has three immediate classes:
with `LI`
- **Materialized address** — the address of a label loaded with `LA`
-P1 v2 also uses two structured assembly-time operands:
+P1 also uses two structured assembly-time operands:
- **Frame-local byte count** — a non-negative byte count used by `ENTER`
- **Argument-slot index** — a non-negative word-slot index used by `LDARG`
@@ -315,7 +315,7 @@ establishment.
### Prologue / Epilogue
-P1 v2 has a single frame-establishment op, `ENTER size`. Frame teardown is
+P1 has a single frame-establishment op, `ENTER size`. Frame teardown is
not a standalone op; it is embedded in `ERET`, `TAIL`, and `TAILR`.
`ENTER size` establishes a standard frame with `size` bytes of frame-local
@@ -344,7 +344,7 @@ by storing it in frame-local storage within its standard frame.
### Branching
-P1 v2 branch targets are carried through the hidden branch-target mechanism
+P1 branch targets are carried through the hidden branch-target mechanism
`br`. Portable source may load `br` only through:
- `LA_BR %label` — materialize the address of `%label` as the next branch, call,
@@ -377,7 +377,7 @@ instruction.
### Arithmetic
-P1 v2 defines the following arithmetic and bitwise operations on one-word
+P1 defines the following arithmetic and bitwise operations on one-word
values:
- register-register: `ADD`, `SUB`, `AND`, `OR`, `XOR`, `SHL`, `SHR`, `SAR`,
@@ -391,10 +391,10 @@ active word size.
zero-fills. `SAR` is an arithmetic right shift and sign-fills.
For register-count shifts, only the low `5` bits of the shift count are
-observed in `P1v2-32`, and only the low `6` bits are observed in `P1v2-64`.
+observed in `P1-32`, and only the low `6` bits are observed in `P1-64`.
-Immediate-form shifts use inline immediates in the range `0..31` in `P1v2-32`
-and `0..63` in `P1v2-64`.
+Immediate-form shifts use inline immediates in the range `0..31` in `P1-32`
+and `0..63` in `P1-64`.
`DIV` is signed division on one-word two's-complement values and truncates
toward zero. `REM` is the corresponding signed remainder.
@@ -405,7 +405,7 @@ remainder case.
### Moves
-P1 v2 defines the following move and materialization operations:
+P1 defines the following move and materialization operations:
- `MOV` — register-to-register copy
- `LI` — load one-word integer constant
@@ -426,14 +426,14 @@ part of the general move family.
### Memory
-P1 v2 defines the following memory-access operations:
+P1 defines the following memory-access operations:
- `LD`, `ST` — one-word load and store
- `LB`, `SB` — byte load and store
- `LDARG` — one-word load from the incoming stack-argument area
-`LD` and `ST` access one full word: 4 bytes in `P1v2-32` and 8 bytes in
-`P1v2-64`.
+`LD` and `ST` access one full word: 4 bytes in `P1-32` and 8 bytes in
+`P1-64`.
`LB` loads one byte and zero-extends it to a full word. `SB` stores the low
8 bits of the source value.
@@ -458,7 +458,7 @@ requirement.
## Program Entry
-P1 v2 defines a portable program-entry model so that portable source
+P1 defines a portable program-entry model so that portable source
does not need to know how the native loader delivers `argc` / `argv`.
The target backend is responsible for emitting a per-arch `_start`
@@ -505,7 +505,7 @@ registers are preserved across the syscall.
The mapping from symbolic syscall names to numeric syscall identifiers is
target-defined. The set of syscalls available to a given program is likewise
-specified outside the core P1 v2 ISA, for example by a target profile or
+specified outside the core P1 ISA, for example by a target profile or
runtime interface document.
## Target notes
@@ -524,5 +524,5 @@ runtime interface document.
conventions; backends may preserve P1 caller-saved registers that happen
to land in natively callee-saved native registers as a matter of backend
policy.
-- Frame-pointer use is backend policy, not part of the P1 v2 architectural
+- Frame-pointer use is backend policy, not part of the P1 architectural
register set.
diff --git a/scripts/build-p1.sh b/scripts/build-p1.sh
@@ -1,8 +1,8 @@
#!/bin/sh
-## build-p1.sh — assemble a P1v2 source (.P1 or .M1) into a runnable ELF.
+## build-p1.sh — assemble a P1 source (.P1 or .M1) into a runnable ELF.
##
## Pipeline:
-## 1. lint — assert every P1v2 op token in <src> is defined
+## 1. lint — assert every P1 op token in <src> is defined
## 2. prune — strip DEFINEs the source doesn't reference
## 3. cat — pruned defs ++ <src> -> combined.M1
## 4. M1 — combined.M1 -> .hex2
@@ -41,7 +41,7 @@ case "$ARCH" in
*) echo "build-p1.sh: unsupported arch '$ARCH'" >&2; exit 1 ;;
esac
-P1_DEFS=build/p1v2/$ARCH/p1_$ARCH.M1
+P1_DEFS=build/p1/$ARCH/p1_$ARCH.M1
ELF_HDR=vendor/seed/$ARCH/ELF.hex2
BASE_ADDR=0x600000 ## must match the load address encoded in $ELF_HDR
TOOLS=build/$ARCH/tools ## bootstrap M0/hex2-0/catm (when M1PP_BOOTSTRAP_TOOLS=1)
diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh
@@ -8,16 +8,17 @@
## (parked, ad-hoc debugging).
##
## Suites:
-## m1pp tests/M1pp/<name>.M1 — P1v2 program built via build-p1.sh,
-## run in container, stdout diffed.
-## tests/M1pp/<name>.M1pp — m1pp expander parity test: m1pp
-## binary (built once) consumes the
-## fixture and writes <out>; diffed.
-## aarch64 only.
+## m1pp tests/M1pp/<name>.M1 — P1 program built via build-p1.sh
+## for each requested arch, run in
+## container, stdout diffed.
+## tests/M1pp/<name>.M1pp — m1pp expander parity test: per-arch
+## m1pp binary consumes the fixture
+## and writes <out>; diffed.
## p1 tests/P1/<name>.P1pp — P1pp program built via build-p1pp.sh
## for each requested arch, run in
-## container, stdout diffed. Default:
-## all three arches.
+## container, stdout diffed.
+##
+## All three arches by default; --arch restricts to one.
##
## Usage: scripts/run-tests.sh --suite <m1pp|p1> [--arch ARCH] [name ...]
@@ -98,7 +99,7 @@ m1pp_build_expander() {
arch=$1
bin=build/$arch/m1pp
src=M1pp/M1pp.P1
- defs=build/p1v2/$arch/p1_$arch.M1
+ defs=build/p1/$arch/p1_$arch.M1
if [ -x "$bin" ] && [ "$bin" -nt "$src" ] && [ "$bin" -nt "$defs" ]; then
return 0
fi
diff --git a/tests/M1pp/00-hello.M1 b/tests/M1pp/00-hello.M1
@@ -1,10 +1,10 @@
-## P1v2 hello-world smoke fixture.
+## P1 hello-world smoke fixture.
##
## Exercises the build pipeline (lint -> prune -> catm -> M0 -> ELF link ->
-## hex2-0) against build/p1v2/aarch64/p1_aarch64.M1. Standalone program —
+## hex2-0) against build/p1/aarch64/p1_aarch64.M1. Standalone program —
## does not drive the m1pp expander.
##
-## P1v2 syscall ABI:
+## P1 syscall ABI:
## a0 = syscall number on entry, return value on exit
## a1, a2, a3, t0, s0, s1 = syscall arguments 0..5