feat(v4.0.0): call-free D+ (D-2 stack headroom)
D+ as written in 5.7 was exact but kept two cells on the return stack while calling U> -> SWAP/U<, leaving its caller one return entry: any word calling a word that calls D+ (M+, D-, D=, Q.+, Q.-) would have a return address silently overwritten. The new D+ makes no calls. Both high cells wait on the return stack; the carry out of the low-cell add comes from sign tests -- if the low cells' top bits differ, there is a carry exactly when the sum's top bit is clear; if they match, exactly when both are set. Headroom (data cells under args / return entries): 4/1 -> 6/5. Checked against C over all 50625 edge-vector quadruples and 20000 pseudo-random pairs (weighted to top-bit cases and low sums wrapping to 0), at 32- and 64-bit cells, optimised and ASan+UBSan. Retargeting each of the four carry branches fails more than 13000 checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
93d09840da
commit
092036c97a
@@ -404,7 +404,7 @@ A double is two 32-bit cells on a mesh node.
|
||||
| Word | Fate | v4 definition |
|
||||
| --- | --- | --- |
|
||||
| `S>D` | CAP | `dup 0<` — executed on the golden model (2026-10-02). |
|
||||
| `D+` | CAP | `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +` — executed on the golden model and exact (2026-10-02), but leaves its caller only **1** return-stack entry (D-2): anything that calls a word that calls `D+` overwrites a return address. Not yet revised. |
|
||||
| `D+` | CAP | `push over push push drop pop over over xor -if L1 drop + -if C1 jump C0 L1: drop over -if L2 drop + jump C1 L2: drop + C0: pop pop + ; C1: pop pop + 1 + ;` — call-free. The carry out of the low cells is found by sign tests: if their top bits differ, there is a carry exactly when the sum's top bit is clear; if they match, exactly when both are set. Executed on the golden model (2026-10-02); leaves its caller 6 data cells under its arguments and 5 return entries. Replaces `push SWAP push over + 2DUP U> ROT drop NEGATE pop pop + +`, which was exact but left 1 return entry. |
|
||||
| `DNEGATE` | CAP | `inv over if L1 drop push inv 1 + pop ; L1: drop 1 + ;` — call-free: `~d + 1`, carrying into the high cell exactly when the low cell is 0. Executed on the golden model (2026-10-02). Replaces `inv SWAP inv SWAP 1 0 D+`, which left a caller no return-stack room, so `DABS` could not run at all. |
|
||||
| `D-` | CAP | `DNEGATE D+` |
|
||||
| `DABS` | CAP | `dup 0< IF DNEGATE THEN` — executed on the golden model (2026-10-02). |
|
||||
|
||||
Reference in New Issue
Block a user