Skip to content

Commit d00c96f

Browse files
Add round() → f64.nearest support in WAT code generator
The WAT generator was silently emitting `f64.const 0` for calls to round()/arrondir(), causing incorrect results (always 0) in WASM modules that use rounding. Add _ROUND_NAMES to the builtin alias set and lower round(x) to the f64.nearest instruction. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 74f6e0a commit d00c96f

2 files changed

Lines changed: 6 additions & 0 deletions

File tree

multilingualprogramming/codegen/wat_generator.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
_FILTER_NAMES,
8484
_INPUT_NAMES,
8585
_INT_NAMES,
86+
_ROUND_NAMES,
8687
_LEN_NAMES,
8788
_MAP_NAMES,
8889
_MAX_NAMES,
@@ -1133,6 +1134,10 @@ def _gen_expr(self, node, indent: str): # noqa: C901 # pylint: disable=too-man
11331134
elif resolved_fname in {"math.sqrt", "sqrt"} and len(node.args) == 1:
11341135
self._gen_expr(node.args[0], indent)
11351136
self._emit(f"{indent}f64.sqrt")
1137+
elif fname in _ROUND_NAMES and len(node.args) == 1:
1138+
# round(x) → f64.nearest (IEEE 754 round-half-to-even)
1139+
self._gen_expr(node.args[0], indent)
1140+
self._emit(f"{indent}f64.nearest")
11361141
elif resolved_fname in {"math.floor", "floor"} and len(node.args) == 1:
11371142
self._gen_expr(node.args[0], indent)
11381143
self._emit(f"{indent}f64.floor")

multilingualprogramming/codegen/wat_generator_support.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def _aliases_for(canonical: str) -> frozenset:
4040
_MAX_NAMES = _aliases_for("max")
4141
_LEN_NAMES = _aliases_for("len")
4242
_INT_NAMES = _aliases_for("int")
43+
_ROUND_NAMES = _aliases_for("round")
4344
_POW_NAMES = _aliases_for("pow")
4445
_SUM_NAMES = _aliases_for("sum")
4546
_LIST_NAMES = _aliases_for("list")

0 commit comments

Comments
 (0)