v0.32.1 — i64 popcnt clobber + div_s overflow trap (#632/#633)
Two gale-filed silent i64 miscompiles fixed same-day, plus two latent bugs the class audit surfaced in the same encoder arm.
Fixed
- i64.popcnt result clobbered by its own scratch restore (#632, BOTH ISAs). The expansion could land its total in a register inside its own
POPrestore set. Structural fix: the total crosses the restore in R12 (never allocatable, never restored) — collision impossible by construction. Class audit swept every push/pop-scratch expansion on both ISAs: I64Popcnt was the only affected op. Bonus latent fixes in the same arm: entry-marshal clobber for pairs at (R3,R4); 3-bit T1 fields silently corrupting R8. Differential 6/11 mismatch → 11/11. - i64.div_s(INT64_MIN, -1) returned INT64_MIN instead of trapping (#633). Overflow guard added to the i64 fixed-ABI path (both ISAs), mirroring the existing i32 guard. The rem_s twin stays correct:
i64.rem_s(INT64_MIN,-1)returns 0 without trapping, pinned by unit tests. Differential 2 mismatch → 16/16.
Frozen anchors untouched; estimator re-aligned. Note: platform binaries attach ~10 min after the tag (release workflow).
🤖 Generated with Claude Code