diff options
| author | nsfisis <nsfisis@gmail.com> | 2024-06-29 17:25:26 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2024-06-29 17:25:26 +0900 |
| commit | e5ddbd619b1f85a3f67fe8e09c48b4761d9fe177 (patch) | |
| tree | 420cf1d5050dc3632f1d7f8835af596860a0af6a /src | |
| parent | 80b9584de4b9c2b0601c709877b50d589aece57d (diff) | |
| download | php-waddiwasi-e5ddbd619b1f85a3f67fe8e09c48b4761d9fe177.tar.gz php-waddiwasi-e5ddbd619b1f85a3f67fe8e09c48b4761d9fe177.tar.zst php-waddiwasi-e5ddbd619b1f85a3f67fe8e09c48b4761d9fe177.zip | |
fix: some float ops
Diffstat (limited to 'src')
| -rw-r--r-- | src/Execution/Runtime.php | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/Execution/Runtime.php b/src/Execution/Runtime.php index 3c8592e..4d74b9a 100644 --- a/src/Execution/Runtime.php +++ b/src/Execution/Runtime.php @@ -27,9 +27,11 @@ use function array_reverse; use function assert; use function ceil; use function count; +use function fdiv; use function floor; use function intdiv; use function is_int; +use function is_nan; use function max; use function min; use function pack; @@ -658,6 +660,11 @@ final class Runtime { $c2 = $this->stack->popFloat(); $c1 = $this->stack->popFloat(); + if (is_nan($c1) || is_nan($c2)) { + // PHP's standard max() handles NaNs in diffrent way than WebAssembly spec does. + $this->stack->pushValue(NAN); + return; + } $this->stack->pushValue(max($c1, $c2)); } @@ -665,6 +672,11 @@ final class Runtime { $c2 = $this->stack->popFloat(); $c1 = $this->stack->popFloat(); + if (is_nan($c1) || is_nan($c2)) { + // PHP's standard min() handles NaNs in diffrent way than WebAssembly spec does. + $this->stack->pushValue(NAN); + return; + } $this->stack->pushValue(min($c1, $c2)); } @@ -784,7 +796,7 @@ final class Runtime { $c2 = $this->stack->popFloat(); $c1 = $this->stack->popFloat(); - $this->stack->pushValue($c1 / $c2); + $this->stack->pushValue(fdiv($c1, $c2)); } private function execInstrNumericF64Eq(Instrs\Numeric\F64Eq $instr): void @@ -832,6 +844,11 @@ final class Runtime { $c2 = $this->stack->popFloat(); $c1 = $this->stack->popFloat(); + if (is_nan($c1) || is_nan($c2)) { + // PHP's standard max() handles NaNs in diffrent way than WebAssembly spec does. + $this->stack->pushValue(NAN); + return; + } $this->stack->pushValue(max($c1, $c2)); } @@ -839,6 +856,11 @@ final class Runtime { $c2 = $this->stack->popFloat(); $c1 = $this->stack->popFloat(); + if (is_nan($c1) || is_nan($c2)) { + // PHP's standard min() handles NaNs in diffrent way than WebAssembly spec does. + $this->stack->pushValue(NAN); + return; + } $this->stack->pushValue(min($c1, $c2)); } |
