Skip to content

Commit ebcb372

Browse files
avrabeclaude
andauthored
chore(release): v0.41.0 — f32 op-completeness (#719) + f32 soundness CI gate (#712) (#722)
#719: f32.store/abs/neg/copysign + local.set/tee + mixed f32/int AAPCS-VFP params (156/156 vs wasmtime, ~18 falcon f32 skips cleared; f32-across-call declined loudly, f64 = phase 2). #712: all six f32 compares gated (84/84) + the f32 soundness differentials CI-wired + NaN-aware compare (§4.3.3 non-determinism). Pin sweep 0.40.0→0.41.0 incl. npm; claim gate 17/17. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 91808b2 commit ebcb372

15 files changed

Lines changed: 78 additions & 47 deletions

File tree

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.41.0] - 2026-07-11
11+
12+
**f32 op-completeness for falcon + a soundness-gate hardening.**
13+
14+
### Added
15+
16+
- **f32 op-completeness (#719, #369, GI-FPU-002).** After v0.40.0 landed f32
17+
load/reinterpret, falcon's float functions skipped on the next unsupported op.
18+
Now lowered: `f32.store` (`VMOV Rn,Sn` + the proven i32.store address path),
19+
`f32.abs`/`f32.neg`/`f32.copysign` (sign-bit ops, verified against ±0.0, ±inf,
20+
NaN-sign), `f32.local.set`/`tee` (VFP home write-back), and **mixed f32/int
21+
parameter lists** (AAPCS-VFP independent register pools — `(param i32 f32)`
22+
i32 in R0, f32 in S0). 156/156 bit-exact vs wasmtime on cortex-m4f. This clears
23+
~18 of falcon's remaining f32 skips. `f32` live across a call (S0–S15
24+
caller-saved spill/rehome) is declined LOUDLY — the honest-skip, a documented
25+
follow-on; f64 is phase 2.
26+
27+
### Changed
28+
29+
- **The f32 soundness oracles are now CI-gated (#712).** #712 reported all six
30+
f32 comparisons returning value-independent wrong results — the `MOVS`-after-
31+
`VMRS` flag clobber, already fixed in v0.40.0 (#716) but only *gated* on `flt`/
32+
`fgt`, leaving `eq`/`ne`/`le`/`ge` fixed-but-ungated (the vacuous-harness
33+
pattern that let the bug ship). Now: the compare oracle covers all six
34+
(84/84), and the f32 soundness differentials (compares + trunc-trap +
35+
load/reinterpret + the #719 op set) run in CI on every PR — the f32 path can no
36+
longer silently regress. Also made the differential NaN-aware: WASM leaves a
37+
NaN result's sign/payload non-deterministic (§4.3.3), so `f32.div(-0.0,0.0)` is
38+
compared as NaN==NaN, not bit-exact (which diverged by wasmtime version), while
39+
signed-zero and ±inf stay bit-exact.
40+
1041
## [0.40.0] - 2026-07-11
1142

1243
**A five-lane North-Star feature hub: the f32 hard-float path completes and

Cargo.lock

Lines changed: 18 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ resolver = "2"
2828
# semver to publish, so the convention now catches up: workspace
2929
# version follows the release tag, bumped pre-tag in the release
3030
# checklist. See docs/release-process.md.
31-
version = "0.40.0"
31+
version = "0.41.0"
3232
edition = "2024"
3333
rust-version = "1.88"
3434
authors = ["PulseEngine Team"]

MODULE.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module(
77
name = "synth",
88
# Kept in lockstep with [workspace.package] version in Cargo.toml.
99
# Both are bumped pre-tag — see docs/release-process.md.
10-
version = "0.40.0",
10+
version = "0.41.0",
1111
)
1212

1313
# Bazel dependencies

crates/synth-backend-aarch64/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "AArch64 (A64) host-native backend for synth — integer subset (milestone 1, #538)"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.40.0" }
14+
synth-core = { path = "../synth-core", version = "0.41.0" }
1515
thiserror.workspace = true
1616
tracing.workspace = true

crates/synth-backend-awsm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "aWsm backend integration for the Synth compiler"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.40.0" }
14+
synth-core = { path = "../synth-core", version = "0.41.0" }
1515
anyhow.workspace = true
1616
thiserror.workspace = true

crates/synth-backend-riscv/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ categories.workspace = true
1111
description = "RISC-V encoder, ELF builder, PMP allocator, and bare-metal startup for synth"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.40.0" }
15-
synth-synthesis = { path = "../synth-synthesis", version = "0.40.0" }
14+
synth-core = { path = "../synth-core", version = "0.41.0" }
15+
synth-synthesis = { path = "../synth-synthesis", version = "0.41.0" }
1616
anyhow.workspace = true
1717
thiserror.workspace = true
1818
tracing.workspace = true

crates/synth-backend-wasker/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "Wasker backend integration for the Synth compiler"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.40.0" }
14+
synth-core = { path = "../synth-core", version = "0.41.0" }
1515
anyhow.workspace = true
1616
thiserror.workspace = true

crates/synth-backend/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ default = ["arm-cortex-m"]
1515
arm-cortex-m = ["synth-synthesis"]
1616

1717
[dependencies]
18-
synth-core = { path = "../synth-core", version = "0.40.0" }
19-
synth-synthesis = { path = "../synth-synthesis", version = "0.40.0", optional = true }
18+
synth-core = { path = "../synth-core", version = "0.41.0" }
19+
synth-synthesis = { path = "../synth-synthesis", version = "0.41.0", optional = true }
2020
anyhow.workspace = true
2121
thiserror.workspace = true
2222

2323
[dev-dependencies]
2424
# #667 move 2: the i64 pseudo-op expansion certification oracle
2525
# (tests/i64_expansion_certification.rs) feeds THIS crate's emitted encoder
2626
# bytes to the synth-verify expansion validator. Dev-only — no prod-dep edge.
27-
synth-verify = { path = "../synth-verify", version = "0.40.0", features = ["arm"] }
27+
synth-verify = { path = "../synth-verify", version = "0.41.0", features = ["arm"] }

crates/synth-cli/Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,23 @@ verify = ["synth-verify"]
4444
# Path deps carry `version` so `cargo publish` rewrites them to the
4545
# crates.io coordinate. Bumping the workspace version requires
4646
# updating these in lockstep — see docs/release-process.md.
47-
synth-core = { path = "../synth-core", version = "0.40.0" }
48-
synth-frontend = { path = "../synth-frontend", version = "0.40.0" }
49-
synth-synthesis = { path = "../synth-synthesis", version = "0.40.0" }
50-
synth-backend = { path = "../synth-backend", version = "0.40.0" }
47+
synth-core = { path = "../synth-core", version = "0.41.0" }
48+
synth-frontend = { path = "../synth-frontend", version = "0.41.0" }
49+
synth-synthesis = { path = "../synth-synthesis", version = "0.41.0" }
50+
synth-backend = { path = "../synth-backend", version = "0.41.0" }
5151

5252
# AArch64 host-native backend (#538) — small pure-Rust crate, always on.
53-
synth-backend-aarch64 = { path = "../synth-backend-aarch64", version = "0.40.0" }
53+
synth-backend-aarch64 = { path = "../synth-backend-aarch64", version = "0.41.0" }
5454

5555
# Optional external backends
56-
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.40.0", optional = true }
57-
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.40.0", optional = true }
58-
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.40.0", optional = true }
56+
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.41.0", optional = true }
57+
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.41.0", optional = true }
58+
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.41.0", optional = true }
5959

6060
# Optional translation validation — pure-Rust ordeal engine by default (#553),
6161
# no C++ toolchain needed. For the Z3 differential oracle build with
6262
# `--features verify,synth-verify/z3-solver` (+ SYNTH_SOLVER_DIFF=1 at runtime).
63-
synth-verify = { path = "../synth-verify", version = "0.40.0", optional = true, features = ["arm"] }
63+
synth-verify = { path = "../synth-verify", version = "0.41.0", optional = true, features = ["arm"] }
6464

6565
# Optional PulseEngine WASM optimizer
6666
# Uncomment when loom crate is available:

0 commit comments

Comments
 (0)