From e4ee44178671238387cd731aed53ebcb6fb3e43b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Aug 2022 17:23:55 +0300 Subject: [PATCH 1/3] init --- std/assembly/math.ts | 16 +- tests/compiler/std/math.debug.wat | 291 +++++++++++++++++------------- 2 files changed, 182 insertions(+), 125 deletions(-) diff --git a/std/assembly/math.ts b/std/assembly/math.ts index 42b9fdbbc6..04a63308f1 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1444,8 +1444,12 @@ export namespace NativeMath { // @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 @@ -2742,8 +2746,12 @@ export namespace NativeMathf { // @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 diff --git a/tests/compiler/std/math.debug.wat b/tests/compiler/std/math.debug.wat index 79898dd3a8..53c3d0e518 100644 --- a/tests/compiler/std/math.debug.wat +++ b/tests/compiler/std/math.debug.wat @@ -11391,21 +11391,28 @@ (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 - 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$4 - f64.le - select + block $~lib/math/NativeMath.round|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.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$4 + f64.le + select + br $~lib/math/NativeMath.round|inlined.0 + end local.get $expected local.get $error local.get $flags @@ -11414,21 +11421,28 @@ (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 - f32.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f32.const 1 - f32.sub - local.get $var$5 - f32.const 0.5 - f32.sub - local.get $var$4 - f32.le - select + block $~lib/math/NativeMathf.round|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.ceil + local.set $var$5 + local.get $var$5 + local.get $var$5 + f32.const 1 + f32.sub + local.get $var$5 + f32.const 0.5 + f32.sub + local.get $var$4 + f32.le + select + br $~lib/math/NativeMathf.round|inlined.0 + end local.get $expected local.get $error local.get $flags @@ -47644,93 +47658,128 @@ 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 + block $~lib/math/NativeMath.round|inlined.1 (result f64) + f64.const 9007199254740990 + local.set $var$0 + i32.const 0 + i32.const 0 + i32.gt_s + drop + 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 + br $~lib/math/NativeMath.round|inlined.1 + end f64.const 9007199254740990 f64.eq drop - 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 + block $~lib/math/NativeMath.round|inlined.2 (result f64) + f64.const -9007199254740990 + local.set $var$5 + i32.const 0 + i32.const 0 + i32.gt_s + drop + local.get $var$5 + f64.ceil + local.set $var$0 + local.get $var$0 + local.get $var$0 + f64.const 1 + f64.sub + local.get $var$0 + f64.const 0.5 + f64.sub + local.get $var$5 + f64.le + select + br $~lib/math/NativeMath.round|inlined.2 + end f64.const -9007199254740990 f64.eq drop - 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 + block $~lib/math/NativeMath.round|inlined.3 (result f64) + f64.const 9007199254740991 + local.set $var$0 + i32.const 0 + i32.const 0 + i32.gt_s + drop + 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 + br $~lib/math/NativeMath.round|inlined.3 + end f64.const 9007199254740991 f64.eq drop - 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 + block $~lib/math/NativeMath.round|inlined.4 (result f64) + f64.const -9007199254740991 + local.set $var$5 + i32.const 0 + i32.const 0 + i32.gt_s + drop + local.get $var$5 + f64.ceil + local.set $var$0 + local.get $var$0 + local.get $var$0 + f64.const 1 + f64.sub + local.get $var$0 + f64.const 0.5 + f64.sub + local.get $var$5 + f64.le + select + br $~lib/math/NativeMath.round|inlined.4 + end f64.const -9007199254740991 f64.eq drop - 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 + block $~lib/math/NativeMath.round|inlined.5 (result f64) + f64.const -1797693134862315708145274e284 + local.set $var$0 + i32.const 0 + i32.const 0 + i32.gt_s + drop + 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 + br $~lib/math/NativeMath.round|inlined.5 + end f64.const -1797693134862315708145274e284 f64.eq drop @@ -48369,8 +48418,8 @@ unreachable end f64.const 0 - local.set $var$0 - local.get $var$0 + local.set $var$5 + local.get $var$5 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48382,8 +48431,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 @@ -48395,8 +48444,8 @@ i32.eq drop f64.const 1 - local.set $var$0 - local.get $var$0 + local.set $var$5 + local.get $var$5 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48408,8 +48457,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 @@ -48421,8 +48470,8 @@ i32.eq drop f64.const nan:0x8000000000000 - local.set $var$0 - local.get $var$0 + local.set $var$5 + local.get $var$5 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48435,8 +48484,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 @@ -48448,8 +48497,8 @@ i32.eq drop f64.const inf - local.set $var$0 - local.get $var$0 + local.set $var$5 + local.get $var$5 i64.reinterpret_f64 i64.const 63 i64.shr_u @@ -48462,8 +48511,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 From 3308b83833558aca6d443a09add66eb435eb4c22 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Aug 2022 17:30:32 +0300 Subject: [PATCH 2/3] remove inline for round and sign --- std/assembly/math.ts | 8 - tests/compiler/std/math.debug.wat | 347 ++++++++++++------------------ 2 files changed, 141 insertions(+), 214 deletions(-) diff --git a/std/assembly/math.ts b/std/assembly/math.ts index 04a63308f1..2c3dfe8029 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1441,8 +1441,6 @@ export namespace NativeMath { return reinterpret(r) - 1; } - // @ts-ignore: decorator - @inline export function round(x: f64): f64 { if (ASC_SHRINK_LEVEL > 0) { return builtin_ceil(x) - f64(builtin_ceil(x) - 0.5 > x); @@ -1452,8 +1450,6 @@ export namespace NativeMath { } } - // @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; @@ -2743,8 +2739,6 @@ export namespace NativeMathf { return reinterpret((r >> 9) | (127 << 23)) - 1.0; } - // @ts-ignore: decorator - @inline export function round(x: f32): f32 { if (ASC_SHRINK_LEVEL > 0) { return builtin_ceil(x) - f32(builtin_ceil(x) - 0.5 > x); @@ -2754,8 +2748,6 @@ export namespace NativeMathf { } } - // @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; diff --git a/tests/compiler/std/math.debug.wat b/tests/compiler/std/math.debug.wat index 53c3d0e518..62f5c48912 100644 --- a/tests/compiler/std/math.debug.wat +++ b/tests/compiler/std/math.debug.wat @@ -11388,92 +11388,89 @@ f32.const 1 f32.sub ) + (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$1 + local.get $var$1 + local.get $var$1 + f64.const 1 + f64.sub + local.get $var$1 + f64.const 0.5 + f64.sub + 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 $var$4 f64) - (local $var$5 f64) - block $~lib/math/NativeMath.round|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.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$4 - f64.le - select - br $~lib/math/NativeMath.round|inlined.0 - end + local.get $value + call $~lib/math/NativeMath.round local.get $expected local.get $error local.get $flags call $std/math/check ) + (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$1 + local.get $var$1 + local.get $var$1 + f32.const 1 + f32.sub + local.get $var$1 + f32.const 0.5 + f32.sub + 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 $var$4 f32) - (local $var$5 f32) - block $~lib/math/NativeMathf.round|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.ceil - local.set $var$5 - local.get $var$5 - local.get $var$5 - f32.const 1 - f32.sub - local.get $var$5 - f32.const 0.5 - f32.sub - local.get $var$4 - f32.le - select - br $~lib/math/NativeMathf.round|inlined.0 - end + local.get $value + call $~lib/math/NativeMathf.round local.get $expected local.get $error local.get $flags call $std/math/check ) - (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 + (func $~lib/math/NativeMath.sign (param $x f64) (result f64) + i32.const 0 + i32.const 0 + i32.gt_s + drop + local.get $x + f64.const 0 + f64.gt + if (result f64) + f64.const 1 + else + local.get $x f64.const 0 - f64.gt + f64.lt if (result f64) - f64.const 1 + 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 + local.get $x end - br $~lib/math/NativeMath.sign|inlined.0 end + return + ) + (func $std/math/test_sign (param $value f64) (param $expected f64) (param $error f64) (param $flags i32) (result i32) + local.get $value + call $~lib/math/NativeMath.sign local.get $expected local.get $error local.get $flags @@ -11489,32 +11486,31 @@ i32.const 0 end ) - (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 + (func $~lib/math/NativeMathf.sign (param $x f32) (result f32) + i32.const 0 + i32.const 0 + i32.gt_s + drop + local.get $x + f32.const 0 + f32.gt + if (result f32) + f32.const 1 + else + local.get $x f32.const 0 - f32.gt + f32.lt if (result f32) - f32.const 1 + 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 + local.get $x end - br $~lib/math/NativeMathf.sign|inlined.0 end + return + ) + (func $std/math/test_signf (param $value f32) (param $expected f32) (param $error f32) (param $flags i32) (result i32) + local.get $value + call $~lib/math/NativeMathf.sign local.get $expected local.get $error local.get $flags @@ -16282,7 +16278,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 @@ -47658,131 +47653,71 @@ call $~lib/builtins/abort unreachable end - block $~lib/math/NativeMath.round|inlined.1 (result f64) - f64.const 9007199254740990 - local.set $var$0 - i32.const 0 - i32.const 0 - i32.gt_s - drop - 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 - br $~lib/math/NativeMath.round|inlined.1 - end + f64.const 9007199254740990 + call $~lib/math/NativeMath.round f64.const 9007199254740990 f64.eq - drop - block $~lib/math/NativeMath.round|inlined.2 (result f64) - f64.const -9007199254740990 - local.set $var$5 - i32.const 0 + i32.eqz + if i32.const 0 - i32.gt_s - drop - local.get $var$5 - f64.ceil - local.set $var$0 - local.get $var$0 - local.get $var$0 - f64.const 1 - f64.sub - local.get $var$0 - f64.const 0.5 - f64.sub - local.get $var$5 - f64.le - select - br $~lib/math/NativeMath.round|inlined.2 + i32.const 32 + i32.const 3052 + i32.const 1 + call $~lib/builtins/abort + unreachable end f64.const -9007199254740990 + call $~lib/math/NativeMath.round + f64.const -9007199254740990 f64.eq - drop - block $~lib/math/NativeMath.round|inlined.3 (result f64) - f64.const 9007199254740991 - local.set $var$0 - i32.const 0 + i32.eqz + if i32.const 0 - i32.gt_s - drop - 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 - br $~lib/math/NativeMath.round|inlined.3 + i32.const 32 + i32.const 3053 + i32.const 1 + call $~lib/builtins/abort + unreachable end f64.const 9007199254740991 + call $~lib/math/NativeMath.round + f64.const 9007199254740991 f64.eq - drop - block $~lib/math/NativeMath.round|inlined.4 (result f64) - f64.const -9007199254740991 - local.set $var$5 - i32.const 0 + i32.eqz + if i32.const 0 - i32.gt_s - drop - local.get $var$5 - f64.ceil - local.set $var$0 - local.get $var$0 - local.get $var$0 - f64.const 1 - f64.sub - local.get $var$0 - f64.const 0.5 - f64.sub - local.get $var$5 - f64.le - select - br $~lib/math/NativeMath.round|inlined.4 + i32.const 32 + i32.const 3054 + i32.const 1 + call $~lib/builtins/abort + unreachable end f64.const -9007199254740991 + call $~lib/math/NativeMath.round + f64.const -9007199254740991 f64.eq - drop - block $~lib/math/NativeMath.round|inlined.5 (result f64) - f64.const -1797693134862315708145274e284 - local.set $var$0 - i32.const 0 + i32.eqz + if i32.const 0 - i32.gt_s - drop - 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 - br $~lib/math/NativeMath.round|inlined.5 + i32.const 32 + i32.const 3055 + i32.const 1 + call $~lib/builtins/abort + unreachable end f64.const -1797693134862315708145274e284 + 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 @@ -48418,8 +48353,8 @@ unreachable end 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 @@ -48444,8 +48379,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 @@ -48470,8 +48405,8 @@ i32.eq drop f64.const nan:0x8000000000000 - 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 @@ -48497,8 +48432,8 @@ i32.eq drop f64.const inf - 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 From 966379eb20974be1607ad11b58a39b9d3595fad5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Aug 2022 17:35:44 +0300 Subject: [PATCH 3/3] refactor sign for using explicit select command --- std/assembly/math.ts | 8 +++---- tests/compiler/std/math.debug.wat | 40 +++++++++++++------------------ 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/std/assembly/math.ts b/std/assembly/math.ts index 2c3dfe8029..b0481dad0a 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1452,9 +1452,9 @@ export namespace NativeMath { 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); } } @@ -2750,9 +2750,9 @@ export namespace NativeMathf { 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 62f5c48912..ea4744da8b 100644 --- a/tests/compiler/std/math.debug.wat +++ b/tests/compiler/std/math.debug.wat @@ -11451,21 +11451,17 @@ 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 - if (result f64) - f64.const 1 - else - local.get $x - f64.const 0 - f64.lt - if (result f64) - f64.const -1 - else - local.get $x - end - end + select return ) (func $std/math/test_sign (param $value f64) (param $expected f64) (param $error f64) (param $flags i32) (result i32) @@ -11491,21 +11487,17 @@ 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 - if (result f32) - f32.const 1 - else - local.get $x - f32.const 0 - f32.lt - if (result f32) - f32.const -1 - else - local.get $x - end - end + select return ) (func $std/math/test_signf (param $value f32) (param $expected f32) (param $error f32) (param $flags i32) (result i32)