diff --git a/package-lock.json b/package-lock.json index ac7902a436..e39fc37819 100644 --- a/package-lock.json +++ b/package-lock.json @@ -713,9 +713,9 @@ "optional": true }, "binaryen": { - "version": "98.0.0-nightly.20201027", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-98.0.0-nightly.20201027.tgz", - "integrity": "sha512-00/IHlumty/5XzJsdaMudayXofJiDb3Ytqqdn7OJBM0L9SuVg0o0xu4l93NVf+hO6jkgXNE1t+LdB0gOdeLdjA==" + "version": "98.0.0-nightly.20201030", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-98.0.0-nightly.20201030.tgz", + "integrity": "sha512-84r0ByOUNmydprOZ43adZyjvLQkPoYMTdzEZdxYC5tnD6cURv1BOj9Ue7eOin3huVCrqTqpaZ2M/wuTETyihNg==" }, "bluebird": { "version": "3.7.2", diff --git a/package.json b/package.json index 468b524a9d..340fb58883 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/AssemblyScript/assemblyscript/issues" }, "dependencies": { - "binaryen": "98.0.0-nightly.20201027", + "binaryen": "98.0.0-nightly.20201030", "long": "^4.0.0", "source-map-support": "^0.5.19", "ts-node": "^6.2.0" diff --git a/src/module.ts b/src/module.ts index 82416c412c..4580482241 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1530,12 +1530,13 @@ export class Module { } if (optimizeLevel >= 3) { passes.push("flatten"); + passes.push("vacuum"); passes.push("simplify-locals-notee-nostructure"); passes.push("merge-locals"); - passes.push("vacuum"); passes.push("code-folding"); passes.push("flatten"); + passes.push("vacuum"); passes.push("local-cse"); passes.push("reorder-locals"); } @@ -1550,8 +1551,8 @@ export class Module { if (optimizeLevel >= 3 || shrinkLevel >= 1) { passes.push("dce"); } - passes.push("remove-unused-brs"); passes.push("remove-unused-names"); + passes.push("remove-unused-brs"); if (optimizeLevel >= 3 || shrinkLevel >= 2) { passes.push("inlining"); passes.push("precompute-propagate"); diff --git a/tests/compiler/extends-baseaggregate.optimized.wat b/tests/compiler/extends-baseaggregate.optimized.wat index a40274895b..7895d93b48 100644 --- a/tests/compiler/extends-baseaggregate.optimized.wat +++ b/tests/compiler/extends-baseaggregate.optimized.wat @@ -2074,10 +2074,45 @@ unreachable end ) - (func $~lib/array/Array#__visit_impl (param $0 i32) (param $1 i32) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) + block $folding-inner0 + block $switch$1$default + block $switch$1$case$6 + block $switch$1$case$4 + block $switch$1$case$2 + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$4 $switch$1$case$6 $switch$1$case$4 $switch$1$case$6 $folding-inner0 $folding-inner0 $switch$1$default + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + local.get $1 + call $~lib/rt/pure/__visit + end + return + end + local.get $0 + i32.load offset=16 + local.tee $0 + if + local.get $0 + local.get $1 + call $~lib/rt/pure/__visit + end + return + end + unreachable + end local.get $0 i32.load offset=4 local.tee $2 @@ -2112,51 +2147,4 @@ local.get $1 call $~lib/rt/pure/__visit ) - (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) - block $switch$1$default - block $switch$1$case$10 - block $switch$1$case$9 - block $switch$1$case$6 - block $switch$1$case$4 - block $switch$1$case$2 - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$4 $switch$1$case$6 $switch$1$case$4 $switch$1$case$6 $switch$1$case$9 $switch$1$case$10 $switch$1$default - end - return - end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - local.get $1 - call $~lib/rt/pure/__visit - end - return - end - local.get $0 - i32.load offset=16 - local.tee $0 - if - local.get $0 - local.get $1 - call $~lib/rt/pure/__visit - end - return - end - local.get $0 - local.get $1 - call $~lib/array/Array#__visit_impl - return - end - local.get $0 - local.get $1 - call $~lib/array/Array#__visit_impl - return - end - unreachable - ) ) diff --git a/tests/compiler/memmove.optimized.wat b/tests/compiler/memmove.optimized.wat index 5c8b86081d..ada5b21655 100644 --- a/tests/compiler/memmove.optimized.wat +++ b/tests/compiler/memmove.optimized.wat @@ -13,41 +13,80 @@ (local $4 i32) (local $5 i32) local.get $0 - local.set $5 - local.get $0 - local.get $1 - i32.eq - if - local.get $5 - return - end - local.get $0 - local.get $1 - i32.lt_u - if - local.get $1 - i32.const 7 - i32.and + block $folding-inner0 local.get $0 - i32.const 7 - i32.and + local.get $1 i32.eq + br_if $folding-inner0 + local.get $0 + local.get $1 + i32.lt_u if - loop $while-continue|0 - local.get $0 - i32.const 7 - i32.and - if - local.get $2 - i32.eqz + local.get $1 + i32.const 7 + i32.and + local.get $0 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|0 + local.get $0 + i32.const 7 + i32.and if - local.get $5 - return + local.get $2 + i32.eqz + br_if $folding-inner0 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + local.get $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 + local.get $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 + i32.load8_u + i32.store8 + br $while-continue|0 end + end + loop $while-continue|1 local.get $2 - i32.const 1 - i32.sub - local.set $2 + i32.const 8 + i32.ge_u + if + local.get $0 + local.get $1 + i64.load + i64.store + local.get $2 + i32.const 8 + i32.sub + local.set $2 + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + br $while-continue|1 + end + end + end + loop $while-continue|2 + local.get $2 + if local.get $0 local.tee $3 i32.const 1 @@ -62,133 +101,85 @@ local.get $4 i32.load8_u i32.store8 - br $while-continue|0 - end - end - loop $while-continue|1 - local.get $2 - i32.const 8 - i32.ge_u - if - local.get $0 - local.get $1 - i64.load - i64.store local.get $2 - i32.const 8 + i32.const 1 i32.sub local.set $2 - local.get $0 - i32.const 8 - i32.add - local.set $0 - local.get $1 - i32.const 8 - i32.add - local.set $1 - br $while-continue|1 + br $while-continue|2 end end - end - loop $while-continue|2 - local.get $2 + else + local.get $1 + i32.const 7 + i32.and + local.get $0 + i32.const 7 + i32.and + i32.eq if - local.get $0 - local.tee $3 - i32.const 1 - i32.add - local.set $0 - local.get $1 - local.tee $4 - i32.const 1 - i32.add - local.set $1 - local.get $3 - local.get $4 - i32.load8_u - i32.store8 - local.get $2 - i32.const 1 - i32.sub - local.set $2 - br $while-continue|2 - end - end - else - local.get $1 - i32.const 7 - i32.and - local.get $0 - i32.const 7 - i32.and - i32.eq - if - loop $while-continue|3 - local.get $0 - local.get $2 - i32.add - i32.const 7 - i32.and - if - local.get $2 - i32.eqz - if - local.get $5 - return - end + loop $while-continue|3 local.get $0 local.get $2 - i32.const 1 - i32.sub - local.tee $2 i32.add - local.get $1 + i32.const 7 + i32.and + if + local.get $2 + i32.eqz + br_if $folding-inner0 + local.get $0 + local.get $2 + i32.const 1 + i32.sub + local.tee $2 + i32.add + local.get $1 + local.get $2 + i32.add + i32.load8_u + i32.store8 + br $while-continue|3 + end + end + loop $while-continue|4 local.get $2 - i32.add - i32.load8_u - i32.store8 - br $while-continue|3 + i32.const 8 + i32.ge_u + if + local.get $0 + local.get $2 + i32.const 8 + i32.sub + local.tee $2 + i32.add + local.get $1 + local.get $2 + i32.add + i64.load + i64.store + br $while-continue|4 + end end end - loop $while-continue|4 + loop $while-continue|5 local.get $2 - i32.const 8 - i32.ge_u if local.get $0 local.get $2 - i32.const 8 + i32.const 1 i32.sub local.tee $2 i32.add local.get $1 local.get $2 i32.add - i64.load - i64.store - br $while-continue|4 + i32.load8_u + i32.store8 + br $while-continue|5 end end end - loop $while-continue|5 - local.get $2 - if - local.get $0 - local.get $2 - i32.const 1 - i32.sub - local.tee $2 - i32.add - local.get $1 - local.get $2 - i32.add - i32.load8_u - i32.store8 - br $while-continue|5 - end - end end - local.get $5 ) (func $start:memmove i32.const 8 diff --git a/tests/compiler/retain-release-sanity.optimized.wat b/tests/compiler/retain-release-sanity.optimized.wat index b4c22eecc5..7bb37ef329 100644 --- a/tests/compiler/retain-release-sanity.optimized.wat +++ b/tests/compiler/retain-release-sanity.optimized.wat @@ -1,6 +1,6 @@ (module - (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_=>_none (func (param i32))) + (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $none_=>_none (func)) (type $i32_=>_i32 (func (param i32) (result i32))) @@ -2643,10 +2643,41 @@ unreachable end ) - (func $~lib/array/Array<~lib/string/String>#__visit_impl (param $0 i32) (param $1 i32) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) + block $folding-inner0 + block $switch$1$default + block $switch$1$case$5 + block $switch$1$case$4 + block $switch$1$case$2 + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$5 $folding-inner0 $folding-inner0 $switch$1$case$4 $switch$1$case$4 $switch$1$default + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + local.get $1 + call $~lib/rt/pure/__visit + end + return + end + local.get $0 + i32.load + local.get $1 + call $~lib/rt/pure/__visit + return + end + unreachable + end local.get $0 i32.load offset=4 local.tee $2 @@ -2681,47 +2712,4 @@ local.get $1 call $~lib/rt/pure/__visit ) - (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) - block $switch$1$default - block $switch$1$case$7 - block $switch$1$case$6 - block $switch$1$case$5 - block $switch$1$case$4 - block $switch$1$case$2 - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$5 $switch$1$case$6 $switch$1$case$7 $switch$1$case$4 $switch$1$case$4 $switch$1$default - end - return - end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - local.get $1 - call $~lib/rt/pure/__visit - end - return - end - local.get $0 - i32.load - local.get $1 - call $~lib/rt/pure/__visit - return - end - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>#__visit_impl - return - end - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>#__visit_impl - return - end - unreachable - ) ) diff --git a/tests/compiler/retain-return.optimized.wat b/tests/compiler/retain-return.optimized.wat index 506e90edde..dbca389ca6 100644 --- a/tests/compiler/retain-return.optimized.wat +++ b/tests/compiler/retain-return.optimized.wat @@ -1059,36 +1059,29 @@ i32.eq if block $__inlined_func$~lib/rt/__visit_members - block $switch$1$default - block $switch$1$case$7 - block $switch$1$case$6 - block $switch$1$case$4 - local.get $0 - i32.const 12 - i32.add - i32.load - br_table $__inlined_func$~lib/rt/__visit_members $__inlined_func$~lib/rt/__visit_members $switch$1$case$4 $__inlined_func$~lib/rt/__visit_members $switch$1$case$6 $switch$1$case$7 $switch$1$default - end + block $folding-inner0 + block $switch$1$default + block $switch$1$case$4 local.get $0 - i32.load offset=20 - local.tee $1 - if - local.get $1 - call $~lib/rt/pure/__visit - end - br $__inlined_func$~lib/rt/__visit_members + i32.const 12 + i32.add + i32.load + br_table $__inlined_func$~lib/rt/__visit_members $__inlined_func$~lib/rt/__visit_members $switch$1$case$4 $__inlined_func$~lib/rt/__visit_members $folding-inner0 $folding-inner0 $switch$1$default end local.get $0 - i32.load offset=24 - call $~lib/rt/pure/__visit + i32.load offset=20 + local.tee $1 + if + local.get $1 + call $~lib/rt/pure/__visit + end br $__inlined_func$~lib/rt/__visit_members end - local.get $0 - i32.load offset=24 - call $~lib/rt/pure/__visit - br $__inlined_func$~lib/rt/__visit_members + unreachable end - unreachable + local.get $0 + i32.load offset=24 + call $~lib/rt/pure/__visit end local.get $2 i32.const -2147483648 diff --git a/tests/compiler/std/array-literal.optimized.wat b/tests/compiler/std/array-literal.optimized.wat index c434560c33..abbe3d1e3a 100644 --- a/tests/compiler/std/array-literal.optimized.wat +++ b/tests/compiler/std/array-literal.optimized.wat @@ -1,7 +1,7 @@ (module (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_=>_none (func (param i32))) (type $none_=>_none (func)) + (type $i32_=>_none (func (param i32))) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) @@ -1535,6 +1535,8 @@ (func $~lib/rt/pure/decrement (param $0 i32) (local $1 i32) (local $2 i32) + (local $3 i32) + (local $4 i32) local.get $0 i32.load offset=4 local.tee $2 @@ -1558,49 +1560,63 @@ i32.eq if block $__inlined_func$~lib/rt/__visit_members - block $switch$1$default - block $switch$1$case$10 - block $switch$1$case$8 - block $switch$1$case$6 - block $switch$1$case$5 - block $switch$1$case$4 - local.get $0 - i32.const 20 - i32.add - local.tee $1 - i32.const 8 - i32.sub - i32.load - br_table $__inlined_func$~lib/rt/__visit_members $__inlined_func$~lib/rt/__visit_members $switch$1$case$4 $switch$1$case$5 $switch$1$case$6 $__inlined_func$~lib/rt/__visit_members $switch$1$case$8 $__inlined_func$~lib/rt/__visit_members $switch$1$case$10 $switch$1$default - end - local.get $1 - i32.load - local.tee $1 - if - local.get $1 - call $~lib/rt/pure/__visit - end - br $__inlined_func$~lib/rt/__visit_members - end - local.get $1 + block $folding-inner1 + block $folding-inner0 + block $switch$1$default + block $switch$1$case$4 + local.get $0 + i32.const 12 + i32.add i32.load + br_table $__inlined_func$~lib/rt/__visit_members $__inlined_func$~lib/rt/__visit_members $switch$1$case$4 $folding-inner0 $folding-inner0 $__inlined_func$~lib/rt/__visit_members $folding-inner1 $__inlined_func$~lib/rt/__visit_members $folding-inner1 $switch$1$default + end + local.get $0 + i32.load offset=20 + local.tee $1 + if + local.get $1 call $~lib/rt/pure/__visit - br $__inlined_func$~lib/rt/__visit_members end - local.get $1 - i32.load - call $~lib/rt/pure/__visit br $__inlined_func$~lib/rt/__visit_members end - local.get $1 - call $~lib/array/Array#__visit_impl - br $__inlined_func$~lib/rt/__visit_members + unreachable end - local.get $1 - call $~lib/array/Array#__visit_impl + local.get $0 + i32.load offset=20 + call $~lib/rt/pure/__visit br $__inlined_func$~lib/rt/__visit_members end - unreachable + local.get $0 + i32.load offset=24 + local.tee $1 + local.get $0 + i32.load offset=32 + i32.const 2 + i32.shl + i32.add + local.set $3 + loop $while-continue|0 + local.get $1 + local.get $3 + i32.lt_u + if + local.get $1 + i32.load + local.tee $4 + if + local.get $4 + call $~lib/rt/pure/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + local.get $0 + i32.load offset=20 + call $~lib/rt/pure/__visit end local.get $2 i32.const -2147483648 @@ -1657,40 +1673,4 @@ i32.sub call $~lib/rt/pure/decrement ) - (func $~lib/array/Array#__visit_impl (param $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - local.get $0 - i32.load offset=4 - local.tee $1 - local.get $0 - i32.load offset=12 - i32.const 2 - i32.shl - i32.add - local.set $2 - loop $while-continue|0 - local.get $1 - local.get $2 - i32.lt_u - if - local.get $1 - i32.load - local.tee $3 - if - local.get $3 - call $~lib/rt/pure/__visit - end - local.get $1 - i32.const 4 - i32.add - local.set $1 - br $while-continue|0 - end - end - local.get $0 - i32.load - call $~lib/rt/pure/__visit - ) ) diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index b3418d80b0..2f334b9099 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -597,8 +597,9 @@ f64.sub f64.add f64.sub - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add return end f64.const 0.5 @@ -629,8 +630,9 @@ f64.div f64.add f64.add - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add ) (func $std/math/test_acos (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 @@ -748,8 +750,9 @@ f32.sub f32.add f32.sub - f32.const 2 - f32.mul + local.tee $0 + local.get $0 + f32.add return end f32.const 0.5 @@ -780,8 +783,9 @@ f32.div f32.add f32.add - f32.const 2 - f32.mul + local.tee $0 + local.get $0 + f32.add ) (func $~lib/math/NativeMath.log1p (param $0 f64) (result f64) (local $1 f64) @@ -1168,8 +1172,8 @@ local.get $3 f64.mul local.get $3 - f64.const 2 - f64.mul + local.get $3 + f64.add f64.add f64.sqrt f64.add @@ -1181,8 +1185,8 @@ i64.lt_u if local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add f64.const 1 local.get $0 local.get $0 @@ -1546,8 +1550,8 @@ i32.lt_u if local.get $0 - f32.const 2 - f32.mul + local.get $0 + f32.add f32.const 1 local.get $0 local.get $0 @@ -1659,16 +1663,17 @@ local.get $3 f64.mul f64.add - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add f64.const 6.123233995736766e-17 f64.sub f64.sub else f64.const 0.7853981633974483 local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add local.get $3 f64.mul f64.const 6.123233995736766e-17 @@ -1686,14 +1691,15 @@ local.get $1 f64.add f64.div - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add f64.sub f64.sub f64.const 0.7853981633974483 local.get $1 - f64.const 2 - f64.mul + local.get $1 + f64.add f64.sub f64.sub f64.sub @@ -1727,8 +1733,8 @@ ) (func $~lib/math/NativeMathf.asin (param $0 f32) (result f32) (local $1 i32) - (local $2 f32) - (local $3 f64) + (local $2 f64) + (local $3 f32) local.get $0 i32.reinterpret_f32 i32.const 2147483647 @@ -1788,18 +1794,19 @@ f32.const 0.5 f32.mul f32.sub - local.tee $2 + local.tee $3 f64.promote_f32 f64.sqrt - local.tee $3 - local.get $3 + local.tee $2 local.get $2 + local.get $3 call $~lib/math/Rf f64.promote_f32 f64.mul f64.add - f64.const 2 - f64.mul + local.tee $2 + local.get $2 + f64.add f64.sub f32.demote_f64 local.get $0 @@ -1835,8 +1842,8 @@ i64.ge_u if (result f64) local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add f64.const 1 local.get $0 local.get $0 @@ -1913,8 +1920,8 @@ i32.ge_u if (result f32) local.get $0 - f32.const 2 - f32.mul + local.get $0 + f32.add f32.const 1 local.get $0 local.get $0 @@ -2014,8 +2021,8 @@ i32.lt_u if (result f64) local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add f64.const 1 f64.sub local.get $0 @@ -2246,8 +2253,8 @@ i32.lt_u if (result f32) local.get $0 - f32.const 2 - f32.mul + local.get $0 + f32.add f32.const 1 f32.sub local.get $0 @@ -2407,8 +2414,8 @@ i64.ge_u if (result f64) local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add local.tee $5 local.get $5 local.get $0 @@ -2430,8 +2437,9 @@ local.get $0 f64.sub f64.div - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add call $~lib/math/NativeMath.log1p f64.const 0.5 f64.mul @@ -2469,8 +2477,8 @@ i32.ge_u if (result f32) local.get $0 - f32.const 2 - f32.mul + local.get $0 + f32.add local.get $0 f32.const 1 local.get $0 @@ -2491,8 +2499,9 @@ local.get $0 f32.sub f32.div - f32.const 2 - f32.mul + local.tee $0 + local.get $0 + f32.add call $~lib/math/NativeMathf.log1p f32.const 0.5 f32.mul @@ -2578,15 +2587,15 @@ block $break|0 block $case3|0 block $case2|0 - block $case1|0 + block $case0|0 local.get $2 i32.eqz - br_if $case1|0 + br_if $case0|0 block $tablify|0 local.get $2 i32.const 1 i32.sub - br_table $case1|0 $case2|0 $case3|0 $tablify|0 + br_table $case0|0 $case2|0 $case3|0 $tablify|0 end br $break|0 end @@ -3038,8 +3047,8 @@ local.get $0 f64.sub local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add local.get $1 f64.add f64.div @@ -4277,8 +4286,9 @@ local.get $0 local.get $3 f64.sub - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add f64.const 1 f64.add return @@ -4306,8 +4316,8 @@ f64.const 1 f64.add local.tee $0 - f64.const 2 - f64.mul + local.get $0 + f64.add f64.const 8988465674311579538646525e283 f64.mul local.get $0 @@ -4529,8 +4539,8 @@ local.get $3 f64.mul local.get $3 - f64.const 2 - f64.mul + local.get $3 + f64.add f64.const 2 f64.add f64.div @@ -4755,8 +4765,9 @@ local.get $0 local.get $1 f32.sub - f32.const 2 - f32.mul + local.tee $0 + local.get $0 + f32.add f32.const 1 f32.add return @@ -4783,8 +4794,8 @@ f32.const 1 f32.add local.tee $0 - f32.const 2 - f32.mul + local.get $0 + f32.add f32.const 1701411834604692317316873e14 f32.mul local.get $0 @@ -4982,8 +4993,8 @@ local.get $0 f32.mul local.get $0 - f32.const 2 - f32.mul + local.get $0 + f32.add f32.const 2 f32.add f32.div @@ -5200,8 +5211,9 @@ f64.mul local.get $2 f64.add - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add br $~lib/util/math/specialcase2|inlined.0 end local.get $3 @@ -5387,9 +5399,9 @@ (local $5 f64) (local $6 i32) (local $7 f64) - (local $8 f64) + (local $8 i32) (local $9 f64) - (local $10 i32) + (local $10 f64) (local $11 f64) local.get $0 i64.reinterpret_f64 @@ -5432,7 +5444,7 @@ i64.const 52 i64.shr_u i32.wrap_i64 - local.tee $10 + local.tee $8 i32.const 2047 i32.eq select @@ -5440,7 +5452,7 @@ local.get $0 return end - local.get $10 + local.get $8 local.get $6 i32.sub i32.const 64 @@ -5452,13 +5464,13 @@ return end f64.const 1 - local.set $9 - local.get $10 + local.set $7 + local.get $8 i32.const 1533 i32.gt_u if (result f64) f64.const 5260135901548373507240989e186 - local.set $9 + local.set $7 local.get $1 f64.const 1.90109156629516e-211 f64.mul @@ -5472,7 +5484,7 @@ i32.lt_u if (result f64) f64.const 1.90109156629516e-211 - local.set $9 + local.set $7 local.get $1 f64.const 5260135901548373507240989e186 f64.mul @@ -5494,7 +5506,7 @@ f64.sub local.get $11 f64.add - local.tee $8 + local.tee $10 f64.sub local.set $5 local.get $0 @@ -5506,37 +5518,37 @@ f64.sub local.get $11 f64.add - local.tee $7 + local.tee $9 f64.sub local.set $11 - local.get $9 - local.get $8 - local.get $8 + local.get $7 + local.get $10 + local.get $10 f64.mul local.get $1 local.get $1 f64.mul local.tee $1 f64.sub - local.get $8 - f64.const 2 - f64.mul + local.get $10 + local.get $10 + f64.add local.get $5 f64.add local.get $5 f64.mul f64.add - local.get $7 - local.get $7 + local.get $9 + local.get $9 f64.mul local.get $0 local.get $0 f64.mul local.tee $0 f64.sub - local.get $7 - f64.const 2 - f64.mul + local.get $9 + local.get $9 + f64.add local.get $11 f64.add local.get $11 @@ -6578,92 +6590,88 @@ i64.or end local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i64.gt_s - if - local.get $2 - local.get $3 - i64.ge_u - if (result i64) + block $folding-inner0 + loop $while-continue|0 + local.get $4 + local.get $5 + i64.gt_s + if local.get $2 local.get $3 - i64.eq - if - local.get $0 - f64.const 0 - f64.mul - return + i64.ge_u + if (result i64) + local.get $2 + local.get $3 + i64.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i64.sub + else + local.get $2 end - local.get $2 - local.get $3 + i64.const 1 + i64.shl + local.set $2 + local.get $4 + i64.const 1 i64.sub - else - local.get $2 + local.set $4 + br $while-continue|0 end - i64.const 1 - i64.shl - local.set $2 - local.get $4 - i64.const 1 - i64.sub - local.set $4 - br $while-continue|0 end - end - local.get $2 - local.get $3 - i64.ge_u - if local.get $2 local.get $3 - i64.eq + i64.ge_u if - local.get $0 - f64.const 0 - f64.mul - return + local.get $2 + local.get $3 + i64.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i64.sub + local.set $2 end local.get $2 + local.get $2 + i64.const 11 + i64.shl + i64.clz + local.tee $3 + i64.shl + local.set $2 + local.get $4 local.get $3 i64.sub - local.set $2 - end - local.get $2 - local.get $2 - i64.const 11 - i64.shl - i64.clz - local.tee $3 - i64.shl - local.set $2 - local.get $4 - local.get $3 - i64.sub - local.tee $4 - i64.const 0 - i64.gt_s - if (result i64) - local.get $2 - i64.const 4503599627370496 - i64.sub - local.get $4 - i64.const 52 + local.tee $4 + i64.const 0 + i64.gt_s + if (result i64) + local.get $2 + i64.const 4503599627370496 + i64.sub + local.get $4 + i64.const 52 + i64.shl + i64.or + else + local.get $2 + i64.const 1 + local.get $4 + i64.sub + i64.shr_u + end + local.get $7 + i64.const 63 i64.shl i64.or - else - local.get $2 - i64.const 1 - local.get $4 - i64.sub - i64.shr_u + f64.reinterpret_i64 + return end - local.get $7 - i64.const 63 - i64.shl - i64.or - f64.reinterpret_i64 + local.get $0 + f64.const 0 + f64.mul ) (func $std/math/test_mod (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 @@ -6803,90 +6811,86 @@ i32.shl end local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i32.gt_s - if - local.get $2 - local.get $3 - i32.ge_u - if (result i32) + block $folding-inner0 + loop $while-continue|0 + local.get $4 + local.get $5 + i32.gt_s + if local.get $2 local.get $3 - i32.eq - if - local.get $0 - f32.const 0 - f32.mul - return + i32.ge_u + if (result i32) + local.get $2 + local.get $3 + i32.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i32.sub + else + local.get $2 end - local.get $2 - local.get $3 + i32.const 1 + i32.shl + local.set $2 + local.get $4 + i32.const 1 i32.sub - else - local.get $2 + local.set $4 + br $while-continue|0 end - i32.const 1 - i32.shl - local.set $2 - local.get $4 - i32.const 1 - i32.sub - local.set $4 - br $while-continue|0 end - end - local.get $2 - local.get $3 - i32.ge_u - if local.get $2 local.get $3 - i32.eq + i32.ge_u if - local.get $0 - f32.const 0 - f32.mul - return + local.get $2 + local.get $3 + i32.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i32.sub + local.set $2 end local.get $2 - local.get $3 - i32.sub - local.set $2 - end - local.get $2 - local.get $2 - i32.const 8 - i32.shl - i32.clz - local.tee $3 - i32.shl - local.set $2 - local.get $4 - local.get $3 - i32.sub - local.tee $4 - i32.const 0 - i32.gt_s - if (result i32) local.get $2 - i32.const 8388608 - i32.sub - local.get $4 - i32.const 23 + i32.const 8 i32.shl - i32.or - else - local.get $2 - i32.const 1 + i32.clz + local.tee $3 + i32.shl + local.set $2 local.get $4 + local.get $3 i32.sub - i32.shr_u + local.tee $4 + i32.const 0 + i32.gt_s + if (result i32) + local.get $2 + i32.const 8388608 + i32.sub + local.get $4 + i32.const 23 + i32.shl + i32.or + else + local.get $2 + i32.const 1 + local.get $4 + i32.sub + i32.shr_u + end + local.get $7 + i32.or + f32.reinterpret_i32 + return end - local.get $7 - i32.or - f32.reinterpret_i32 + local.get $0 + f32.const 0 + f32.mul ) (func $~lib/math/NativeMath.pow (param $0 f64) (param $1 f64) (result f64) (local $2 f64) @@ -6907,920 +6911,914 @@ (local $17 f64) (local $18 i32) (local $19 f64) - local.get $1 - f64.abs - f64.const 2 - f64.le - if - local.get $1 - f64.const 2 - f64.eq - if - local.get $0 - local.get $0 - f64.mul - return - end - local.get $1 - f64.const 0.5 - f64.eq - if - local.get $0 - f64.sqrt - f64.abs - f64.const inf - local.get $0 - f64.const -inf - f64.ne - select - return - end - local.get $1 - f64.const -1 - f64.eq - if - f64.const 1 - local.get $0 - f64.div - return - end - local.get $1 - f64.const 1 - f64.eq - if - local.get $0 - return - end - local.get $1 - f64.const 0 - f64.eq - if - f64.const 1 - return - end - end - local.get $0 - i64.reinterpret_f64 - local.tee $14 - i32.wrap_i64 - local.set $18 - local.get $14 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.tee $16 - i32.const 2147483647 - i32.and - local.set $4 - local.get $1 - i64.reinterpret_f64 - local.tee $14 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.tee $8 - i32.const 2147483647 - i32.and - local.tee $9 - local.get $14 - i32.wrap_i64 - local.tee $6 - i32.or - i32.eqz - if - f64.const 1 - return - end - i32.const 1 - local.get $6 - i32.const 0 - local.get $9 - i32.const 2146435072 - i32.eq - select - i32.const 1 - local.get $9 - i32.const 2146435072 - i32.gt_u - i32.const 1 - local.get $18 - i32.const 0 - local.get $4 - i32.const 2146435072 - i32.eq - select - local.get $4 - i32.const 2146435072 - i32.gt_s - select - select - select - if - local.get $0 - local.get $1 - f64.add - return - end - local.get $16 - i32.const 0 - i32.lt_s - if (result i32) - local.get $9 - i32.const 1128267776 - i32.ge_u - if (result i32) - i32.const 2 - else - local.get $9 - i32.const 1072693248 - i32.ge_u - if (result i32) - i32.const 52 - i32.const 20 - local.get $9 - i32.const 20 - i32.shr_u - i32.const 1023 - i32.sub - local.tee $11 - i32.const 20 - i32.gt_s - local.tee $5 - select - local.get $11 - i32.sub - local.set $12 - i32.const 2 - local.get $6 - local.get $9 - local.get $5 - select - local.tee $5 - local.get $12 - i32.shr_u - local.tee $11 - i32.const 1 - i32.and - i32.sub - i32.const 0 - local.get $5 - local.get $11 - local.get $12 - i32.shl - i32.eq - select - else - i32.const 0 - end - end - else - i32.const 0 - end - local.set $5 - local.get $6 - i32.eqz - if - local.get $9 - i32.const 2146435072 - i32.eq - if - local.get $18 - local.get $4 - i32.const 1072693248 - i32.sub - i32.or - if - local.get $4 - i32.const 1072693248 - i32.ge_s - if + block $folding-inner3 + block $folding-inner2 + block $folding-inner1 + block $folding-inner0 local.get $1 - f64.const 0 - local.get $8 - i32.const 0 - i32.ge_s - select - return - else - f64.const 0 + f64.abs + f64.const 2 + f64.le + if + local.get $1 + f64.const 2 + f64.eq + br_if $folding-inner0 + local.get $1 + f64.const 0.5 + f64.eq + if + local.get $0 + f64.sqrt + f64.abs + f64.const inf + local.get $0 + f64.const -inf + f64.ne + select + return + end + local.get $1 + f64.const -1 + f64.eq + br_if $folding-inner1 + local.get $1 + f64.const 1 + f64.eq + if + local.get $0 + return + end + local.get $1 + f64.const 0 + f64.eq + if + f64.const 1 + return + end + end + local.get $0 + i64.reinterpret_f64 + local.tee $14 + i32.wrap_i64 + local.set $18 + local.get $14 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.tee $16 + i32.const 2147483647 + i32.and + local.set $4 local.get $1 - f64.neg - local.get $8 + i64.reinterpret_f64 + local.tee $14 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.tee $8 + i32.const 2147483647 + i32.and + local.tee $9 + local.get $14 + i32.wrap_i64 + local.tee $6 + i32.or + i32.eqz + if + f64.const 1 + return + end + i32.const 1 + local.get $6 i32.const 0 - i32.ge_s + local.get $9 + i32.const 2146435072 + i32.eq select - return - end - unreachable - else - f64.const nan:0x8000000000000 - return - end - unreachable - end - local.get $9 - i32.const 1072693248 - i32.eq - if - local.get $8 - i32.const 0 - i32.ge_s - if - local.get $0 - return - end - f64.const 1 - local.get $0 - f64.div - return - end - local.get $8 - i32.const 1073741824 - i32.eq - if - local.get $0 - local.get $0 - f64.mul - return - end - local.get $8 - i32.const 1071644672 - i32.eq - if - local.get $16 - i32.const 0 - i32.ge_s - if - local.get $0 - f64.sqrt - return - end - end - end - local.get $0 - f64.abs - local.set $3 - local.get $18 - i32.eqz - if - i32.const 1 - local.get $4 - i32.const 1072693248 - i32.eq - local.get $4 - i32.const 2146435072 - i32.eq - i32.const 1 - local.get $4 - select - select - if - f64.const 1 - local.get $3 - f64.div - local.get $3 - local.get $8 - i32.const 0 - i32.lt_s - select - local.set $3 - local.get $16 - i32.const 0 - i32.lt_s - if (result f64) - local.get $5 - local.get $4 - i32.const 1072693248 - i32.sub - i32.or - if (result f64) - local.get $3 - f64.neg - local.get $3 - local.get $5 i32.const 1 + local.get $9 + i32.const 2146435072 + i32.gt_u + i32.const 1 + local.get $18 + i32.const 0 + local.get $4 + i32.const 2146435072 i32.eq select - else - local.get $3 - local.get $3 - f64.sub - local.tee $0 + local.get $4 + i32.const 2146435072 + i32.gt_s + select + select + select + if + local.get $0 + local.get $1 + f64.add + return + end + local.get $16 + i32.const 0 + i32.lt_s + if (result i32) + local.get $9 + i32.const 1128267776 + i32.ge_u + if (result i32) + i32.const 2 + else + local.get $9 + i32.const 1072693248 + i32.ge_u + if (result i32) + i32.const 52 + i32.const 20 + local.get $9 + i32.const 20 + i32.shr_u + i32.const 1023 + i32.sub + local.tee $11 + i32.const 20 + i32.gt_s + local.tee $5 + select + local.get $11 + i32.sub + local.set $12 + i32.const 2 + local.get $6 + local.get $9 + local.get $5 + select + local.tee $5 + local.get $12 + i32.shr_u + local.tee $11 + i32.const 1 + i32.and + i32.sub + i32.const 0 + local.get $5 + local.get $11 + local.get $12 + i32.shl + i32.eq + select + else + i32.const 0 + end + end + else + i32.const 0 + end + local.set $5 + local.get $6 + i32.eqz + if + local.get $9 + i32.const 2146435072 + i32.eq + if + local.get $18 + local.get $4 + i32.const 1072693248 + i32.sub + i32.or + if + local.get $4 + i32.const 1072693248 + i32.ge_s + if + local.get $1 + f64.const 0 + local.get $8 + i32.const 0 + i32.ge_s + select + return + else + f64.const 0 + local.get $1 + f64.neg + local.get $8 + i32.const 0 + i32.ge_s + select + return + end + unreachable + else + f64.const nan:0x8000000000000 + return + end + unreachable + end + local.get $9 + i32.const 1072693248 + i32.eq + if + local.get $8 + i32.const 0 + i32.ge_s + if + local.get $0 + return + end + br $folding-inner1 + end + local.get $8 + i32.const 1073741824 + i32.eq + br_if $folding-inner0 + local.get $8 + i32.const 1071644672 + i32.eq + if + local.get $16 + i32.const 0 + i32.ge_s + if + local.get $0 + f64.sqrt + return + end + end + end local.get $0 - f64.div - end - else - local.get $3 - end - return - end - end - local.get $16 - i32.const 0 - i32.lt_s - if (result f64) - local.get $5 - i32.eqz - if - local.get $0 - local.get $0 - f64.sub - local.tee $0 - local.get $0 - f64.div - return - end - f64.const -1 - f64.const 1 - local.get $5 - i32.const 1 - i32.eq - select - else - f64.const 1 - end - local.set $10 - local.get $9 - i32.const 1105199104 - i32.gt_u - if (result f64) - local.get $9 - i32.const 1139802112 - i32.gt_u - if - local.get $4 - i32.const 1072693247 - i32.le_s - if - f64.const inf - f64.const 0 - local.get $8 - i32.const 0 - i32.lt_s - select - return - end - local.get $4 - i32.const 1072693248 - i32.ge_s - if - f64.const inf - f64.const 0 - local.get $8 - i32.const 0 - i32.gt_s - select - return - end - end - local.get $4 - i32.const 1072693247 - i32.lt_s - if - local.get $10 - f64.const 1.e+300 - f64.mul - f64.const 1.e+300 - f64.mul - local.get $10 - f64.const 1e-300 - f64.mul - f64.const 1e-300 - f64.mul - local.get $8 - i32.const 0 - i32.lt_s - select - return - end - local.get $4 - i32.const 1072693248 - i32.gt_s - if - local.get $10 - f64.const 1.e+300 - f64.mul - f64.const 1.e+300 - f64.mul - local.get $10 - f64.const 1e-300 - f64.mul - f64.const 1e-300 - f64.mul - local.get $8 - i32.const 0 - i32.gt_s - select - return - end - local.get $3 - f64.const 1 - f64.sub - local.tee $0 - f64.const 1.4426950216293335 - f64.mul - local.tee $3 - local.get $0 - f64.const 1.9259629911266175e-08 - f64.mul - local.get $0 - local.get $0 - f64.mul - f64.const 0.5 - local.get $0 - f64.const 0.3333333333333333 - local.get $0 - f64.const 0.25 - f64.mul - f64.sub - f64.mul - f64.sub - f64.mul - f64.const 1.4426950408889634 - f64.mul - f64.sub - local.tee $0 - f64.add - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $7 - local.get $0 - local.get $7 - local.get $3 - f64.sub - f64.sub - else - local.get $4 - i32.const 1048576 - i32.lt_s - if (result i32) - local.get $3 - f64.const 9007199254740992 - f64.mul - local.tee $3 - i64.reinterpret_f64 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.set $4 - i32.const -53 - else - i32.const 0 - end - local.get $4 - i32.const 20 - i32.shr_s - i32.const 1023 - i32.sub - i32.add - local.set $6 - local.get $4 - i32.const 1048575 - i32.and - local.tee $5 - i32.const 1072693248 - i32.or - local.set $4 - local.get $5 - i32.const 235662 - i32.le_s - if (result i32) - i32.const 0 - else - local.get $5 - i32.const 767610 - i32.lt_s - if (result i32) - i32.const 1 - else - local.get $6 - i32.const 1 - i32.add - local.set $6 - local.get $4 - i32.const -1048576 - i32.add - local.set $4 - i32.const 0 - end - end - local.set $5 - local.get $3 - i64.reinterpret_f64 - i64.const 4294967295 - i64.and - local.get $4 - i64.extend_i32_s - i64.const 32 - i64.shl - i64.or - f64.reinterpret_i64 - local.tee $7 - f64.const 1.5 - f64.const 1 - local.get $5 - select - local.tee $2 - f64.sub - local.tee $3 - f64.const 1 - local.get $7 - local.get $2 - f64.add - f64.div - local.tee $0 - f64.mul - local.tee $17 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.tee $15 - local.get $15 - local.get $15 - f64.mul - local.tee $19 - f64.const 3 - f64.add - local.get $17 - local.get $17 - f64.mul - local.tee $13 - local.get $13 - f64.mul - local.get $13 - local.get $13 - local.get $13 - local.get $13 - local.get $13 - f64.const 0.20697501780033842 - f64.mul - f64.const 0.23066074577556175 - f64.add - f64.mul - f64.const 0.272728123808534 - f64.add - f64.mul - f64.const 0.33333332981837743 - f64.add - f64.mul - f64.const 0.4285714285785502 - f64.add - f64.mul - f64.const 0.5999999999999946 - f64.add - f64.mul - local.get $0 - local.get $3 - local.get $15 - local.get $4 - i32.const 1 - i32.shr_s - i32.const 536870912 - i32.or - i32.const 524288 - i32.add - local.get $5 - i32.const 18 - i32.shl - i32.add - i64.extend_i32_s - i64.const 32 - i64.shl - f64.reinterpret_i64 - local.tee $0 - f64.mul - f64.sub - local.get $15 - local.get $7 - local.get $0 - local.get $2 - f64.sub - f64.sub - f64.mul - f64.sub - f64.mul - local.tee $2 - local.get $15 - local.get $17 - f64.add - f64.mul - f64.add - local.tee $0 - f64.add - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.tee $7 - f64.mul - local.tee $3 - local.get $2 - local.get $7 - f64.mul - local.get $0 - local.get $7 - f64.const 3 - f64.sub - local.get $19 - f64.sub - f64.sub - local.get $17 - f64.mul - f64.add - local.tee $0 - f64.add - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.tee $2 - f64.const 0.9617967009544373 - f64.mul - local.tee $19 - local.get $2 - f64.const -7.028461650952758e-09 - f64.mul - local.get $0 - local.get $2 - local.get $3 - f64.sub - f64.sub - f64.const 0.9617966939259756 - f64.mul - f64.add - f64.const 1.350039202129749e-08 - f64.const 0 - local.get $5 - select - f64.add - local.tee $2 - f64.add - f64.const 0.5849624872207642 - f64.const 0 - local.get $5 - select - local.tee $3 - f64.add - local.get $6 - f64.convert_i32_s - local.tee $0 - f64.add - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $7 - local.get $2 - local.get $7 - local.get $0 - f64.sub - local.get $3 - f64.sub - local.get $19 - f64.sub - f64.sub - end - local.set $3 - local.get $1 - local.get $1 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.tee $0 - f64.sub - local.get $7 - f64.mul - local.get $1 - local.get $3 - f64.mul - f64.add - local.tee $1 - local.get $0 - local.get $7 - f64.mul - local.tee $2 - f64.add - local.tee $0 - i64.reinterpret_f64 - local.tee $14 - i32.wrap_i64 - local.set $5 - block $folding-inner1 - block $folding-inner0 - local.get $14 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.tee $12 - i32.const 1083179008 - i32.ge_s - if - local.get $5 - local.get $12 - i32.const 1083179008 - i32.sub - i32.or - local.get $1 - f64.const 8.008566259537294e-17 - f64.add - local.get $0 - local.get $2 - f64.sub - f64.gt - i32.or - br_if $folding-inner0 - else - local.get $12 - i32.const 2147483647 - i32.and - i32.const 1083231232 - i32.ge_u - i32.const 0 - local.get $5 - local.get $12 - i32.const -1064252416 - i32.sub - i32.or - local.get $1 + f64.abs + local.set $3 + local.get $18 + i32.eqz + if + i32.const 1 + local.get $4 + i32.const 1072693248 + i32.eq + local.get $4 + i32.const 2146435072 + i32.eq + i32.const 1 + local.get $4 + select + select + if + f64.const 1 + local.get $3 + f64.div + local.get $3 + local.get $8 + i32.const 0 + i32.lt_s + select + local.set $3 + local.get $16 + i32.const 0 + i32.lt_s + if (result f64) + local.get $5 + local.get $4 + i32.const 1072693248 + i32.sub + i32.or + if (result f64) + local.get $3 + f64.neg + local.get $3 + local.get $5 + i32.const 1 + i32.eq + select + else + local.get $3 + local.get $3 + f64.sub + local.tee $0 + local.get $0 + f64.div + end + else + local.get $3 + end + return + end + end + local.get $16 + i32.const 0 + i32.lt_s + if (result f64) + local.get $5 + i32.eqz + if + local.get $0 + local.get $0 + f64.sub + local.tee $0 + local.get $0 + f64.div + return + end + f64.const -1 + f64.const 1 + local.get $5 + i32.const 1 + i32.eq + select + else + f64.const 1 + end + local.set $10 + local.get $9 + i32.const 1105199104 + i32.gt_u + if (result f64) + local.get $9 + i32.const 1139802112 + i32.gt_u + if + local.get $4 + i32.const 1072693247 + i32.le_s + if + f64.const inf + f64.const 0 + local.get $8 + i32.const 0 + i32.lt_s + select + return + end + local.get $4 + i32.const 1072693248 + i32.ge_s + if + f64.const inf + f64.const 0 + local.get $8 + i32.const 0 + i32.gt_s + select + return + end + end + local.get $4 + i32.const 1072693247 + i32.lt_s + if + local.get $10 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + local.get $10 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + local.get $8 + i32.const 0 + i32.lt_s + select + return + end + local.get $4 + i32.const 1072693248 + i32.gt_s + if + local.get $10 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + local.get $10 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + local.get $8 + i32.const 0 + i32.gt_s + select + return + end + local.get $3 + f64.const 1 + f64.sub + local.tee $0 + f64.const 1.4426950216293335 + f64.mul + local.tee $3 + local.get $0 + f64.const 1.9259629911266175e-08 + f64.mul + local.get $0 + local.get $0 + f64.mul + f64.const 0.5 + local.get $0 + f64.const 0.3333333333333333 + local.get $0 + f64.const 0.25 + f64.mul + f64.sub + f64.mul + f64.sub + f64.mul + f64.const 1.4426950408889634 + f64.mul + f64.sub + local.tee $0 + f64.add + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $7 + local.get $0 + local.get $7 + local.get $3 + f64.sub + f64.sub + else + local.get $4 + i32.const 1048576 + i32.lt_s + if (result i32) + local.get $3 + f64.const 9007199254740992 + f64.mul + local.tee $3 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $4 + i32.const -53 + else + i32.const 0 + end + local.get $4 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $6 + local.get $4 + i32.const 1048575 + i32.and + local.tee $5 + i32.const 1072693248 + i32.or + local.set $4 + local.get $5 + i32.const 235662 + i32.le_s + if (result i32) + i32.const 0 + else + local.get $5 + i32.const 767610 + i32.lt_s + if (result i32) + i32.const 1 + else + local.get $6 + i32.const 1 + i32.add + local.set $6 + local.get $4 + i32.const -1048576 + i32.add + local.set $4 + i32.const 0 + end + end + local.set $5 + local.get $3 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $4 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.tee $7 + f64.const 1.5 + f64.const 1 + local.get $5 + select + local.tee $2 + f64.sub + local.tee $3 + f64.const 1 + local.get $7 + local.get $2 + f64.add + f64.div + local.tee $0 + f64.mul + local.tee $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.tee $15 + local.get $15 + local.get $15 + f64.mul + local.tee $19 + f64.const 3 + f64.add + local.get $17 + local.get $17 + f64.mul + local.tee $13 + local.get $13 + f64.mul + local.get $13 + local.get $13 + local.get $13 + local.get $13 + local.get $13 + f64.const 0.20697501780033842 + f64.mul + f64.const 0.23066074577556175 + f64.add + f64.mul + f64.const 0.272728123808534 + f64.add + f64.mul + f64.const 0.33333332981837743 + f64.add + f64.mul + f64.const 0.4285714285785502 + f64.add + f64.mul + f64.const 0.5999999999999946 + f64.add + f64.mul + local.get $0 + local.get $3 + local.get $15 + local.get $4 + i32.const 1 + i32.shr_s + i32.const 536870912 + i32.or + i32.const 524288 + i32.add + local.get $5 + i32.const 18 + i32.shl + i32.add + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.tee $0 + f64.mul + f64.sub + local.get $15 + local.get $7 + local.get $0 + local.get $2 + f64.sub + f64.sub + f64.mul + f64.sub + f64.mul + local.tee $2 + local.get $15 + local.get $17 + f64.add + f64.mul + f64.add + local.tee $0 + f64.add + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.tee $7 + f64.mul + local.tee $3 + local.get $2 + local.get $7 + f64.mul + local.get $0 + local.get $7 + f64.const 3 + f64.sub + local.get $19 + f64.sub + f64.sub + local.get $17 + f64.mul + f64.add + local.tee $0 + f64.add + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.tee $2 + f64.const 0.9617967009544373 + f64.mul + local.tee $19 + local.get $2 + f64.const -7.028461650952758e-09 + f64.mul + local.get $0 + local.get $2 + local.get $3 + f64.sub + f64.sub + f64.const 0.9617966939259756 + f64.mul + f64.add + f64.const 1.350039202129749e-08 + f64.const 0 + local.get $5 + select + f64.add + local.tee $2 + f64.add + f64.const 0.5849624872207642 + f64.const 0 + local.get $5 + select + local.tee $3 + f64.add + local.get $6 + f64.convert_i32_s + local.tee $0 + f64.add + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $7 + local.get $2 + local.get $7 + local.get $0 + f64.sub + local.get $3 + f64.sub + local.get $19 + f64.sub + f64.sub + end + local.set $3 + local.get $1 + local.get $1 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.tee $0 + f64.sub + local.get $7 + f64.mul + local.get $1 + local.get $3 + f64.mul + f64.add + local.tee $1 + local.get $0 + local.get $7 + f64.mul + local.tee $2 + f64.add + local.tee $0 + i64.reinterpret_f64 + local.tee $14 + i32.wrap_i64 + local.set $5 + local.get $14 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.tee $12 + i32.const 1083179008 + i32.ge_s + if + local.get $5 + local.get $12 + i32.const 1083179008 + i32.sub + i32.or + local.get $1 + f64.const 8.008566259537294e-17 + f64.add + local.get $0 + local.get $2 + f64.sub + f64.gt + i32.or + br_if $folding-inner2 + else + local.get $12 + i32.const 2147483647 + i32.and + i32.const 1083231232 + i32.ge_u + i32.const 0 + local.get $5 + local.get $12 + i32.const -1064252416 + i32.sub + i32.or + local.get $1 + local.get $0 + local.get $2 + f64.sub + f64.le + i32.or + select + br_if $folding-inner3 + end + local.get $12 + i32.const 2147483647 + i32.and + local.tee $11 + i32.const 20 + i32.shr_u + i32.const 1023 + i32.sub + local.set $5 + i32.const 0 + local.set $6 + local.get $1 + local.get $11 + i32.const 1071644672 + i32.gt_s + if + i32.const 1048575 + local.get $12 + i32.const 1048576 + local.get $5 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.tee $11 + i32.const 2147483647 + i32.and + i32.const 20 + i32.shr_u + i32.const 1023 + i32.sub + local.tee $5 + i32.shr_s + i32.const -1 + i32.xor + local.get $11 + i32.and + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $0 + i32.const 0 + local.get $11 + i32.const 1048575 + i32.and + i32.const 1048576 + i32.or + i32.const 20 + local.get $5 + i32.sub + i32.shr_s + local.tee $6 + i32.sub + local.get $6 + local.get $12 + i32.const 0 + i32.lt_s + select + local.set $6 + local.get $2 + local.get $0 + f64.sub + local.set $2 + end + local.get $2 + f64.add + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.tee $0 + f64.const 0.6931471824645996 + f64.mul + local.tee $3 + local.get $1 + local.get $0 + local.get $2 + f64.sub + f64.sub + f64.const 0.6931471805599453 + f64.mul + local.get $0 + f64.const -1.904654299957768e-09 + f64.mul + f64.add + local.tee $1 + f64.add + local.tee $2 + local.get $2 + f64.mul + local.set $0 + local.get $10 + f64.const 1 + local.get $2 + local.get $2 + local.get $0 + local.get $0 + local.get $0 + local.get $0 + local.get $0 + f64.const 4.1381367970572385e-08 + f64.mul + f64.const -1.6533902205465252e-06 + f64.add + f64.mul + f64.const 6.613756321437934e-05 + f64.add + f64.mul + f64.const -2.7777777777015593e-03 + f64.add + f64.mul + f64.const 0.16666666666666602 + f64.add + f64.mul + f64.sub + local.tee $0 + f64.mul + local.get $0 + f64.const 2 + f64.sub + f64.div + local.get $1 + local.get $2 + local.get $3 + f64.sub + f64.sub + local.tee $0 + local.get $2 + local.get $0 + f64.mul + f64.add + f64.sub + local.get $2 + f64.sub + f64.sub + local.tee $0 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.get $6 + i32.const 20 + i32.shl + i32.add + local.tee $5 + i32.const 20 + i32.shr_s + i32.const 0 + i32.le_s + if (result f64) + local.get $0 + local.get $6 + call $~lib/math/NativeMath.scalbn + else + local.get $0 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $5 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + end + f64.mul + return + end local.get $0 - local.get $2 - f64.sub - f64.le - i32.or - select - br_if $folding-inner1 - end - local.get $12 - i32.const 2147483647 - i32.and - local.tee $11 - i32.const 20 - i32.shr_u - i32.const 1023 - i32.sub - local.set $5 - i32.const 0 - local.set $6 - local.get $1 - local.get $11 - i32.const 1071644672 - i32.gt_s - if - i32.const 1048575 - local.get $12 - i32.const 1048576 - local.get $5 - i32.const 1 - i32.add - i32.shr_s - i32.add - local.tee $11 - i32.const 2147483647 - i32.and - i32.const 20 - i32.shr_u - i32.const 1023 - i32.sub - local.tee $5 - i32.shr_s - i32.const -1 - i32.xor - local.get $11 - i32.and - i64.extend_i32_s - i64.const 32 - i64.shl - f64.reinterpret_i64 - local.set $0 - i32.const 0 - local.get $11 - i32.const 1048575 - i32.and - i32.const 1048576 - i32.or - i32.const 20 - local.get $5 - i32.sub - i32.shr_s - local.tee $6 - i32.sub - local.get $6 - local.get $12 - i32.const 0 - i32.lt_s - select - local.set $6 - local.get $2 local.get $0 - f64.sub - local.set $2 + f64.mul + return end - local.get $2 - f64.add - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.tee $0 - f64.const 0.6931471824645996 - f64.mul - local.tee $3 - local.get $1 - local.get $0 - local.get $2 - f64.sub - f64.sub - f64.const 0.6931471805599453 - f64.mul - local.get $0 - f64.const -1.904654299957768e-09 - f64.mul - f64.add - local.tee $1 - f64.add - local.tee $2 - local.get $2 - f64.mul - local.set $0 - local.get $10 f64.const 1 - local.get $2 - local.get $2 - local.get $0 - local.get $0 - local.get $0 local.get $0 - local.get $0 - f64.const 4.1381367970572385e-08 - f64.mul - f64.const -1.6533902205465252e-06 - f64.add - f64.mul - f64.const 6.613756321437934e-05 - f64.add - f64.mul - f64.const -2.7777777777015593e-03 - f64.add - f64.mul - f64.const 0.16666666666666602 - f64.add - f64.mul - f64.sub - local.tee $0 - f64.mul - local.get $0 - f64.const 2 - f64.sub f64.div - local.get $1 - local.get $2 - local.get $3 - f64.sub - f64.sub - local.tee $0 - local.get $2 - local.get $0 - f64.mul - f64.add - f64.sub - local.get $2 - f64.sub - f64.sub - local.tee $0 - i64.reinterpret_f64 - i64.const 32 - i64.shr_u - i32.wrap_i64 - local.get $6 - i32.const 20 - i32.shl - i32.add - local.tee $5 - i32.const 20 - i32.shr_s - i32.const 0 - i32.le_s - if (result f64) - local.get $0 - local.get $6 - call $~lib/math/NativeMath.scalbn - else - local.get $0 - i64.reinterpret_f64 - i64.const 4294967295 - i64.and - local.get $5 - i64.extend_i32_s - i64.const 32 - i64.shl - i64.or - f64.reinterpret_i64 - end - f64.mul return end local.get $10 @@ -9402,8 +9400,8 @@ end local.get $2 local.get $1 - f64.const 2 - f64.mul + local.get $1 + f64.add local.get $1 local.get $1 f64.mul @@ -9431,8 +9429,8 @@ f64.sub call $~lib/math/NativeMath.exp local.get $2 - f64.const 2 - f64.mul + local.get $2 + f64.add f64.const 2247116418577894884661631e283 f64.mul f64.mul @@ -9457,41 +9455,41 @@ ) (func $~lib/math/NativeMathf.sinh (param $0 f32) (result f32) (local $1 f32) - (local $2 i32) - (local $3 f32) + (local $2 f32) + (local $3 i32) local.get $0 i32.reinterpret_f32 i32.const 2147483647 i32.and - local.tee $2 + local.tee $3 f32.reinterpret_i32 local.set $1 f32.const 0.5 local.get $0 f32.copysign - local.set $3 - local.get $2 + local.set $2 + local.get $3 i32.const 1118925335 i32.lt_u if local.get $1 call $~lib/math/NativeMathf.expm1 local.set $1 - local.get $2 + local.get $3 i32.const 1065353216 i32.lt_u if - local.get $2 + local.get $3 i32.const 964689920 i32.lt_u if local.get $0 return end - local.get $3 + local.get $2 local.get $1 - f32.const 2 - f32.mul + local.get $1 + f32.add local.get $1 local.get $1 f32.mul @@ -9503,7 +9501,7 @@ f32.mul return end - local.get $3 + local.get $2 local.get $1 local.get $1 local.get $1 @@ -9518,9 +9516,9 @@ f32.const 162.88958740234375 f32.sub call $~lib/math/NativeMathf.exp - local.get $3 - f32.const 2 - f32.mul + local.get $2 + local.get $2 + f32.add f32.const 1661534994731144841129758e11 f32.mul f32.mul @@ -9678,8 +9676,9 @@ local.get $3 f64.sub f64.sub - f64.const 2 - f64.mul + local.tee $0 + local.get $0 + f64.add f64.sub f64.mul return @@ -10202,8 +10201,8 @@ f64.const 1 f64.const 2 local.get $1 - f64.const 2 - f64.mul + local.get $1 + f64.add call $~lib/math/NativeMath.expm1 f64.const 2 f64.add @@ -10216,8 +10215,8 @@ i32.gt_u if (result f64) local.get $1 - f64.const 2 - f64.mul + local.get $1 + f64.add call $~lib/math/NativeMath.expm1 local.tee $1 local.get $1 @@ -10290,8 +10289,8 @@ f32.const 1 f32.const 2 local.get $3 - f32.const 2 - f32.mul + local.get $3 + f32.add call $~lib/math/NativeMathf.expm1 f32.const 2 f32.add @@ -10304,8 +10303,8 @@ i32.gt_u if (result f32) local.get $3 - f32.const 2 - f32.mul + local.get $3 + f32.add call $~lib/math/NativeMathf.expm1 local.tee $3 local.get $3 diff --git a/tests/compiler/std/mod.optimized.wat b/tests/compiler/std/mod.optimized.wat index e399f928d3..5adbf0b09a 100644 --- a/tests/compiler/std/mod.optimized.wat +++ b/tests/compiler/std/mod.optimized.wat @@ -136,92 +136,88 @@ i64.or end local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i64.gt_s - if - local.get $2 - local.get $3 - i64.ge_u - if (result i64) + block $folding-inner0 + loop $while-continue|0 + local.get $4 + local.get $5 + i64.gt_s + if local.get $2 local.get $3 - i64.eq - if - local.get $0 - f64.const 0 - f64.mul - return + i64.ge_u + if (result i64) + local.get $2 + local.get $3 + i64.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i64.sub + else + local.get $2 end - local.get $2 - local.get $3 + i64.const 1 + i64.shl + local.set $2 + local.get $4 + i64.const 1 i64.sub - else - local.get $2 + local.set $4 + br $while-continue|0 end - i64.const 1 - i64.shl - local.set $2 - local.get $4 - i64.const 1 - i64.sub - local.set $4 - br $while-continue|0 end - end - local.get $2 - local.get $3 - i64.ge_u - if local.get $2 local.get $3 - i64.eq + i64.ge_u if - local.get $0 - f64.const 0 - f64.mul - return + local.get $2 + local.get $3 + i64.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i64.sub + local.set $2 end local.get $2 - local.get $3 - i64.sub - local.set $2 - end - local.get $2 - local.get $2 - i64.const 11 - i64.shl - i64.clz - local.tee $3 - i64.shl - local.set $2 - local.get $4 - local.get $3 - i64.sub - local.tee $4 - i64.const 0 - i64.gt_s - if (result i64) local.get $2 - i64.const 4503599627370496 - i64.sub - local.get $4 - i64.const 52 + i64.const 11 i64.shl - i64.or - else - local.get $2 - i64.const 1 + i64.clz + local.tee $3 + i64.shl + local.set $2 local.get $4 + local.get $3 i64.sub - i64.shr_u + local.tee $4 + i64.const 0 + i64.gt_s + if (result i64) + local.get $2 + i64.const 4503599627370496 + i64.sub + local.get $4 + i64.const 52 + i64.shl + i64.or + else + local.get $2 + i64.const 1 + local.get $4 + i64.sub + i64.shr_u + end + local.get $7 + i64.const 63 + i64.shl + i64.or + f64.reinterpret_i64 + return end - local.get $7 - i64.const 63 - i64.shl - i64.or - f64.reinterpret_i64 + local.get $0 + f64.const 0 + f64.mul ) (func $std/mod/check (param $0 f64) (param $1 f64) (result i32) local.get $1 @@ -386,90 +382,86 @@ i32.shl end local.set $3 - loop $while-continue|0 - local.get $4 - local.get $5 - i32.gt_s - if - local.get $2 - local.get $3 - i32.ge_u - if (result i32) + block $folding-inner0 + loop $while-continue|0 + local.get $4 + local.get $5 + i32.gt_s + if local.get $2 local.get $3 - i32.eq - if - local.get $0 - f32.const 0 - f32.mul - return + i32.ge_u + if (result i32) + local.get $2 + local.get $3 + i32.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i32.sub + else + local.get $2 end - local.get $2 - local.get $3 + i32.const 1 + i32.shl + local.set $2 + local.get $4 + i32.const 1 i32.sub - else - local.get $2 + local.set $4 + br $while-continue|0 end - i32.const 1 - i32.shl - local.set $2 - local.get $4 - i32.const 1 - i32.sub - local.set $4 - br $while-continue|0 end - end - local.get $2 - local.get $3 - i32.ge_u - if local.get $2 local.get $3 - i32.eq + i32.ge_u if - local.get $0 - f32.const 0 - f32.mul - return + local.get $2 + local.get $3 + i32.eq + br_if $folding-inner0 + local.get $2 + local.get $3 + i32.sub + local.set $2 end local.get $2 - local.get $3 - i32.sub - local.set $2 - end - local.get $2 - local.get $2 - i32.const 8 - i32.shl - i32.clz - local.tee $3 - i32.shl - local.set $2 - local.get $4 - local.get $3 - i32.sub - local.tee $4 - i32.const 0 - i32.gt_s - if (result i32) local.get $2 - i32.const 8388608 - i32.sub - local.get $4 - i32.const 23 + i32.const 8 i32.shl - i32.or - else - local.get $2 - i32.const 1 + i32.clz + local.tee $3 + i32.shl + local.set $2 local.get $4 + local.get $3 i32.sub - i32.shr_u + local.tee $4 + i32.const 0 + i32.gt_s + if (result i32) + local.get $2 + i32.const 8388608 + i32.sub + local.get $4 + i32.const 23 + i32.shl + i32.or + else + local.get $2 + i32.const 1 + local.get $4 + i32.sub + i32.shr_u + end + local.get $7 + i32.or + f32.reinterpret_i32 + return end - local.get $7 - i32.or - f32.reinterpret_i32 + local.get $0 + f32.const 0 + f32.mul ) (func $std/mod/test_fmodf (param $0 f32) (param $1 f32) (param $2 f32) (result i32) block $__inlined_func$std/mod/check (result i32) diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index 681a102851..fa247f52d8 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -2950,7 +2950,7 @@ (local $4 i32) (local $5 i32) (local $6 i32) - block $folding-inner0 + block $folding-inner1 local.get $0 call $~lib/rt/pure/__retain local.tee $2 @@ -2961,7 +2961,7 @@ i32.shr_u local.tee $0 i32.eqz - br_if $folding-inner0 + br_if $folding-inner1 local.get $2 local.tee $3 i32.load16_u @@ -2999,7 +2999,7 @@ i32.sub local.tee $0 i32.eqz - br_if $folding-inner0 + br_if $folding-inner1 i32.const -1 i32.const 1 local.get $1 @@ -3132,7 +3132,7 @@ if local.get $5 i32.eqz - br_if $folding-inner0 + br_if $folding-inner1 br $while-break|2 end local.get $1 @@ -5722,14 +5722,14 @@ (local $10 i32) local.get $1 call $~lib/rt/pure/__retain - local.set $4 + local.set $5 block $folding-inner2 block $folding-inner1 block $folding-inner0 local.get $2 i32.eqz br_if $folding-inner0 - local.get $4 + local.get $5 i32.eqz if i32.const 1 @@ -5758,7 +5758,7 @@ i32.lt_s select local.set $2 - local.get $4 + local.get $5 i32.const 20 i32.sub i32.load offset=16 @@ -5793,7 +5793,7 @@ local.tee $2 call $~lib/rt/__newArray call $~lib/rt/pure/__retain - local.tee $5 + local.tee $4 i32.load offset=4 local.set $3 loop $for-loop|0 @@ -5829,9 +5829,9 @@ br $for-loop|0 end end - local.get $4 - call $~lib/rt/pure/__release local.get $5 + call $~lib/rt/pure/__release + local.get $4 return end i32.const 0 @@ -5840,15 +5840,15 @@ local.set $1 loop $while-continue|1 local.get $0 - local.get $4 local.get $5 + local.get $4 call $~lib/string/String#indexOf local.tee $6 i32.const -1 i32.xor if local.get $6 - local.get $5 + local.get $4 i32.sub local.tee $7 i32.const 0 @@ -5862,7 +5862,7 @@ call $~lib/rt/pure/__new local.tee $9 local.get $0 - local.get $5 + local.get $4 i32.const 1 i32.shl i32.add @@ -5886,11 +5886,11 @@ local.get $6 local.get $8 i32.add - local.set $5 + local.set $4 br $while-continue|1 end end - local.get $5 + local.get $4 i32.eqz if local.get $1 @@ -5899,7 +5899,7 @@ br $folding-inner2 end local.get $3 - local.get $5 + local.get $4 i32.sub local.tee $2 i32.const 0 @@ -5913,7 +5913,7 @@ call $~lib/rt/pure/__new local.tee $3 local.get $0 - local.get $5 + local.get $4 i32.const 1 i32.shl i32.add @@ -5927,19 +5927,22 @@ i32.const 1328 call $~lib/array/Array<~lib/string/String>#push end - br $folding-inner2 + local.get $5 + call $~lib/rt/pure/__release + local.get $1 + return end i32.const 0 call $~lib/rt/__newArray call $~lib/rt/pure/__retain local.set $0 end - local.get $4 + local.get $5 call $~lib/rt/pure/__release local.get $0 return end - local.get $4 + local.get $5 call $~lib/rt/pure/__release local.get $1 ) diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index c34566198c..17dfd3ff22 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -9609,8 +9609,8 @@ i32.eq if local.get $0 - f32.const 2 - f32.mul + local.get $0 + f32.add local.tee $0 local.get $0 f32.div @@ -9652,90 +9652,86 @@ i32.shl end local.set $1 - loop $while-continue|0 - local.get $2 - i32.const 128 - i32.gt_s - if - local.get $1 - i32.const 8388608 - i32.ge_u - if (result i32) + block $folding-inner0 + loop $while-continue|0 + local.get $2 + i32.const 128 + i32.gt_s + if local.get $1 i32.const 8388608 - i32.eq - if - local.get $0 - f32.const 0 - f32.mul - return + i32.ge_u + if (result i32) + local.get $1 + i32.const 8388608 + i32.eq + br_if $folding-inner0 + local.get $1 + i32.const 8388608 + i32.sub + else + local.get $1 end - local.get $1 - i32.const 8388608 + i32.const 1 + i32.shl + local.set $1 + local.get $2 + i32.const 1 i32.sub - else - local.get $1 + local.set $2 + br $while-continue|0 end - i32.const 1 - i32.shl - local.set $1 - local.get $2 - i32.const 1 - i32.sub - local.set $2 - br $while-continue|0 end - end - local.get $1 - i32.const 8388608 - i32.ge_u - if local.get $1 i32.const 8388608 - i32.eq + i32.ge_u if - local.get $0 - f32.const 0 - f32.mul - return + local.get $1 + i32.const 8388608 + i32.eq + br_if $folding-inner0 + local.get $1 + i32.const 8388608 + i32.sub + local.set $1 end local.get $1 - i32.const 8388608 - i32.sub - local.set $1 - end - local.get $1 - local.get $1 - i32.const 8 - i32.shl - i32.clz - local.tee $3 - i32.shl - local.set $1 - local.get $2 - local.get $3 - i32.sub - local.tee $2 - i32.const 0 - i32.gt_s - if (result i32) local.get $1 - i32.const 8388608 - i32.sub - local.get $2 - i32.const 23 + i32.const 8 i32.shl - i32.or - else - local.get $1 - i32.const 1 + i32.clz + local.tee $3 + i32.shl + local.set $1 local.get $2 + local.get $3 i32.sub - i32.shr_u + local.tee $2 + i32.const 0 + i32.gt_s + if (result i32) + local.get $1 + i32.const 8388608 + i32.sub + local.get $2 + i32.const 23 + i32.shl + i32.or + else + local.get $1 + i32.const 1 + local.get $2 + i32.sub + i32.shr_u + end + local.get $4 + i32.or + f32.reinterpret_i32 + return end - local.get $4 - i32.or - f32.reinterpret_i32 + local.get $0 + f32.const 0 + f32.mul ) (func $std/typedarray/testArrayEvery<~lib/typedarray/Float32Array,f32>~anonymous|0 (param $0 f32) (param $1 i32) (param $2 i32) (result i32) local.get $2 @@ -9836,8 +9832,8 @@ i64.eq if local.get $0 - f64.const 2 - f64.mul + local.get $0 + f64.add local.tee $0 local.get $0 f64.div @@ -9880,92 +9876,88 @@ i64.or end local.set $1 - loop $while-continue|0 - local.get $2 - i64.const 1024 - i64.gt_s - if - local.get $1 - i64.const 4503599627370496 - i64.ge_u - if (result i64) + block $folding-inner0 + loop $while-continue|0 + local.get $2 + i64.const 1024 + i64.gt_s + if local.get $1 i64.const 4503599627370496 - i64.eq - if - local.get $0 - f64.const 0 - f64.mul - return + i64.ge_u + if (result i64) + local.get $1 + i64.const 4503599627370496 + i64.eq + br_if $folding-inner0 + local.get $1 + i64.const 4503599627370496 + i64.sub + else + local.get $1 end - local.get $1 - i64.const 4503599627370496 + i64.const 1 + i64.shl + local.set $1 + local.get $2 + i64.const 1 i64.sub - else - local.get $1 + local.set $2 + br $while-continue|0 end - i64.const 1 - i64.shl - local.set $1 - local.get $2 - i64.const 1 - i64.sub - local.set $2 - br $while-continue|0 end - end - local.get $1 - i64.const 4503599627370496 - i64.ge_u - if local.get $1 i64.const 4503599627370496 - i64.eq + i64.ge_u if - local.get $0 - f64.const 0 - f64.mul - return + local.get $1 + i64.const 4503599627370496 + i64.eq + br_if $folding-inner0 + local.get $1 + i64.const 4503599627370496 + i64.sub + local.set $1 end local.get $1 - i64.const 4503599627370496 - i64.sub - local.set $1 - end - local.get $1 - local.get $1 - i64.const 11 - i64.shl - i64.clz - local.tee $3 - i64.shl - local.set $1 - local.get $2 - local.get $3 - i64.sub - local.tee $2 - i64.const 0 - i64.gt_s - if (result i64) local.get $1 - i64.const 4503599627370496 - i64.sub - local.get $2 - i64.const 52 + i64.const 11 i64.shl - i64.or - else - local.get $1 - i64.const 1 + i64.clz + local.tee $3 + i64.shl + local.set $1 local.get $2 + local.get $3 i64.sub - i64.shr_u + local.tee $2 + i64.const 0 + i64.gt_s + if (result i64) + local.get $1 + i64.const 4503599627370496 + i64.sub + local.get $2 + i64.const 52 + i64.shl + i64.or + else + local.get $1 + i64.const 1 + local.get $2 + i64.sub + i64.shr_u + end + local.get $4 + i64.const 63 + i64.shl + i64.or + f64.reinterpret_i64 + return end - local.get $4 - i64.const 63 - i64.shl - i64.or - f64.reinterpret_i64 + local.get $0 + f64.const 0 + f64.mul ) (func $std/typedarray/testArrayEvery<~lib/typedarray/Float64Array,f64>~anonymous|0 (param $0 f64) (param $1 i32) (param $2 i32) (result i32) local.get $2