You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Following the milestone-4 float work (#790) and #842 void-block control flow, here is an execution-verified capability map of the aarch64 backend on synth 0.50.0 — what works, and the remaining gaps — to help scope the next milestones. Everything below was compiled with -b aarch64 and run natively on an arm64 host (MAP_JIT), diffed bit-exact against wasmtime: 36 ops, 95 checks, 0 miscompiles.
For "run a real WASM module on aarch64," the gating four are memory + non-param locals + calls + full control flow (if/loop/return) — the compute/ALU/float core is already solid and verified. div/rem/popcnt are smaller, self-contained adds.
Verification harness
A standing execution matrix (synth_aarch64_matrix.sh in our campaign harness) re-runs all 95 native checks each pass and prints the frontier, so each newly-lowered op is execution-verified automatically and any regression is caught. Happy to share it if useful.
Summary
Following the milestone-4 float work (#790) and #842 void-block control flow, here is an execution-verified capability map of the aarch64 backend on synth 0.50.0 — what works, and the remaining gaps — to help scope the next milestones. Everything below was compiled with
-b aarch64and run natively on an arm64 host (MAP_JIT), diffed bit-exact against wasmtime: 36 ops, 95 checks, 0 miscompiles.✅ Works (native-execution verified vs wasmtime)
min(+0,-0)=-0,min(NaN,1)=NaN— scalarfmin/fmax, notfminnm)fmin/fmax, NaN-correct)block/br/br_if(feat(aarch64): void-block control flow — block/br/br_if (#538) #842)🚧 Not yet supported (the ask — roughly in blocker order for general code)
These currently honestly decline (no silent miscompile — good), but block real programs:
i32.load/i32.store(and sub-word/i64 loads) — declined. Biggest blocker for any non-trivial module.localdeclarations beyond params — declined (local.get {i}: non-param locals not yet supported). Blocks almost all real functions.call/call_indirect— declined.if/else,loop,return— declined (onlyblock/br/br_iftoday, so no early-exit or loops).i32/i64div_s/div_u/rem_s/rem_u— declined.i32/i64.popcnt— declined (aarch64 hasCNTon the vector side; needs the fmov/cnt/addv sequence).i64.reinterpret_f64/f64.reinterpret_i64— declined (GI-FPU-001), so f64 bit-round-tripping isn't available.Suggested priority
For "run a real WASM module on aarch64," the gating four are memory + non-param locals + calls + full control flow (if/loop/return) — the compute/ALU/float core is already solid and verified. div/rem/popcnt are smaller, self-contained adds.
Verification harness
A standing execution matrix (
synth_aarch64_matrix.shin our campaign harness) re-runs all 95 native checks each pass and prints the frontier, so each newly-lowered op is execution-verified automatically and any regression is caught. Happy to share it if useful.