build: the libavr pin advances, and one adiw appears in the ring

43fc479 -> aec9955, 8380 -> 8382 B. Two bytes, and they are all of e226340:
the uart ring now declares its indices before its storage.

The library measured that reorder at 0 B and it is +2 here, so the difference
is worth stating. The reorder exists for the 0..63 displacement window, and at
32 entries the indices were never outside it - ldd Z+32 and ld Z are both two
bytes, so moving them to the front buys nothing. What it does do is take
storage off offset zero, and storage is the member reached by a computed
index: pop() loaded storage[tail] as X = Z + tail with the base free, and now
adds the base with an adiw.

So it is free where the indices were out of the window and a loss where they
were in it, and which of those a consumer gets depends on its ring size and on
whether pop() is out of line - fantemp's is. Filed upstream with the
disassembly; nothing to work around here, and 8382 of 32768 is not a budget
question.

Everything else crossed is inert for this firmware: no i2c, no eeprom writer,
no spare vectors, and percent_t already reached through ::of().

Five tests green in both modes, cross-mode identity held.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-23 02:20:57 +02:00
parent 5244953654
commit bf18f99635
3 changed files with 3 additions and 3 deletions

View File

@@ -66,7 +66,7 @@ cmake --preset atmega328p-generated
cmake --build --preset atmega328p-generated
```
The firmware is **8380 B** of flash, byte-identical between the generated and
The firmware is **8382 B** of flash, byte-identical between the generated and
reflect modes, and `ctest` holds it to that number.
## Atmel Studio