diff --git a/std/assembly/math.ts b/std/assembly/math.ts index 42b9fdbbc6..b0481dad0a 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1441,20 +1441,20 @@ export namespace NativeMath { return reinterpret(r) - 1; } - // @ts-ignore: decorator - @inline export function round(x: f64): f64 { - let roundUp = builtin_ceil(x); - return select(roundUp, roundUp - 1.0, roundUp - 0.5 <= x); + if (ASC_SHRINK_LEVEL > 0) { + return builtin_ceil(x) - f64(builtin_ceil(x) - 0.5 > x); + } else { + let roundUp = builtin_ceil(x); + return select(roundUp, roundUp - 1.0, roundUp - 0.5 <= x); + } } - // @ts-ignore: decorator - @inline export function sign(x: f64): f64 { if (ASC_SHRINK_LEVEL > 0) { - return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x; + return select(builtin_copysign(1, x), x, builtin_abs(x) > 0); } else { - return x > 0 ? 1 : x < 0 ? -1 : x; + return select(1, select(-1, x, x < 0), x > 0); } } @@ -2739,20 +2739,20 @@ export namespace NativeMathf { return reinterpret((r >> 9) | (127 << 23)) - 1.0; } - // @ts-ignore: decorator - @inline export function round(x: f32): f32 { - let roundUp = builtin_ceil(x); - return select(roundUp, roundUp - 1.0, roundUp - 0.5 <= x); + if (ASC_SHRINK_LEVEL > 0) { + return builtin_ceil(x) - f32(builtin_ceil(x) - 0.5 > x); + } else { + let roundUp = builtin_ceil(x); + return select(roundUp, roundUp - 1.0, roundUp - 0.5 <= x); + } } - // @ts-ignore: decorator - @inline export function sign(x: f32): f32 { if (ASC_SHRINK_LEVEL > 0) { - return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x; + return select(builtin_copysign(1, x), x, builtin_abs(x) > 0); } else { - return x > 0 ? 1 : x < 0 ? -1 : x; + return select(1, select(-1, x, x < 0), x > 0); } } diff --git a/tests/compiler/std/math.debug.wat b/tests/compiler/std/math.debug.wat index 79898dd3a8..ea4744da8b 100644 --- a/tests/compiler/std/math.debug.wat +++ b/tests/compiler/std/math.debug.wat @@ -11388,78 +11388,85 @@ f32.const 1 f32.sub ) - (func $std/math/test_round (param $value f64) (param $expected f64) (param $error f64) (param $flags i32) (result i32) - (local $var$4 f64) - (local $var$5 f64) - local.get $value - local.set $var$4 - local.get $var$4 + (func $~lib/math/NativeMath.round (param $x f64) (result f64) + (local $var$1 f64) + i32.const 0 + i32.const 0 + i32.gt_s + drop + local.get $x f64.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 + local.set $var$1 + local.get $var$1 + local.get $var$1 f64.const 1 f64.sub - local.get $var$5 + local.get $var$1 f64.const 0.5 f64.sub - local.get $var$4 + local.get $x f64.le select + return + ) + (func $std/math/test_round (param $value f64) (param $expected f64) (param $error f64) (param $flags i32) (result i32) + local.get $value + call $~lib/math/NativeMath.round local.get $expected local.get $error local.get $flags call $std/math/check ) - (func $std/math/test_roundf (param $value f32) (param $expected f32) (param $error f32) (param $flags i32) (result i32) - (local $var$4 f32) - (local $var$5 f32) - local.get $value - local.set $var$4 - local.get $var$4 + (func $~lib/math/NativeMathf.round (param $x f32) (result f32) + (local $var$1 f32) + i32.const 0 + i32.const 0 + i32.gt_s + drop + local.get $x f32.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 + local.set $var$1 + local.get $var$1 + local.get $var$1 f32.const 1 f32.sub - local.get $var$5 + local.get $var$1 f32.const 0.5 f32.sub - local.get $var$4 + local.get $x f32.le select + return + ) + (func $std/math/test_roundf (param $value f32) (param $expected f32) (param $error f32) (param $flags i32) (result i32) + local.get $value + call $~lib/math/NativeMathf.round local.get $expected local.get $error local.get $flags call $std/math/check ) + (func $~lib/math/NativeMath.sign (param $x f64) (result f64) + i32.const 0 + i32.const 0 + i32.gt_s + drop + f64.const 1 + f64.const -1 + local.get $x + local.get $x + f64.const 0 + f64.lt + select + local.get $x + f64.const 0 + f64.gt + select + return + ) (func $std/math/test_sign (param $value f64) (param $expected f64) (param $error f64) (param $flags i32) (result i32) - (local $var$4 f64) - block $~lib/math/NativeMath.sign|inlined.0 (result f64) - local.get $value - local.set $var$4 - i32.const 0 - i32.const 0 - i32.gt_s - drop - local.get $var$4 - f64.const 0 - f64.gt - if (result f64) - f64.const 1 - else - local.get $var$4 - f64.const 0 - f64.lt - if (result f64) - f64.const -1 - else - local.get $var$4 - end - end - br $~lib/math/NativeMath.sign|inlined.0 - end + local.get $value + call $~lib/math/NativeMath.sign local.get $expected local.get $error local.get $flags @@ -11475,32 +11482,27 @@ i32.const 0 end ) + (func $~lib/math/NativeMathf.sign (param $x f32) (result f32) + i32.const 0 + i32.const 0 + i32.gt_s + drop + f32.const 1 + f32.const -1 + local.get $x + local.get $x + f32.const 0 + f32.lt + select + local.get $x + f32.const 0 + f32.gt + select + return + ) (func $std/math/test_signf (param $value f32) (param $expected f32) (param $error f32) (param $flags i32) (result i32) - (local $var$4 f32) - block $~lib/math/NativeMathf.sign|inlined.0 (result f32) - local.get $value - local.set $var$4 - i32.const 0 - i32.const 0 - i32.gt_s - drop - local.get $var$4 - f32.const 0 - f32.gt - if (result f32) - f32.const 1 - else - local.get $var$4 - f32.const 0 - f32.lt - if (result f32) - f32.const -1 - else - local.get $var$4 - end - end - br $~lib/math/NativeMathf.sign|inlined.0 - end + local.get $value + call $~lib/math/NativeMathf.sign local.get $expected local.get $error local.get $flags @@ -16268,7 +16270,6 @@ (local $var$2 i32) (local $var$3 i64) (local $var$4 f32) - (local $var$5 f64) global.get $~lib/math/NativeMath.E global.get $~lib/math/NativeMath.E f64.eq @@ -47645,95 +47646,70 @@ unreachable end f64.const 9007199254740990 - local.set $var$0 - local.get $var$0 - f64.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f64.const 1 - f64.sub - local.get $var$5 - f64.const 0.5 - f64.sub - local.get $var$0 - f64.le - select + call $~lib/math/NativeMath.round f64.const 9007199254740990 f64.eq - drop + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 3052 + i32.const 1 + call $~lib/builtins/abort + unreachable + end f64.const -9007199254740990 - local.set $var$0 - local.get $var$0 - f64.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f64.const 1 - f64.sub - local.get $var$5 - f64.const 0.5 - f64.sub - local.get $var$0 - f64.le - select + call $~lib/math/NativeMath.round f64.const -9007199254740990 f64.eq - drop + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 3053 + i32.const 1 + call $~lib/builtins/abort + unreachable + end f64.const 9007199254740991 - local.set $var$0 - local.get $var$0 - f64.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f64.const 1 - f64.sub - local.get $var$5 - f64.const 0.5 - f64.sub - local.get $var$0 - f64.le - select + call $~lib/math/NativeMath.round f64.const 9007199254740991 f64.eq - drop + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 3054 + i32.const 1 + call $~lib/builtins/abort + unreachable + end f64.const -9007199254740991 - local.set $var$0 - local.get $var$0 - f64.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f64.const 1 - f64.sub - local.get $var$5 - f64.const 0.5 - f64.sub - local.get $var$0 - f64.le - select + call $~lib/math/NativeMath.round f64.const -9007199254740991 f64.eq - drop + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 3055 + i32.const 1 + call $~lib/builtins/abort + unreachable + end f64.const -1797693134862315708145274e284 - local.set $var$0 - local.get $var$0 - f64.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f64.const 1 - f64.sub - local.get $var$5 - f64.const 0.5 - f64.sub - local.get $var$0 - f64.le - select + call $~lib/math/NativeMath.round f64.const -1797693134862315708145274e284 f64.eq - drop + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 3056 + i32.const 1 + call $~lib/builtins/abort + unreachable + end f32.const -8.066848754882812 f32.const -8 f32.const 0 @@ -48382,8 +48358,8 @@ i32.eq drop f64.const -0 - local.set $var$5 - local.get $var$5 + local.set $var$0 + local.get $var$0 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48408,8 +48384,8 @@ i32.eq drop f64.const -1 - local.set $var$5 - local.get $var$5 + local.set $var$0 + local.get $var$0 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48435,8 +48411,8 @@ drop f64.const nan:0x8000000000000 f64.neg - local.set $var$5 - local.get $var$5 + local.set $var$0 + local.get $var$0 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48462,8 +48438,8 @@ drop f64.const inf f64.neg - local.set $var$5 - local.get $var$5 + local.set $var$0 + local.get $var$0 i64.reinterpret_f64 i64.const 63 i64.shr_u