From f49c23d7baaae4cf2676cc09802438c997a4aff4 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 28 Feb 2020 00:30:04 +0200 Subject: [PATCH 1/6] update --- std/assembly/util/math.ts | 12 +++++----- tests/compiler/std/math.untouched.wat | 34 +++++++++++++-------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/std/assembly/util/math.ts b/std/assembly/util/math.ts index dfa13016b9..4a3735f7a3 100644 --- a/std/assembly/util/math.ts +++ b/std/assembly/util/math.ts @@ -168,9 +168,9 @@ export function log2f_lut(x: f32): f32 { // if (WANT_ROUNDING && predict_false(ix == 0x3f800000)) return 0; if (ux - 0x00800000 >= 0x7F800000 - 0x00800000) { // x < 0x1p-126 or inf or nan. - if (ux * 2 == 0) return -Infinity; + if ((ux << 1) == 0) return -Infinity; if (ux == 0x7F800000) return x; // log2(inf) == inf. - if ((ux >> 31) || ux * 2 >= 0xFF000000) return (x - x) / (x - x); + if ((ux >> 31) || (ux << 1) >= 0xFF000000) return (x - x) / (x - x); // x is subnormal, normalize it. ux = reinterpret(x * Ox1p23f); ux -= 23 << 23; @@ -193,11 +193,11 @@ export function log2f_lut(x: f32): f32 { var y0 = logc + k; // Pipelined polynomial evaluation to approximate log1p(r)/ln2. + var r2 = r * r; var y = A1 * r + A2; var p = A3 * r + y0; - var r2 = r * r; - y += A0 * r2; - y = y * r2 + p; + y = A0 * r2 + y; + y = y * r2 + p; return y; } @@ -278,7 +278,7 @@ export function logf_lut(x: f32): f32 { // Pipelined polynomial evaluation to approximate log1p(r). var r2 = r * r; var y = A1 * r + A2; - y += A0 * r2; + y = A0 * r2 + y; y = y * r2 + (y0 + r); return y; diff --git a/tests/compiler/std/math.untouched.wat b/tests/compiler/std/math.untouched.wat index 1d3bfff00f..2d59bac122 100644 --- a/tests/compiler/std/math.untouched.wat +++ b/tests/compiler/std/math.untouched.wat @@ -2038,10 +2038,10 @@ f64.const -0.4999997485802103 f64.add local.set $13 - local.get $13 f64.const -0.25089342214237154 local.get $12 f64.mul + local.get $13 f64.add local.set $13 local.get $13 @@ -8762,8 +8762,8 @@ i32.ge_u if local.get $2 - i32.const 2 - i32.mul + i32.const 1 + i32.shl i32.const 0 i32.eq if @@ -8785,8 +8785,8 @@ i32.const 1 else local.get $2 - i32.const 2 - i32.mul + i32.const 1 + i32.shl i32.const -16777216 i32.ge_u end @@ -8869,35 +8869,35 @@ f64.convert_i32_s f64.add local.set $12 + local.get $11 + local.get $11 + f64.mul + local.set $13 f64.const 0.4811247078767291 local.get $11 f64.mul f64.const -0.7213476299867769 f64.add - local.set $13 + local.set $14 f64.const 1.4426950186867042 local.get $11 f64.mul local.get $12 f64.add - local.set $14 - local.get $11 - local.get $11 - f64.mul local.set $15 - local.get $13 f64.const -0.36051725506874704 - local.get $15 - f64.mul - f64.add - local.set $13 local.get $13 - local.get $15 f64.mul local.get $14 f64.add - local.set $13 + local.set $14 + local.get $14 local.get $13 + f64.mul + local.get $15 + f64.add + local.set $14 + local.get $14 f32.demote_f64 end return From 6db5b7eaf496d85c21fcd5cf761803200e8e4422 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 28 Feb 2020 02:11:03 +0200 Subject: [PATCH 2/6] disable fast lut exp, log, pow --- std/assembly/math.ts | 258 +- tests/compiler/std/libm.optimized.wat | 1118 ++-- tests/compiler/std/libm.untouched.wat | 6048 ++++++++++++---------- tests/compiler/std/math.optimized.wat | 2180 +++----- tests/compiler/std/math.ts | 4 +- tests/compiler/std/math.untouched.wat | 6908 +++++++++++-------------- 6 files changed, 8145 insertions(+), 8371 deletions(-) diff --git a/std/assembly/math.ts b/std/assembly/math.ts index 57986c45d7..ee21fcf160 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1,10 +1,11 @@ import * as JSMath from "./bindings/Math"; export { JSMath }; -import { - pow_lut, exp_lut, exp2_lut, log_lut, log2_lut, - powf_lut, expf_lut, exp2f_lut, logf_lut, log2f_lut -} from "./util/math"; +// TODO: Fast methods with lookup tables have some preicision issues so temporary disabled +// import { +// pow_lut, exp_lut, exp2_lut, log_lut, log2_lut, +// powf_lut, expf_lut, exp2f_lut, logf_lut, log2f_lut +// } from "./util/math"; import { abs as builtin_abs, @@ -781,9 +782,10 @@ export namespace NativeMath { } export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above - if (ASC_SHRINK_LEVEL < 1) { - return exp_lut(x); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return exp_lut(x); + // } else + { const ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01 ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10 @@ -827,9 +829,9 @@ export namespace NativeMath { } } - export function exp2(x: f64): f64 { - return exp2_lut(x); - } + // export function exp2(x: f64): f64 { + // return exp2_lut(x); + // } export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above const @@ -963,9 +965,10 @@ export namespace NativeMath { } export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above - if (ASC_SHRINK_LEVEL < 1) { - return log_lut(x); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return log_lut(x); + // } else + { const ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01 ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10 @@ -1113,9 +1116,10 @@ export namespace NativeMath { } export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above - if (ASC_SHRINK_LEVEL < 1) { - return log2_lut(x); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return log2_lut(x); + // } else + { const ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00 ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10 @@ -1194,9 +1198,10 @@ export namespace NativeMath { if (y == 1.0) return x; if (y == 0.0) return 1.0; } - if (ASC_SHRINK_LEVEL < 1) { - return pow_lut(x, y); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return pow_lut(x, y); + // } else + { const dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01 dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08 @@ -2232,9 +2237,10 @@ export namespace NativeMathf { } export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above - if (ASC_SHRINK_LEVEL < 1) { - return expf_lut(x); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return expf_lut(x); + // } else + { const ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f @@ -2277,9 +2283,9 @@ export namespace NativeMathf { } } - export function exp2(x: f32): f32 { - return exp2f_lut(x); - } + // export function exp2(x: f32): f32 { + // return exp2f_lut(x); + // } export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above const @@ -2395,9 +2401,10 @@ export namespace NativeMathf { } export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above - if (ASC_SHRINK_LEVEL < 1) { - return logf_lut(x); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return logf_lut(x); + // } else + { const ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f @@ -2522,9 +2529,10 @@ export namespace NativeMathf { } export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above - if (ASC_SHRINK_LEVEL < 1) { - return log2f_lut(x); - } else { + // if (ASC_SHRINK_LEVEL < 1) { + // return log2f_lut(x); + // } else + { const ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04 @@ -2592,7 +2600,193 @@ export namespace NativeMathf { if (y == 1.0) return x; if (y == 0.0) return 1.0; } - return powf_lut(x, y); + // return powf_lut(x, y); + const + dp_h1 = reinterpret(0x3F15C000), // 5.84960938e-01f + dp_l1 = reinterpret(0x35D1CFDC), // 1.56322085e-06f + two24 = reinterpret(0x4B800000), // 16777216f + huge = reinterpret(0x7149F2CA), // 1.0e+30f + tiny = reinterpret(0x0DA24260), // 1.0e-30f + L1 = reinterpret(0x3F19999A), // 6.0000002384e-01f + L2 = reinterpret(0x3EDB6DB7), // 4.2857143283e-01f + L3 = reinterpret(0x3EAAAAAB), // 3.3333334327e-01f + L4 = reinterpret(0x3E8BA305), // 2.7272811532e-01f + L5 = reinterpret(0x3E6C3255), // 2.3066075146e-01f + L6 = reinterpret(0x3E53F142), // 2.0697501302e-01f + P1 = reinterpret(0x3E2AAAAB), // 1.6666667163e-01f + P2 = reinterpret(0xBB360B61), // -2.7777778450e-03f + P3 = reinterpret(0x388AB355), // 6.6137559770e-05f + P4 = reinterpret(0xB5DDEA0E), // -1.6533901999e-06f + P5 = reinterpret(0x3331BB4C), // 4.1381369442e-08f + lg2 = reinterpret(0x3F317218), // 6.9314718246e-01f + lg2_h = reinterpret(0x3F317200), // 6.93145752e-01f + lg2_l = reinterpret(0x35BFBE8C), // 1.42860654e-06f + ovt = reinterpret(0x3338AA3C), // 4.2995665694e-08f + cp = reinterpret(0x3F76384F), // 9.6179670095e-01 + cp_h = reinterpret(0x3F764000), // 9.6191406250e-01 + cp_l = reinterpret(0xB8F623C6), // -1.1736857402e-04 + ivln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00 + ivln2_h = reinterpret(0x3FB8AA00), // 1.4426879883e+00 + ivln2_l = reinterpret(0x36ECA570), // 7.0526075433e-06 + inv3 = reinterpret(0x3EAAAAAB); // 0.333333333333 + var hx = reinterpret(x); + var hy = reinterpret(y); + var ix = hx & 0x7FFFFFFF; + var iy = hy & 0x7FFFFFFF; + if (iy == 0) return 1.0; // x**0 = 1, even if x is NaN + // if (hx == 0x3F800000) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN + if (ix > 0x7F800000 || iy > 0x7F800000) return x + y; // NaN if either arg is NaN + var yisint = 0, j: i32, k: i32; + if (hx < 0) { + if (iy >= 0x4B800000) yisint = 2; + else if (iy >= 0x3F800000) { + k = (iy >> 23) - 0x7F; + let ki = 23 - k; + j = iy >> ki; + if ((j << ki) == iy) yisint = 2 - (j & 1); + } + } + if (iy == 0x7F800000) { // y is +-inf + if (ix == 0x3F800000) return NaN; // C: (-1)**+-inf is 1, JS: NaN + else if (ix > 0x3F800000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0 + else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf + } + if (iy == 0x3F800000) return hy >= 0 ? x : 1.0 / x; + if (hy == 0x40000000) return x * x; + if (hy == 0x3F000000) { + if (hx >= 0) return builtin_sqrt(x); + } + var ax = builtin_abs(x); + var z: f32; + if (ix == 0x7F800000 || ix == 0 || ix == 0x3F800000) { + z = ax; + if (hy < 0) z = 1.0 / z; + if (hx < 0) { + if (((ix - 0x3F800000) | yisint) == 0) { + let d = z - z; + z = d / d; + } + else if (yisint == 1) z = -z; + } + return z; + } + var sn = 1.0; + if (hx < 0) { + if (yisint == 0) { + let d = x - x; + return d / d; + } + if (yisint == 1) sn = -1.0; + } + var t1: f32, t2: f32, r: f32, s: f32, t: f32, u: f32, v: f32, w: f32, p_h: f32, p_l: f32; + var n: i32, is: i32; + if (iy > 0x4D000000) { + if (ix < 0x3F7FFFF8) return hy < 0 ? sn * huge * huge : sn * tiny * tiny; + if (ix > 0x3F800007) return hy > 0 ? sn * huge * huge : sn * tiny * tiny; + t = ax - 1; + w = (t * t) * (0.5 - t * (inv3 - t * 0.25)); + u = ivln2_h * t; + v = t * ivln2_l - w * ivln2; + t1 = u + v; + is = reinterpret(t1); + t1 = reinterpret(is & 0xFFFFF000); + t2 = v - (t1 - u); + } else { + let s2: f32, s_h: f32, s_l: f32, t_h: f32, t_l: f32; + n = 0; + if (ix < 0x00800000) { + ax *= two24; + n -= 24; + ix = reinterpret(ax); + } + n += (ix >> 23) - 0x7F; + j = ix & 0x007FFFFF; + ix = j | 0x3F800000; + if (j <= 0x1CC471) k = 0; + else if (j < 0x5DB3D7) k = 1; + else { + k = 0; + n += 1; + ix -= 0x00800000; + } + ax = reinterpret(ix); + let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0 + u = ax - bp; + v = 1.0 / (ax + bp); + s = u * v; + s_h = s; + is = reinterpret(s_h); + s_h = reinterpret(is & 0xFFFFF000); + is = ((ix >> 1) & 0xFFFFF000) | 0x20000000; + t_h = reinterpret(is + 0x00400000 + (k << 21)); + t_l = ax - (t_h - bp); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + s2 = s * s; + r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6))))); + r += s_l * (s_h + s); + s2 = s_h * s_h; + t_h = 3.0 + s2 + r; + is = reinterpret(t_h); + t_h = reinterpret(is & 0xFFFFF000); + t_l = r - ((t_h - 3.0) - s2); + u = s_h * t_h; + v = s_l * t_h + t_l * s; + p_h = u + v; + is = reinterpret(p_h); + p_h = reinterpret(is & 0xFFFFF000); + p_l = v - (p_h - u); + let z_h = cp_h * p_h; + let dp_l = select(dp_l1, 0.0, k); + let z_l = cp_l * p_h + p_l * cp + dp_l; + t = n; + let dp_h = select(dp_h1, 0.0, k); + t1 = (((z_h + z_l) + dp_h) + t); + is = reinterpret(t1); + t1 = reinterpret(is & 0xFFFFF000); + t2 = z_l - (((t1 - t) - dp_h) - z_h); + } + is = reinterpret(y); + var y1 = reinterpret(is & 0xFFFFF000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + j = reinterpret(z); + if (j > 0x43000000) { + return sn * huge * huge; + } else if (j == 0x43000000) { + if (p_l + ovt > z - p_h) return sn * huge * huge; + } else if ((j & 0x7FFFFFFF) > 0x43160000) { + return sn * tiny * tiny; + } else if (j == 0xC3160000) { + if (p_l <= z - p_h) return sn * tiny * tiny; + } + var i = j & 0x7FFFFFFF; + k = (i >> 23) - 0x7F; + n = 0; + if (i > 0x3F000000) { + n = j + (0x00800000 >> (k + 1)); + k = ((n & 0x7FFFFFFF) >> 23) - 0x7F; + t = reinterpret(n & ~(0x007FFFFF >> k)); + n = ((n & 0x007FFFFF) | 0x00800000) >> (23 - k); + if (j < 0) n = -n; + p_h -= t; + } + t = p_l + p_h; + is = reinterpret(t); + t = reinterpret(is & 0xFFFF8000); + u = t * lg2_h; + v = (p_l - (t - p_h)) * lg2 + t * lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5)))); + r = (z * t1) / (t1 - 2.0) - (w + z * w); + z = 1.0 - (r - z); + j = reinterpret(z); + j += n << 23; + if ((j >> 23) <= 0) z = scalbn(z, n); + else z = reinterpret(j); + return sn * z; } // @ts-ignore: decorator diff --git a/tests/compiler/std/libm.optimized.wat b/tests/compiler/std/libm.optimized.wat index 785afe33b4..996330280e 100644 --- a/tests/compiler/std/libm.optimized.wat +++ b/tests/compiler/std/libm.optimized.wat @@ -11,8 +11,6 @@ (memory $0 1) (data (i32.const 16) "\c0\00\00\00\01\00\00\00\03\00\00\00\c0\00\00\00n\83\f9\a2\00\00\00\00\d1W\'\fc)\15DN\99\95b\db\c0\dd4\f5\abcQ\feA\90C<:n$\b7a\c5\bb\de\ea.I\06\e0\d2MB\1c\eb\1d\fe\1c\92\d1\t\f55\82\e8>\a7)\b1&p\9c\e9\84D\bb.9\d6\919A~_\b4\8b_\84\9c\f49S\83\ff\97\f8\1f;(\f9\bd\8b\11/\ef\0f\98\05\de\cf~6m\1fm\nZf?FO\b7\t\cb\'\c7\ba\'u-\ea_\9e\f79\07={\f1\e5\eb\b1_\fbk\ea\92R\8aF0\03V\08]\8d\1f \bc\cf\f0\abk{\fca\91\e3\a9\1d6\f4\9a_\85\99e\08\1b\e6^\80\d8\ff\8d@h\a0\14W\15\06\061\'sM") (data (i32.const 224) " \00\00\00\01\00\00\00\03\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") - (data (i32.const 273) "\01\00\00\01\00\00\00\04\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\190\96[\c6\fe\de\bf=\88\afJ\edq\f5?\a4\fc\d42h\0b\db\bf\b0\10\f0\f09\95\f4?{\b7\1f\n\8bA\d7\bf\85\03\b8\b0\95\c9\f3?{\cfm\1a\e9\9d\d3\bf\a5d\88\0c\19\0d\f3?1\b6\f2\f3\9b\1d\d0\bf\a0\8e\0b{\"^\f2?\f0z;\1b\1d|\c9\bf?4\1aJJ\bb\f1?\9f<\af\93\e3\f9\c2\bf\ba\e5\8a\f0X#\f1?\\\8dx\bf\cb`\b9\bf\a7\00\99A?\95\f0?\ce_G\b6\9do\aa\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?=\f5$\9f\ca8\b3?\a0j\02\1f\b3\a4\ec?\ba\918T\a9v\c4?\e6\fcjW6 \eb?\d2\e4\c4J\0b\84\ce?-\aa\a1c\d1\c2\e9?\1ce\c6\f0E\06\d4?\edAx\03\e6\86\e8?\f8\9f\1b,\9c\8e\d8?bHS\f5\dcg\e7?\cc{\b1N\a4\e0\dc?") - (data (i32.const 545) "\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\00\00\00\00\00\00\f0?t\85\15\d3\b0\d9\ef?\0f\89\f9lX\b5\ef?Q[\12\d0\01\93\ef?{Q}<\b8r\ef?\aa\b9h1\87T\ef?8bunz8\ef?\e1\de\1f\f5\9d\1e\ef?\15\b71\n\fe\06\ef?\cb\a9:7\a7\f1\ee?\"4\12L\a6\de\ee?-\89a`\08\ce\ee?\'*6\d5\da\bf\ee?\82O\9dV+\b4\ee?)TH\dd\07\ab\ee?\85U:\b0~\a4\ee?\cd;\7ff\9e\a0\ee?t_\ec\e8u\9f\ee?\87\01\ebs\14\a1\ee?\13\ceL\99\89\a5\ee?\db\a0*B\e5\ac\ee?\e5\c5\cd\b07\b7\ee?\90\f0\a3\82\91\c4\ee?]%>\b2\03\d5\ee?\ad\d3Z\99\9f\e8\ee?G^\fb\f2v\ff\ee?\9cR\85\dd\9b\19\ef?i\90\ef\dc 7\ef?\87\a4\fb\dc\18X\ef?_\9b{3\97|\ef?\da\90\a4\a2\af\a4\ef?@En[v\d0\ef?") (global $../../lib/libm/assembly/libm/E f64 (f64.const 2.718281828459045)) (global $../../lib/libm/assembly/libm/LN10 f64 (f64.const 2.302585092994046)) (global $../../lib/libm/assembly/libm/LN2 f64 (f64.const 0.6931471805599453)) @@ -7774,14 +7772,21 @@ f32.min ) (func $~lib/math/NativeMathf.pow (; 106 ;) (param $0 f32) (param $1 f32) (result f32) - (local $2 i32) - (local $3 i32) - (local $4 f64) + (local $2 f32) + (local $3 f32) + (local $4 i32) (local $5 i32) - (local $6 f64) + (local $6 i32) (local $7 i32) - (local $8 i64) - (local $9 f64) + (local $8 f32) + (local $9 i32) + (local $10 i32) + (local $11 f32) + (local $12 i32) + (local $13 f32) + (local $14 f32) + (local $15 f32) + (local $16 f32) local.get $1 f32.abs f32.const 2 @@ -7834,402 +7839,773 @@ return end end - block $~lib/util/math/powf_lut|inlined.0 - local.get $1 - i32.reinterpret_f32 - local.tee $3 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - i32.const 0 - i32.ne - local.tee $5 + local.get $0 + i32.reinterpret_f32 + local.tee $7 + i32.const 2147483647 + i32.and + local.set $4 + local.get $1 + i32.reinterpret_f32 + local.tee $10 + i32.const 2147483647 + i32.and + local.tee $9 + i32.eqz + if + f32.const 1 + return + end + i32.const 1 + local.get $9 + i32.const 2139095040 + i32.gt_s + local.get $4 + i32.const 2139095040 + i32.gt_s + select + if local.get $0 - i32.reinterpret_f32 - local.tee $2 - i32.const 8388608 - i32.sub - i32.const 2130706432 - i32.ge_u - i32.or - if - local.get $5 - if - local.get $3 - i32.const 1 - i32.shl - i32.eqz - if - f32.const 1 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - i32.const 1065353216 - i32.eq - if - f32.const nan:0x400000 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - i32.const 1 - local.get $3 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - local.get $2 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - select - if - local.get $0 - local.get $1 - f32.add - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - i32.const 1 - i32.shl - i32.const 2130706432 - i32.eq - if - f32.const nan:0x400000 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $3 - i32.const 31 - i32.shr_u - i32.eqz - local.get $2 - i32.const 1 + local.get $1 + f32.add + return + end + local.get $7 + i32.const 0 + i32.lt_s + if + local.get $9 + i32.const 1266679808 + i32.ge_s + if (result i32) + i32.const 2 + else + local.get $9 + i32.const 1065353216 + i32.ge_s + if (result i32) + local.get $9 + local.get $9 + i32.const 150 + local.get $9 + i32.const 23 + i32.shr_s + i32.sub + local.tee $12 + i32.shr_s + local.tee $5 + local.get $12 i32.shl - i32.const 2130706432 - i32.lt_u i32.eq - if - f32.const 0 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $1 - local.get $1 - f32.mul - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - if - local.get $0 - local.get $0 - f32.mul - local.set $0 - local.get $2 - i32.const 31 - i32.shr_u if (result i32) - block $~lib/util/math/checkintf|inlined.0 (result i32) - i32.const 0 - local.get $3 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.tee $2 - i32.const 127 - i32.lt_u - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 2 - local.get $2 - i32.const 150 - i32.gt_u - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 0 - local.get $3 - i32.const 1 - i32.const 150 - local.get $2 - i32.sub - i32.shl - local.tee $2 - i32.const 1 - i32.sub - i32.and - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 1 - local.get $2 - local.get $3 - i32.and - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 2 - end + i32.const 2 + local.get $5 i32.const 1 - i32.eq + i32.and + i32.sub else i32.const 0 end - if - local.get $0 - f32.neg - local.set $0 - end - local.get $3 - i32.const 31 - i32.shr_u - if - f32.const 1 - local.get $0 - f32.div - local.set $0 - end - br $~lib/util/math/powf_lut|inlined.0 + else + i32.const 0 end - local.get $2 - i32.const 31 - i32.shr_u + end + local.set $6 + end + local.get $9 + i32.const 2139095040 + i32.eq + if + local.get $4 + i32.const 1065353216 + i32.eq + if + f32.const nan:0x400000 + return + else + local.get $4 + i32.const 1065353216 + i32.gt_s if - block $~lib/util/math/checkintf|inlined.1 (result i32) - i32.const 0 - local.get $3 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.tee $5 - i32.const 127 - i32.lt_u - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 2 - local.get $5 - i32.const 150 - i32.gt_u - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 0 - local.get $3 - i32.const 1 - i32.const 150 - local.get $5 - i32.sub - i32.shl - local.tee $5 - i32.const 1 - i32.sub - i32.and - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 1 - local.get $3 - local.get $5 - i32.and - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 2 - end - local.tee $3 - i32.eqz + local.get $10 + i32.const 0 + i32.lt_s if - local.get $0 - local.get $0 - f32.sub - local.tee $0 - local.get $0 - f32.div - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 + f32.const 0 + local.set $1 end - i32.const 65536 + local.get $1 + return + else + f32.const 0 + local.get $1 + f32.neg + local.get $10 i32.const 0 - local.get $3 - i32.const 1 - i32.eq + i32.ge_s select - local.set $7 - local.get $2 - i32.const 2147483647 - i32.and - local.set $2 - end - local.get $2 - i32.const 8388608 - i32.lt_u - if - local.get $0 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - i32.const 2147483647 - i32.and - i32.const 192937984 - i32.sub - local.set $2 + return end + unreachable end - f64.const 1.4426950408774342 - local.get $2 - local.get $2 - i32.const 1060306944 - i32.sub - local.tee $3 - i32.const -8388608 - i32.and - local.tee $2 - i32.sub - f32.reinterpret_i32 - f64.promote_f32 - local.get $3 - i32.const 19 - i32.shr_u - i32.const 15 - i32.and - i32.const 4 - i32.shl - i32.const 288 - i32.add - local.tee $3 - f64.load - f64.mul - f64.const 1 - f64.sub - local.tee $4 - f64.mul + unreachable + end + local.get $9 + i32.const 1065353216 + i32.eq + if + local.get $10 + i32.const 0 + i32.lt_s + if + f32.const 1 + local.get $0 + f32.div + local.set $0 + end + local.get $0 + return + end + local.get $10 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $10 + i32.const 1056964608 + i32.eq + if + local.get $7 + i32.const 0 + i32.ge_s + if + local.get $0 + f32.sqrt + return + end + end + local.get $0 + f32.abs + local.set $3 + i32.const 1 + local.get $4 + i32.const 1065353216 + i32.eq + i32.const 1 + local.get $4 + i32.eqz + local.get $4 + i32.const 2139095040 + i32.eq + select + select + if + f32.const 1 local.get $3 - f64.load offset=8 + f32.div + local.get $3 + local.get $10 + i32.const 0 + i32.lt_s + select + local.set $3 + local.get $7 + i32.const 0 + i32.lt_s + if (result f32) + local.get $6 + local.get $4 + i32.const 1065353216 + i32.sub + i32.or + if (result f32) + local.get $3 + f32.neg + local.get $3 + local.get $6 + i32.const 1 + i32.eq + select + else + local.get $3 + local.get $3 + f32.sub + local.tee $0 + local.get $0 + f32.div + end + else + local.get $3 + end + return + end + f32.const 1 + local.set $11 + local.get $7 + i32.const 0 + i32.lt_s + if + local.get $6 + i32.eqz + if + local.get $0 + local.get $0 + f32.sub + local.tee $0 + local.get $0 + f32.div + return + end + f32.const -1 + f32.const 1 + local.get $6 + i32.const 1 + i32.eq + select + local.set $11 + end + local.get $9 + i32.const 1291845632 + i32.gt_s + if (result f32) + local.get $4 + i32.const 1065353208 + i32.lt_s + if + local.get $11 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + local.get $11 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + local.get $10 + i32.const 0 + i32.lt_s + select + return + end + local.get $4 + i32.const 1065353223 + i32.gt_s + if + local.get $11 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + local.get $11 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + local.get $10 + i32.const 0 + i32.gt_s + select + return + end + local.get $3 + f32.const 1 + f32.sub + local.tee $2 local.get $2 + f32.mul + f32.const 0.5 + local.get $2 + f32.const 0.3333333432674408 + local.get $2 + f32.const 0.25 + f32.mul + f32.sub + f32.mul + f32.sub + f32.mul + local.set $0 + f32.const 1.44268798828125 + local.get $2 + f32.mul + local.tee $3 + local.get $2 + f32.const 7.052607543300837e-06 + f32.mul + local.get $0 + f32.const 1.4426950216293335 + f32.mul + f32.sub + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $8 + local.get $0 + local.get $8 + local.get $3 + f32.sub + f32.sub + else + i32.const 0 + local.set $6 + local.get $4 + i32.const 8388608 + i32.lt_s + if (result i32) + local.get $3 + f32.const 16777216 + f32.mul + i32.reinterpret_f32 + local.set $4 + i32.const -24 + else + i32.const 0 + end + local.get $4 i32.const 23 i32.shr_s - f64.convert_i32_s - f64.add - f64.add - f64.const 0.480898481472577 - local.get $4 - f64.mul - f64.const -0.7213474675006291 - f64.add + i32.const 127 + i32.sub + i32.add + local.set $6 local.get $4 + i32.const 8388607 + i32.and + local.tee $5 + i32.const 1065353216 + i32.or + local.set $4 + local.get $5 + i32.const 1885297 + i32.le_s + if (result i32) + i32.const 0 + else + local.get $5 + i32.const 6140887 + 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 8388608 + i32.sub + local.set $4 + i32.const 0 + end + end + local.set $5 local.get $4 - f64.mul - local.tee $6 - f64.mul - f64.add - local.set $9 - local.get $1 - f64.promote_f32 - f64.const 0.288457581109214 + f32.reinterpret_i32 + local.tee $3 + f32.const 1.5 + f32.const 1 + local.get $5 + select + local.tee $0 + f32.sub + local.tee $8 + f32.const 1 + local.get $3 + local.get $0 + f32.add + f32.div + local.tee $2 + f32.mul + local.tee $15 + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $13 + local.get $3 local.get $4 - f64.mul - f64.const -0.36092606229713164 - f64.add - local.get $6 + i32.const 1 + i32.shr_s + i32.const -4096 + i32.and + i32.const 536870912 + i32.or + i32.const 4194304 + i32.add + local.get $5 + i32.const 21 + i32.shl + i32.add + f32.reinterpret_i32 + local.tee $3 + local.get $0 + f32.sub + f32.sub + local.set $0 + f32.const 0.9619140625 + local.get $13 + f32.const 3 + local.get $13 + local.get $13 + f32.mul + local.tee $16 + f32.add + local.get $15 + local.get $15 + f32.mul + local.tee $14 + local.get $14 + f32.mul + f32.const 0.6000000238418579 + local.get $14 + f32.const 0.4285714328289032 + local.get $14 + f32.const 0.3333333432674408 + local.get $14 + f32.const 0.2727281153202057 + local.get $14 + f32.const 0.23066075146198273 + local.get $14 + f32.const 0.20697501301765442 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + local.get $2 + local.get $8 + local.get $13 + local.get $3 + f32.mul + f32.sub + local.get $13 + local.get $0 + f32.mul + f32.sub + f32.mul + local.tee $2 + local.get $13 + local.get $15 + f32.add + f32.mul + f32.add + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.tee $8 + f32.mul + local.tee $3 + local.get $2 + local.get $8 + f32.mul + local.get $0 + local.get $8 + f32.const 3 + f32.sub + local.get $16 + f32.sub + f32.sub + local.get $15 + f32.mul + f32.add + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.tee $2 + f32.mul + local.tee $16 + f32.const -1.1736857413779944e-04 + local.get $2 + f32.mul + local.get $0 + local.get $2 + local.get $3 + f32.sub + f32.sub + f32.const 0.9617967009544373 + f32.mul + f32.add + f32.const 1.5632208487659227e-06 + f32.const 0 + local.get $5 + select + f32.add + local.tee $2 + f32.add + f32.const 0.5849609375 + f32.const 0 + local.get $5 + select + local.tee $3 + f32.add local.get $6 - f64.mul - f64.mul - local.get $9 - f64.add - f64.mul - local.tee $4 - i64.reinterpret_f64 - i64.const 47 - i64.shr_u - i64.const 65535 - i64.and - i64.const 32959 - i64.ge_u - if - local.get $4 - f64.const 127.99999995700433 - f64.gt + f32.convert_i32_s + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $8 + local.get $2 + local.get $8 + local.get $0 + f32.sub + local.get $3 + f32.sub + local.get $16 + f32.sub + f32.sub + end + local.set $3 + block $folding-inner1 + block $folding-inner0 + local.get $1 + local.get $1 + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.tee $0 + f32.sub + local.get $8 + f32.mul + local.get $1 + local.get $3 + f32.mul + f32.add + local.tee $1 + local.get $0 + local.get $8 + f32.mul + local.tee $2 + f32.add + local.tee $0 + i32.reinterpret_f32 + local.tee $7 + i32.const 1124073472 + i32.gt_s + br_if $folding-inner0 + local.get $7 + i32.const 1124073472 + i32.eq if - f32.const -1584563250285286751870879e5 - f32.const 1584563250285286751870879e5 + local.get $1 + f32.const 4.299566569443414e-08 + f32.add + local.get $0 + local.get $2 + f32.sub + f32.gt + br_if $folding-inner0 + else local.get $7 - select - f32.const 1584563250285286751870879e5 - f32.mul - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 + i32.const 2147483647 + i32.and + i32.const 1125515264 + i32.gt_s + if + br $folding-inner1 + else + local.get $7 + i32.const -1021968384 + i32.eq + i32.const 0 + local.get $1 + local.get $0 + local.get $2 + f32.sub + f32.le + select + br_if $folding-inner1 + end end - local.get $4 - f64.const -150 - f64.le + local.get $7 + i32.const 2147483647 + i32.and + local.tee $12 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $5 + i32.const 0 + local.set $6 + local.get $12 + i32.const 1056964608 + i32.gt_s if - f32.const -2.524354896707238e-29 - f32.const 2.524354896707238e-29 + i32.const 8388607 local.get $7 - select - f32.const 2.524354896707238e-29 - f32.mul + i32.const 8388608 + local.get $5 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.tee $12 + i32.const 2147483647 + i32.and + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.tee $5 + i32.shr_s + i32.const -1 + i32.xor + local.get $12 + i32.and + f32.reinterpret_i32 local.set $0 - br $~lib/util/math/powf_lut|inlined.0 + i32.const 0 + local.get $12 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + i32.const 23 + local.get $5 + i32.sub + i32.shr_s + local.tee $6 + i32.sub + local.get $6 + local.get $7 + i32.const 0 + i32.lt_s + select + local.set $6 + local.get $2 + local.get $0 + f32.sub + local.set $2 + end + local.get $1 + local.get $2 + f32.add + i32.reinterpret_f32 + i32.const -32768 + i32.and + f32.reinterpret_i32 + local.tee $0 + f32.const 0.693145751953125 + f32.mul + local.tee $3 + local.get $1 + local.get $0 + local.get $2 + f32.sub + f32.sub + f32.const 0.6931471824645996 + f32.mul + local.get $0 + f32.const 1.4286065379565116e-06 + f32.mul + f32.add + local.tee $1 + f32.add + local.tee $2 + local.get $2 + f32.mul + local.set $0 + local.get $11 + f32.const 1 + local.get $2 + local.get $2 + local.get $0 + f32.const 0.1666666716337204 + local.get $0 + f32.const -2.7777778450399637e-03 + local.get $0 + f32.const 6.61375597701408e-05 + local.get $0 + f32.const -1.6533901998627698e-06 + local.get $0 + f32.const 4.138136944220605e-08 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.sub + local.tee $0 + f32.mul + local.get $0 + f32.const 2 + f32.sub + f32.div + local.get $1 + local.get $2 + local.get $3 + f32.sub + f32.sub + local.tee $0 + local.get $2 + local.get $0 + f32.mul + f32.add + f32.sub + local.get $2 + f32.sub + f32.sub + local.tee $0 + i32.reinterpret_f32 + local.get $6 + i32.const 23 + i32.shl + i32.add + local.tee $5 + i32.const 23 + i32.shr_s + i32.const 0 + i32.le_s + if (result f32) + local.get $0 + local.get $6 + call $~lib/math/NativeMathf.scalbn + else + local.get $5 + f32.reinterpret_i32 end + f32.mul + return end - local.get $4 - f64.const 211106232532992 - f64.add - local.tee $6 - i64.reinterpret_f64 - local.tee $8 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl - i32.const 560 - i32.add - i64.load - local.get $8 - local.get $7 - i64.extend_i32_u - i64.add - i64.const 47 - i64.shl - i64.add - local.set $8 - f64.const 0.6931471806916203 - local.get $4 - local.get $6 - f64.const 211106232532992 - f64.sub - f64.sub - local.tee $4 - f64.mul - f64.const 1 - f64.add - f64.const 0.05550361559341535 - local.get $4 - f64.mul - f64.const 0.2402284522445722 - f64.add - local.get $4 - local.get $4 - f64.mul - f64.mul - f64.add - local.get $8 - f64.reinterpret_i64 - f64.mul - f32.demote_f64 - local.set $0 + local.get $11 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + return end - local.get $0 + local.get $11 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul ) (func $../../lib/libm/assembly/libmf/pow (; 107 ;) (param $0 f32) (param $1 f32) (result f32) local.get $0 diff --git a/tests/compiler/std/libm.untouched.wat b/tests/compiler/std/libm.untouched.wat index 6dae2603fd..a9c2383973 100644 --- a/tests/compiler/std/libm.untouched.wat +++ b/tests/compiler/std/libm.untouched.wat @@ -5,19 +5,12 @@ (type $f32_f32_=>_f32 (func (param f32 f32) (result f32))) (type $f64_=>_i32 (func (param f64) (result i32))) (type $f64_i64_=>_i32 (func (param f64 i64) (result i32))) + (type $f32_i32_=>_f32 (func (param f32 i32) (result f32))) + (type $f64_i32_=>_f64 (func (param f64 i32) (result f64))) (type $f64_f64_i32_=>_f64 (func (param f64 f64 i32) (result f64))) (memory $0 1) - (data (i32.const 16) "\00\08\00\00\01\00\00\00\03\00\00\00\00\08\00\00\9f\de\e0\c3\f04\f7?\00\90\e6y\7f\cc\d7\bf\1f\e9,jx\13\f7?\00\00\0d\c2\eeo\d7\bf\a0\b5\fa\08`\f2\f6?\00\e0Q\13\e3\13\d7\bf}\8c\13\1f\a6\d1\f6?\00x(8[\b8\d6\bf\d1\b4\c5\0bI\b1\f6?\00x\80\90U]\d6\bf\ba\0c/3G\91\f6?\00\00\18v\d0\02\d6\bf#B\"\18\9fq\f6?\00\90\90\86\ca\a8\d5\bf\d9\1e\a5\99OR\f6?\00P\03VCO\d5\bf\c4$\8f\aaV3\f6?\00@k\c37\f6\d4\bf\14\dc\9dk\b3\14\f6?\00P\a8\fd\a7\9d\d4\bfL\\\c6Rd\f6\f5?\00\a8\899\92E\d4\bfO,\91\b5g\d8\f5?\00\b8\b09\f4\ed\d3\bf\de\90[\cb\bc\ba\f5?\00p\8fD\ce\96\d3\bfx\1a\d9\f2a\9d\f5?\00\a0\bd\17\1e@\d3\bf\87VF\12V\80\f5?\00\80F\ef\e2\e9\d2\bf\d3k\e7\ce\97c\f5?\00\e008\1b\94\d2\bf\93\7f\a7\e2%G\f5?\00\88\da\8c\c5>\d2\bf\83E\06B\ff*\f5?\00\90\')\e1\e9\d1\bf\df\bd\b2\db\"\0f\f5?\00\f8H+m\95\d1\bf\d7\de4G\8f\f3\f4?\00\f8\b9\9agA\d1\bf@(\de\cfC\d8\f4?\00\98\ef\94\d0\ed\d0\bf\c8\a3x\c0>\bd\f4?\00\10\db\18\a5\9a\d0\bf\8a%\e0\c3\7f\a2\f4?\00\b8cR\e6G\d0\bf4\84\d4$\05\88\f4?\00\f0\86E\"\eb\cf\bf\0b-\19\1b\cem\f4?\00\b0\17uJG\cf\bfT\189\d3\d9S\f4?\000\10=D\a4\ce\bfZ\84\b4D\':\f4?\00\b0\e9D\0d\02\ce\bf\fb\f8\15A\b5 \f4?\00\f0w)\a2`\cd\bf\b1\f4>\da\82\07\f4?\00\90\95\04\01\c0\cc\bf\8f\feW]\8f\ee\f3?\00\10\89V) \cc\bf\e9L\0b\a0\d9\d5\f3?\00\10\81\8d\17\81\cb\bf+\c1\10\c0`\bd\f3?\00\d0\d3\cc\c9\e2\ca\bf\b8\dau+$\a5\f3?\00\90\12.@E\ca\bf\02\d0\9f\cd\"\8d\f3?\00\f0\1dhw\a8\c9\bf\1cz\84\c5[u\f3?\000Him\0c\c9\bf\e26\adI\ce]\f3?\00\c0E\a6 q\c8\bf@\d4M\98yF\f3?\000\14\b4\8f\d6\c7\bf$\cb\ff\ce\\/\f3?\00pb<\b8<\c7\bfI\0d\a1uw\18\f3?\00`7\9b\9a\a3\c6\bf\909>7\c8\01\f3?\00\a0\b7T1\0b\c6\bfA\f8\95\bbN\eb\f2?\000$v}s\c5\bf\d1\a9\19\02\n\d5\f2?\000\c2\8f{\dc\c4\bf*\fd\b7\a8\f9\be\f2?\00\00\d2Q,F\c4\bf\ab\1b\0cz\1c\a9\f2?\00\00\83\bc\8a\b0\c3\bf0\b5\14`r\93\f2?\00\00Ik\99\1b\c3\bf\f5\a1WW\fa}\f2?\00@\a4\90T\87\c2\bf\bf;\1d\9b\b3h\f2?\00\a0y\f8\b9\f3\c1\bf\bd\f5\8f\83\9dS\f2?\00\a0,%\c8`\c1\bf;\08\c9\aa\b7>\f2?\00 \f7W\7f\ce\c0\bf\b6@\a9+\01*\f2?\00\a0\feI\dc<\c0\bf2A\cc\96y\15\f2?\00\80K\bc\bdW\bf\bf\9b\fc\d2\1d \01\f2?\00@@\96\087\be\bf\0bHMI\f4\ec\f1?\00@\f9>\98\17\bd\bfie\8fR\f5\d8\f1?\00\a0\d8Ng\f9\bb\bf|~W\11#\c5\f1?\00`/ y\dc\ba\bf\e9&\cbt|\b1\f1?\00\80(\e7\c3\c0\b9\bf\b6\1a,\0c\01\9e\f1?\00\c0r\b3F\a6\b8\bf\bdp\b6{\b0\8a\f1?\00\00\ac\b3\01\8d\b7\bf\b6\bc\ef%\8aw\f1?\00\008E\f1t\b6\bf\da1L5\8dd\f1?\00\80\87m\0e^\b5\bf\dd_\'\90\b9Q\f1?\00\e0\a1\de\\H\b4\bfL\d22\a4\0e?\f1?\00\a0jM\d93\b3\bf\da\f9\10r\8b,\f1?\00`\c5\f8y \b2\bf1\b5\ec(0\1a\f1?\00 b\98F\0e\b1\bf\af4\84\da\fb\07\f1?\00\00\d2jl\fa\af\bf\b3kN\0f\ee\f5\f0?\00@wJ\8d\da\ad\bf\ce\9f*]\06\e4\f0?\00\00\85\e4\ec\bc\ab\bf!\a5,cD\d2\f0?\00\c0\12@\89\a1\a9\bf\1a\98\e2|\a7\c0\f0?\00\c0\023X\88\a7\bf\d16\c6\83/\af\f0?\00\80\d6g^q\a5\bf9\13\a0\98\db\9d\f0?\00\80eI\8a\\\a3\bf\df\e7R\af\ab\8c\f0?\00@\15d\e3I\a1\bf\fb(N/\9f{\f0?\00\80\eb\82\c0r\9e\bf\19\8f5\8c\b5j\f0?\00\80RR\f1U\9a\bf,\f9\ec\a5\eeY\f0?\00\80\81\cfb=\96\bf\90,\d1\cdII\f0?\00\00\aa\8c\fb(\92\bf\a9\ad\f0\c6\c68\f0?\00\00\f9 {1\8c\bf\a92y\13e(\f0?\00\00\aa]5\19\84\bfHs\ea\'$\18\f0?\00\00\ec\c2\03\12x\bf\95\b1\14\06\04\08\f0?\00\00$y\t\04`\bf\1a\fa&\f7\1f\e0\ef?\00\00\90\84\f3\efo?t\eaa\c2\1c\a1\ef?\00\00=5A\dc\87?.\99\81\b0\10c\ef?\00\80\c2\c4\a3\ce\93?\cd\ad\ee<\f6%\ef?\00\00\89\14\c1\9f\9b?\e7\13\91\03\c8\e9\ee?\00\00\11\ce\d8\b0\a1?\ab\b1\cbx\80\ae\ee?\00\c0\01\d0[\8a\a5?\9b\0c\9d\a2\1at\ee?\00\80\d8@\83\\\a9?\b5\99\n\83\91:\ee?\00\80W\efj\'\ad?V\9a`\t\e0\01\ee?\00\c0\98\e5\98u\b0?\98\bbw\e5\01\ca\ed?\00 \0d\e3\f5S\b2?\03\91|\0b\f2\92\ed?\00\008\8b\dd.\b4?\ce\\\fbf\ac\\\ed?\00\c0W\87Y\06\b6?\9d\de^\aa,\'\ed?\00\00j5v\da\b7?\cd,k>n\f2\ec?\00`\1cNC\ab\b9?\02y\a7\a2m\be\ec?\00`\0d\bb\c7x\bb?m\087m&\8b\ec?\00 \e72\13C\bd?\04X]\bd\94X\ec?\00`\deq1\n\bf?\8c\9f\bb3\b5&\ec?\00@\91+\15g\c0??\e7\ec\ee\83\f5\eb?\00\b0\92\82\85G\c1?\c1\96\dbu\fd\c4\eb?\000\ca\cdn&\c2?(J\86\0c\1e\95\eb?\00P\c5\a6\d7\03\c3?,>\ef\c5\e2e\eb?\00\103<\c3\df\c3?\8b\88\c9gH7\eb?\00\80zk6\ba\c4?J0\1d!K\t\eb?\00\f0\d1(9\93\c5?~\ef\f2\85\e8\db\ea?\00\f0\18$\cdj\c6?\a2=`1\1d\af\ea?\00\90f\ec\f8@\c7?\a7X\d3?\e6\82\ea?\00\f0\1a\f5\c0\15\c8?\8bs\t\ef@W\ea?\00\80\f6T)\e9\c8?\'K\ab\90*,\ea?\00@\f8\026\bb\c9?\d1\f2\93\13\a0\01\ea?\00\00,\1c\ed\8b\ca?\1b<\db$\9f\d7\e9?\00\d0\01\\Q[\cb?\90\b1\c7\05%\ae\e9?\00\c0\bc\ccg)\cc?/\ce\97\f2.\85\e9?\00`H\d55\f6\cc?uK\a4\ee\ba\\\e9?\00\c0F4\bd\c1\cd?8H\e7\9d\c64\e9?\00\e0\cf\b8\01\8c\ce?\e6Rg/O\0d\e9?\00\90\17\c0\tU\cf?\9d\d7\ff\8eR\e6\e8?\00\b8\1f\12l\0e\d0?|\00\cc\9f\ce\bf\e8?\00\d0\93\0e\b8q\d0?\0e\c3\be\da\c0\99\e8?\00p\86\9ek\d4\d0?\fb\17#\aa\'t\e8?\00\d0K3\876\d1?\08\9a\b3\ac\00O\e8?\00H#g\0d\98\d1?U>e\e8I*\e8?\00\80\cc\e0\ff\f8\d1?`\02\f4\95\01\06\e8?\00hc\d7_Y\d2?)\a3\e0c%\e2\e7?\00\a8\14\t0\b9\d2?\ad\b5\dcw\b3\be\e7?\00`C\10r\18\d3?\c2%\97g\aa\9b\e7?\00\18\ecm&w\d3?W\06\17\f2\07y\e7?\000\af\fbO\d5\d3?\0c\13\d6\db\caV\e7?\00\e0/\e3\ee2\d4?") - (data (i32.const 2080) "\00\08\00\00\01\00\00\00\03\00\00\00\00\08\00\00k\b6O\01\00\10\e6?<[B\91l\02~<\95\b4M\03\000\e6?A]\00H\ea\bf\8d\f6\05\eb\ff\ef\e6?S-\e2\1a\04\80~\bc\80\97\86\0e\00\10\e7?Ry\tqf\ff{<\12\e9g\fc\ff/\e7?$\87\bd&\e2\00\8c\89<\b9{F\13\000\e9?v\02\98KN\80\7f.\98\dd\ff\af\e9?7\93Z\8a\e0@\87\bcf\fbI\ed\ff\cf\e9?\00\e0\9b\c1\08\ce?O*\00\b0\ea?_?\ff<\04\fdi\bc\d1\1e\ae\d7\ff\cf\ea?\b4p\90\12\e7>\82\bcx\04Q\ee\ff\ef\ea?\a3\de\0e\e0>\06j<[\0de\db\ff\0f\eb?\b9\n\1f8\c8\06ZO\86\d0E\ff\8a<@\16\87\f9\ff\8f\eb?\f9\c3\c2\96w\fe|\f0\0f\00\f0\f4?\1cS\85\0b\89\7f\97<\d1K\dc\12\00\10\f5?6\a4fqe\04`\c9\03\00\b0\f5?\c0\0c\bf\n\08A\9f\bc\bc\19I\1d\00\d0\f5?)G%\fb*\81\98\bc\89z\b8\e7\ff\ef\f5?\04i\ed\80\b7~\94\bc") - (data (i32.const 4144) "\c0\00\00\00\01\00\00\00\04\00\00\00\c0\00\00\00n\83\f9\a2\00\00\00\00\d1W\'\fc)\15DN\99\95b\db\c0\dd4\f5\abcQ\feA\90C<:n$\b7a\c5\bb\de\ea.I\06\e0\d2MB\1c\eb\1d\fe\1c\92\d1\t\f55\82\e8>\a7)\b1&p\9c\e9\84D\bb.9\d6\919A~_\b4\8b_\84\9c\f49S\83\ff\97\f8\1f;(\f9\bd\8b\11/\ef\0f\98\05\de\cf~6m\1fm\nZf?FO\b7\t\cb\'\c7\ba\'u-\ea_\9e\f79\07={\f1\e5\eb\b1_\fbk\ea\92R\8aF0\03V\08]\8d\1f \bc\cf\f0\abk{\fca\91\e3\a9\1d6\f4\9a_\85\99e\08\1b\e6^\80\d8\ff\8d@h\a0\14W\15\06\061\'sM") - (data (i32.const 4352) "\00\08\00\00\01\00\00\00\04\00\00\00\00\08\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\f0?n\bf\88\1aO;\9b<53\fb\a9=\f6\ef?]\dc\d8\9c\13`q\bca\80w>\9a\ec\ef?\d1f\87\10z^\90\bc\85\7fn\e8\15\e3\ef?\13\f6g5R\d2\8c\be\ef?m{\83]\a6\9a\97<\0f\89\f9lX\b5\ef?\fc\ef\fd\92\1a\b5\8e<\f7Gr+\92\ac\ef?\d1\9c/p=\be><\a2\d1\d32\ec\a3\ef?\0bn\90\894\03j\bc\1b\d3\fe\aff\9b\ef?\0e\bd/*RV\95\bcQ[\12\d0\01\93\ef?U\eaN\8c\ef\80P\bc\cc1l\c0\bd\8a\ef?\16\f4\d5\b9#\c9\91\bc\e0-\a9\ae\9a\82\ef?\afU\\\e9\e3\d3\80\f7\ec\9a<\aa\b9h1\87T\ef?\9d8\86\cb\82\e7\8f\bc\1d\d9\fc\"PM\ef?\8d\c3\a6DAo\8a<\d6\8cb\88;F\ef?}\04\e4\b0\05z\80<\96\dc}\91I?\ef?\94\a8\a8\e3\fd\8e\96<8bunz8\ef?}Ht\f2\18^\87\a9\af\0c\ef?\b6\ab\b0MuM\83<\15\b71\n\fe\06\ef?Lt\ac\e2\01B\86<1\d8L\fcp\01\ef?J\f8\d3]9\dd\8f<\ff\16d\b2\08\fc\ee?\04[\8e;\80\a3\86\bc\f1\9f\92_\c5\f6\ee?hPK\cc\edJ\92\bc\cb\a9:7\a7\f1\ee?\8e-Q\1b\f8\07\99\bcf\d8\05m\ae\ec\ee?\d26\94>\e8\d1q\bc\f7\9f\e54\db\e7\ee?\15\1b\ce\b3\19\19\99\bc\e5\a8\13\c3-\e3\ee?mL*\a7H\9f\85<\"4\12L\a6\de\ee?\8ai(z`\12\93\bc\1c\80\ac\04E\da\ee?[\89\17H\8f\a7X\bc*.\f7!\n\d6\ee?\1b\9aIg\9b,|\bc\97\a8P\d9\f5\d1\ee?\11\ac\c2`\edcC<-\89a`\08\ce\ee?\efd\06;\tf\96Z~d\1fx\bct_\ec\e8u\9f\ee?\b0}\8b\c0J\ee\86\bct\81\a5H\9a\9f\ee?\8a\e6U\1e2\19\86\bc\c9gBV\eb\9f\ee?\d3\d4\t^\cb\9c\90T\'\a4\ee?47;\f1\b6i\93\bc\13\ceL\99\89\a5\ee?\1e\ff\19:\84^\80\bc\ad\c7#F\1a\a7\ee?nWr\d8P\d4\94\bc\ed\92D\9b\d9\a8\ee?\00\8a\0e[g\ad\90<\99f\8a\d9\c7\aa\ee?\b4\ea\f0\c1/\b7\8d<\db\a0*B\e5\ac\ee?\ff\e7\c5\9c`\b6e\bc\8cD\b5\162\af\ee?D_\f3Y\83\f6{<6w\15\99\ae\b1\ee?\83=\1e\a7\1f\t\93\bc\c6\ff\91\0b[\b4\ee?)\1el\8b\b8\a9]\bc\e5\c5\cd\b07\b7\ee?Y\b9\90|\f9#l\bc\0fR\c8\cbD\ba\ee?\aa\f9\f4\"CC\92\bcPN\de\9f\82\bd\ee?K\8ef\d7l\ca\85\bc\ba\07\cap\f1\c0\ee?\'\ce\91+\fc\afq<\90\f0\a3\82\91\c4\ee?\bbs\n\e15\d2m<##\e3\19c\c8\ee?c\"b\"\04\c5\87\bce\e5]{f\cc\ee?\d51\e2\e3\86\1c\8b<3-J\ec\9b\d0\ee?\15\bb\bc\d3\d1\bb\91\bc]%>\b2\03\d5\ee?\d21\ee\9c1\cc\90\b4\07!\d5\82\bc_\9b{3\97|\ef?\c9\0dG;\b9*\89\bc)\a1\f5\14F\86\ef?\d3\88:`\04\b6t<\f6?\8b\e7.\90\ef?qr\9dQ\ec\c5\83<\83L\c7\fbQ\9a\ef?\f0\91\d3\8f\12\f7\8f\bc\da\90\a4\a2\af\a4\ef?}t#\e2\98\ae\8d\bc\f1g\8e-H\af\ef?\08 \aaA\bc\c3\8e<\'Za\ee\1b\ba\ef?2\eb\a9\c3\94+\84<\97\bak7+\c5\ef?\ee\85\d11\a9d\8a<@En[v\d0\ef?\ed\e3;\e4\ba7\8e\bc\14\be\9c\ad\fd\db\ef?\9d\cd\91M;\89w<\d8\90\9e\81\c1\e7\ef?\89\cc`A\c1\05S<\f1q\8f+\c2\f3\ef?") - (data (i32.const 6416) "\00\04\00\00\01\00\00\00\03\00\00\00\00\04\00\00\f8\ac\b1k($\f7?\00\b0\cd\ee_\t\e1\bf\a1\cc\d2f\f7\e1\f6?\00\d0v\bd\94\84\e0\bf\8a\d40\0e=\a1\f6?\00\f8\e8\aeC\01\e0\bf\85l\d02\eca\f6?\00@\0b6\c5\fe\de\bf\f8\98\11\95\fa#\f6?\00\e0\b7\1a\d9\fd\dd\bfl\02\cf\a4[\e7\f5?\00\90\c7\0c\ae\ff\dc\bf\b8O!Z\05\ac\f5?\00\a0\fd\118\04\dc\bf\1en\16\0f\edq\f5?\00\e0:2g\0b\db\bf5\f8\0bY\t9\f5?\00\b0-Z/\15\da\bf\dd\ada\edO\01\f5?\00`\f8Z\7f!\d9\bf\d0{H\8e\b8\ca\f4?\00\90q\b0M0\d8\bf\eeO3\b49\95\f4?\00\e0\a9\f9\89A\d7\bfi\d5\af\df\cb`\f4?\00\90\19\b5+U\d6\bfS\b9\e4Nf-\f4?\00\10\9b\a2#k\d5\bf\a6\d8\1d\11\01\fb\f3?\00\a0_\0fe\83\d4\bf6X\0c\b7\95\c9\f3?\00\a0\f67\e9\9d\d3\bfJ\fd\b6J\1c\99\f3?\00`\8dS\a1\ba\d2\bf\b5\99\e0\0c\8ei\f3?\00@\ca@\83\d9\d1\bf\b2\e7\13\82\e4:\f3?\00\e0@:\85\fa\d0\bf\b1\bd\85\19\19\0d\f3?\000\e72\9c\1d\d0\bf\d7q\b2\ca%\e0\f2?\00`\fa\a2}\85\ce\bf\82\cd\13\cf\04\b4\f2?\00\80=c\c8\d3\cc\bfP\cb|,\b0\88\f2?\00\a0\14L\03&\cb\bf\e5M\94c\"^\f2?\00\e0O/\1c|\c9\bf\b1\15\86=V4\f2?\00\00\80?\02\d6\c7\bf8\af>\e3F\0b\f2?\00\e0\05\1a\a73\c6\bf\dd\a3\cd\fd\ee\e2\f1?\00\00W\e9\f5\94\c4\bf09\0bXJ\bb\f1?\00\a0\e0$\e4\f9\c2\bf\00\"\7f\84S\94\f1?\00\c0\fdZYb\c1\bf<\d7\d5\c0\06n\f1?\00\80\bdu\9a\9c\bf\bf\c2\e4\b7G_H\f1?\00\c0\f9[W{\bc\bf\d1\85\00\adX#\f1?\00\80\f4\0f\c6`\b9\bf\'\"S\0f\f0\fe\f0?\00\00\b6G\e2L\b6\bf\8f:\d0w \db\f0?\00@\01\b2x?\b3\bf\d9\80Y\d6\e6\b7\f0?\00\c0B\1a}8\b0\bf\8d@{\fe>\95\f0?\00\00\b5\08\92o\aa\bf\83;\c5\ca%s\f0?\00\00wO\95z\a4\bf\\\1b\0d\e4\97Q\f0?\00\00\0c\c5\a8#\9d\bf\a2\8e \c1\910\f0?\00\00x)&j\91\bf!~\b3%\10\10\f0?\00\00\e8\d8\f8 w\bfk\a7\ca\f9~\c0\ef?\00\00P\b1S\fe\86?\84\f1\f6\d3eD\ef?\00\80\0f\e1\cc\1c\a1?\7f\10\84\9f\07\cc\ee?\00\80\8b\8c\fcM\ac?\e8Z\97\99:W\ee?\00@W\1e2\aa\b3?\e6=\bd\f0\d6\e5\ed?\00\80\8b\d0\a0\18\b9?\b38\ff\81\b6w\ed?\00@\04\da\e9r\be?C\e9Mr\b5\0c\ed?\00`\7fP\d2\dc\c1?cu\0e\dc\b2\a4\ec?\00\a0\de\03\abv\c4?Q\cb\d6\e8\8e?\ec?\00 \e2wC\07\c7?L\0c\02O+\dd\eb?\00@\a9\8b\de\8e\c9?\ca\15`\00l}\eb?\00\e0\d2j\b8\0d\cc?\8f3.n6 \eb?\00\e0\ce\af\n\84\ce?9P)&p\c5\ea?\00\80g\b4\ny\d0?\dd1\'\bc\01m\ea?\00\c0\01h\05\ac\d1?\8b\f1?\bc\d3\16\ea?\00\e0\fe\d4\11\db\d2?\ad\fegI\d1\c2\e9?\00\80\c5NF\06\d4?\02\99|\f4\e4p\e9?\00\f0:\t\be-\d5?\f2\bc\829\fb \e9?\00\d0P \90Q\d6?\f1Y\f7\87\01\d3\e8?\00\f0\ea\cd\d2q\d7?m\f6\b9\eb\e5\86\e8?\00\90}\85\9c\8e\d8?\94\b9X\b6\97<\e8?\00`\e1U\01\a8\d9?\"\10\c6\ff\05\f4\e7?\00\d0\d3n\18\be\da?\ca\15\14\18\"\ad\e7?\00\e0\a0\ae\f2\d0\db?\8c\ff\9e\f9\dcg\e7?\00@\bf=\a4\e0\dc?") - (data (i32.const 7456) "\00\04\00\00\01\00\00\00\03\00\00\00\00\04\00\00\8e\n\b9\12\00 \e6?\05\b6D\06\ab\04\89<\a64W\04\00`\e6?\a9\f7b\ea\9b\ffa<\c5\f2%\c3\ff\9f\e6?\ba\90<\cb\cf~\82<\04Z\b98\00\e0\e6?&\93sV\88\ff\88<\e3\94\99\e0\ff\1f\e7?\b1\82_\'@\fd\8a<\10\0eY\15\00`\e7?A\83#\b4u\fdr\bc\d5[e\12\00\a0\e7?v+$|\e6\08x<\a6\e9Y2\00\e0\e7?\b7\"\f6&\e4\08b\bc\d2\b2\b4\ed\ff\1f\e8?/\c9\a5\1eF\02\84\bc\c3\fc\fa-\00`\e8?\1f\9a\f2\a2\f4\f7m)\e0\ff\df\f2?\f9\a6\b2\da9|\9b<\82\f0\dc\f7\ff\1f\f3?TR\dcn3\f1}<`\8bZ\f0\ff_\f3?\eb1\cdLV\03\9e\bc\cc\ae\0e.\00\a0\f3?w\a4\d3K\e7\f0u<6\b2;\04\00\e0\f3?3\88\9d\14\cb}\9c<\ff\87\d1\02\00 \f4?(=-\cf\af\08~<\b1|8\0d\00`\f4?\a6\99e\857\08\82<\89\9fV\04\00\a0\f4?\d2\bcO\90\\\fa\89\bc\f3C5\04\00\e0\f4?)S\17\ed%\11x\bc\0f\7f\02\cc\ff\1f\f5?\dcTw\84\d8\83\98\e90.\90\80\91\bc") - (data (i32.const 8496) "\00\10\00\00\01\00\00\00\03\00\00\00\00\10\00\00\00\00\00\00\00\a0\f6?\00\00\00\00\00\00\00\00\00\c8\b9\f2\82,\d6\bf\80V7($\b4\fa<\00\00\00\00\00\80\f6?\00\00\00\00\00\00\00\00\00\08X\bf\bd\d1\d5\bf \f7\e0\d8\08\a5\1c\bd\00\00\00\00\00`\f6?\00\00\00\00\00\00\00\00\00XE\17wv\d5\bfmP\b6\d5\a4b#\bd\00\00\00\00\00@\f6?\00\00\00\00\00\00\00\00\00\f8-\87\ad\1a\d5\bf\d5g\b0\9e\e4\84\e6\bc\00\00\00\00\00 \f6?\00\00\00\00\00\00\00\00\00xw\95_\be\d4\bf\e0>)\93i\1b\04\bd\00\00\00\00\00\00\f6?\00\00\00\00\00\00\00\00\00`\1c\c2\8ba\d4\bf\cc\84LH/\d8\13=\00\00\00\00\00\e0\f5?\00\00\00\00\00\00\00\00\00\a8\86\860\04\d4\bf:\0b\82\ed\f3B\dc<\00\00\00\00\00\c0\f5?\00\00\00\00\00\00\00\00\00HiUL\a6\d3\bf`\94Q\86\c6\b1 =\00\00\00\00\00\a0\f5?\00\00\00\00\00\00\00\00\00\80\98\9a\ddG\d3\bf\92\80\c5\d4MY%=\00\00\00\00\00\80\f5?\00\00\00\00\00\00\00\00\00 \e1\ba\e2\e8\d2\bf\d8+\b7\99\1e{&=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00@\f5?\00\00\00\00\00\00\00\00\00x\cf\fbA)\d2\bfv\daS($Z\16\bd\00\00\00\00\00 \f5?\00\00\00\00\00\00\00\00\00\98i\c1\98\c8\d1\bf\04T\e7h\bc\af\1f\bd\00\00\00\00\00\00\f5?\00\00\00\00\00\00\00\00\00\a8\ab\ab\\g\d1\bf\f0\a8\823\c6\1f\1f=\00\00\00\00\00\e0\f4?\00\00\00\00\00\00\00\00\00H\ae\f9\8b\05\d1\bffZ\05\fd\c4\a8&\bd\00\00\00\00\00\c0\f4?\00\00\00\00\00\00\00\00\00\90s\e2$\a3\d0\bf\0e\03\f4~\eek\0c\bd\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\80\f4?\00\00\00\00\00\00\00\00\00@^m\18\b9\cf\bf\87<\99\ab*W\0d=\00\00\00\00\00`\f4?\00\00\00\00\00\00\00\00\00`\dc\cb\ad\f0\ce\bf$\af\86\9c\b7&+=\00\00\00\00\00@\f4?\00\00\00\00\00\00\00\00\00\f0*n\07\'\ce\bf\10\ff?TO/\17\bd\00\00\00\00\00 \f4?\00\00\00\00\00\00\00\00\00\c0Ok!\\\cd\bf\1bh\ca\bb\91\ba!=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\e0\f3?\00\00\00\00\00\00\00\00\00\90-t\86\c2\cb\bf\8f\b7\8b1\b0N\19=\00\00\00\00\00\c0\f3?\00\00\00\00\00\00\00\00\00\c0\80N\c9\f3\ca\bff\90\cd?cN\ba<\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\80\f3?\00\00\00\00\00\00\00\00\00P\f4\9cZR\c9\bf\e3\d4\c1\04\d9\d1*\bd\00\00\00\00\00`\f3?\00\00\00\00\00\00\00\00\00\d0 e\a0\7f\c8\bf\t\fa\db\7f\bf\bd+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00 \f3?\00\00\00\00\00\00\00\00\00\d0\19\e7\0f\d6\c6\bff\e2\b2\a3j\e4\10\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\e0\f2?\00\00\00\00\00\00\00\00\00\b0\a1\e3\e5&\c5\bf\8f[\07\90\8b\de \bd\00\00\00\00\00\c0\f2?\00\00\00\00\00\00\00\00\00\80\cbl+M\c4\bf\11\0e\bd\00\00\00\00\00\e0\ed?\00\00\00\00\00\00\00\00\00`F\d1;\97\b1?\9b\9e\0dV]2%\bd\00\00\00\00\00\a0\ed?\00\00\00\00\00\00\00\00\00\e0\d1\a7\f5\bd\b3?\d7N\db\a5^\c8,=\00\00\00\00\00`\ed?\00\00\00\00\00\00\00\00\00\a0\97MZ\e9\b5?\1e\1d]<\06i,\bd\00\00\00\00\00@\ed?\00\00\00\00\00\00\00\00\00\c0\ea\n\d3\00\b7?2\ed\9d\a9\8d\1e\ec<\00\00\00\00\00\00\ed?\00\00\00\00\00\00\00\00\00@Y]^3\b9?\daG\bd:\\\11#=\00\00\00\00\00\c0\ec?\00\00\00\00\00\00\00\00\00`\ad\8d\c8j\bb?\e5h\f7+\80\90\13\bd\00\00\00\00\00\a0\ec?\00\00\00\00\00\00\00\00\00@\bc\01X\88\bc?\d3\acZ\c6\d1F&=\00\00\00\00\00`\ec?\00\00\00\00\00\00\00\00\00 \n\839\c7\be?\e0E\e6\afh\c0-\bd\00\00\00\00\00@\ec?\00\00\00\00\00\00\00\00\00\e0\db9\91\e8\bf?\fd\n\a1O\d64%\bd\00\00\00\00\00\00\ec?\00\00\00\00\00\00\00\00\00\e0\'\82\8e\17\c1?\f2\07-\cex\ef!=\00\00\00\00\00\e0\eb?\00\00\00\00\00\00\00\00\00\f0#~+\aa\c1?4\998D\8e\a7,=\00\00\00\00\00\a0\eb?\00\00\00\00\00\00\00\00\00\80\86\0ca\d1\c2?\a1\b4\81\cbl\9d\03=\00\00\00\00\00\80\eb?\00\00\00\00\00\00\00\00\00\90\15\b0\fce\c3?\89rK#\a8/\c6<\00\00\00\00\00@\eb?\00\00\00\00\00\00\00\00\00\b03\83=\91\c4?x\b6\fdTy\83%=\00\00\00\00\00 \eb?\00\00\00\00\00\00\00\00\00\b0\a1\e4\e5\'\c5?\c7}i\e5\e83&=\00\00\00\00\00\e0\ea?\00\00\00\00\00\00\00\00\00\10\8c\beNW\c6?x.<,\8b\cf\19=\00\00\00\00\00\c0\ea?\00\00\00\00\00\00\00\00\00pu\8b\12\f0\c6?\e1!\9c\e5\8d\11%\bd\00\00\00\00\00\a0\ea?\00\00\00\00\00\00\00\00\00PD\85\8d\89\c7?\05C\91p\10f\1c\bd\00\00\00\00\00`\ea?\00\00\00\00\00\00\00\00\00\009\eb\af\be\c8?\d1,\e9\aaT=\07\bd\00\00\00\00\00@\ea?\00\00\00\00\00\00\00\00\00\00\f7\dcZZ\c9?o\ff\a0X(\f2\07=\00\00\00\00\00\00\ea?\00\00\00\00\00\00\00\00\00\e0\8a<\ed\93\ca?i!VPCr(\bd\00\00\00\00\00\e0\e9?\00\00\00\00\00\00\00\00\00\d0[W\d81\cb?\aa\e1\acN\8d5\0c\bd\00\00\00\00\00\c0\e9?\00\00\00\00\00\00\00\00\00\e0;8\87\d0\cb?\b6\12TY\c4K-\bd\00\00\00\00\00\a0\e9?\00\00\00\00\00\00\00\00\00\10\f0\c6\fbo\cc?\d2+\96\c5r\ec\f1\bc\00\00\00\00\00`\e9?\00\00\00\00\00\00\00\00\00\90\d4\b0=\b1\cd?5\b0\15\f7*\ff*\bd\00\00\00\00\00@\e9?\00\00\00\00\00\00\00\00\00\10\e7\ff\0eS\ce?0\f4A`\'\12\c2<\00\00\00\00\00 \e9?\00\00\00\00\00\00\00\00\00\00\dd\e4\ad\f5\ce?\11\8e\bbe\15!\ca\bc\00\00\00\00\00\00\e9?\00\00\00\00\00\00\00\00\00\b0\b3l\1c\99\cf?0\df\0c\ca\ec\cb\1b=\00\00\00\00\00\c0\e8?\00\00\00\00\00\00\00\00\00XM`8q\d0?\91N\ed\16\db\9c\f8<\00\00\00\00\00\a0\e8?\00\00\00\00\00\00\00\00\00`ag-\c4\d0?\e9\ea<\16\8b\18\'=\00\00\00\00\00\80\e8?\00\00\00\00\00\00\00\00\00\e8\'\82\8e\17\d1?\1c\f0\a5c\0e!,\bd\00\00\00\00\00`\e8?\00\00\00\00\00\00\00\00\00\f8\ac\cb\\k\d1?\81\16\a5\f7\cd\9a+=\00\00\00\00\00@\e8?\00\00\00\00\00\00\00\00\00hZc\99\bf\d1?\b7\bdGQ\ed\a6,=\00\00\00\00\00 \e8?\00\00\00\00\00\00\00\00\00\b8\0emE\14\d2?\ea\baF\ba\de\87\n=\00\00\00\00\00\e0\e7?\00\00\00\00\00\00\00\00\00\90\dc|\f0\be\d2?\f4\04PJ\fa\9c*=\00\00\00\00\00\c0\e7?\00\00\00\00\00\00\00\00\00`\d3\e1\f1\14\d3?\b8\b2\03\d5\ee?\ad\d3Z\99\9f\e8\ee?G^\fb\f2v\ff\ee?\9cR\85\dd\9b\19\ef?i\90\ef\dc 7\ef?\87\a4\fb\dc\18X\ef?_\9b{3\97|\ef?\da\90\a4\a2\af\a4\ef?@En[v\d0\ef?") - (data (i32.const 13200) "\00\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\190\96[\c6\fe\de\bf=\88\afJ\edq\f5?\a4\fc\d42h\0b\db\bf\b0\10\f0\f09\95\f4?{\b7\1f\n\8bA\d7\bf\85\03\b8\b0\95\c9\f3?{\cfm\1a\e9\9d\d3\bf\a5d\88\0c\19\0d\f3?1\b6\f2\f3\9b\1d\d0\bf\a0\8e\0b{\"^\f2?\f0z;\1b\1d|\c9\bf?4\1aJJ\bb\f1?\9f<\af\93\e3\f9\c2\bf\ba\e5\8a\f0X#\f1?\\\8dx\bf\cb`\b9\bf\a7\00\99A?\95\f0?\ce_G\b6\9do\aa\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?=\f5$\9f\ca8\b3?\a0j\02\1f\b3\a4\ec?\ba\918T\a9v\c4?\e6\fcjW6 \eb?\d2\e4\c4J\0b\84\ce?-\aa\a1c\d1\c2\e9?\1ce\c6\f0E\06\d4?\edAx\03\e6\86\e8?\f8\9f\1b,\9c\8e\d8?bHS\f5\dcg\e7?\cc{\b1N\a4\e0\dc?") + (data (i32.const 16) "\c0\00\00\00\01\00\00\00\03\00\00\00\c0\00\00\00n\83\f9\a2\00\00\00\00\d1W\'\fc)\15DN\99\95b\db\c0\dd4\f5\abcQ\feA\90C<:n$\b7a\c5\bb\de\ea.I\06\e0\d2MB\1c\eb\1d\fe\1c\92\d1\t\f55\82\e8>\a7)\b1&p\9c\e9\84D\bb.9\d6\919A~_\b4\8b_\84\9c\f49S\83\ff\97\f8\1f;(\f9\bd\8b\11/\ef\0f\98\05\de\cf~6m\1fm\nZf?FO\b7\t\cb\'\c7\ba\'u-\ea_\9e\f79\07={\f1\e5\eb\b1_\fbk\ea\92R\8aF0\03V\08]\8d\1f \bc\cf\f0\abk{\fca\91\e3\a9\1d6\f4\9a_\85\99e\08\1b\e6^\80\d8\ff\8d@h\a0\14W\15\06\061\'sM") + (data (i32.const 224) " \00\00\00\01\00\00\00\03\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") (table $0 1 funcref) (global $~lib/math/NativeMath.E f64 (f64.const 2.718281828459045)) (global $../../lib/libm/assembly/libm/E f64 (f64.const 2.718281828459045)) @@ -55,7 +48,6 @@ (global $~lib/math/rempio2_y0 (mut f64) (f64.const 0)) (global $~lib/math/rempio2_y1 (mut f64) (f64.const 0)) (global $~lib/math/res128_hi (mut i64) (i64.const 0)) - (global $~lib/util/math/log_tail (mut f64) (f64.const 0)) (global $~lib/math/rempio2f_y (mut f64) (f64.const 0)) (export "memory" (memory $0)) (export "libm.E" (global $../../lib/libm/assembly/libm/E)) @@ -597,9 +589,9 @@ f64.add ) (func $~lib/math/NativeMath.log (; 5 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 f64) + (local $1 i64) + (local $2 i32) + (local $3 i32) (local $4 f64) (local $5 f64) (local $6 f64) @@ -608,310 +600,202 @@ (local $9 f64) (local $10 f64) (local $11 f64) - (local $12 i32) - (local $13 i64) - (local $14 i32) - (local $15 i64) - (local $16 i64) - (local $17 f64) - (local $18 f64) - block $~lib/util/math/log_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $12 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + i32.const 0 + local.set $3 + local.get $2 + i32.const 1048576 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $2 - i64.const 4606619468846596096 - i64.sub - i64.const 854320534781952 - i64.lt_u + i32.const 31 + i32.shr_u + end + if + local.get $1 + i64.const 1 + i64.shl + i64.const 0 + i64.eq if - local.get $1 - f64.const 1 - f64.sub - local.set $3 - local.get $3 - local.get $3 - f64.mul - local.set $4 - local.get $4 - local.get $3 - f64.mul - local.set $5 - local.get $5 - f64.const 0.3333333333333352 - local.get $3 - f64.const -0.24999999999998432 - f64.mul - f64.add - local.get $4 - f64.const 0.19999999999320328 - f64.mul - f64.add - local.get $5 - f64.const -0.16666666669929706 - local.get $3 - f64.const 0.14285715076560868 - f64.mul - f64.add - local.get $4 - f64.const -0.12499997863982555 - f64.mul - f64.add - local.get $5 - f64.const 0.11110712032936046 - local.get $3 - f64.const -0.10000486757818193 - f64.mul - f64.add - local.get $4 - f64.const 0.09181994006195467 - f64.mul - f64.add - local.get $5 - f64.const -0.08328363062289341 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - f64.mul - local.set $6 - local.get $3 - f64.const 134217728 - f64.mul - local.set $7 - local.get $3 - local.get $7 - f64.add - local.get $7 - f64.sub - local.set $8 - local.get $3 - local.get $8 - f64.sub - local.set $9 - local.get $8 - local.get $8 - f64.mul - f64.const -0.5 - f64.mul - local.set $7 - local.get $3 - local.get $7 - f64.add - local.set $10 - local.get $3 - local.get $10 - f64.sub - local.get $7 - f64.add - local.set $11 - local.get $11 - f64.const -0.5 - local.get $9 - f64.mul - local.get $8 - local.get $3 - f64.add + f64.const -1 + local.get $0 + local.get $0 f64.mul - f64.add - local.set $11 - local.get $6 - local.get $11 - f64.add - local.get $10 - f64.add - br $~lib/util/math/log_lut|inlined.0 + f64.div + return end local.get $2 - i64.const 48 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.div + return + end + local.get $3 + i32.const 54 + i32.sub + local.set $3 + local.get $0 + f64.const 18014398509481984 + f64.mul + local.set $0 + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 i64.shr_u i32.wrap_i64 - local.set $12 - local.get $12 - i32.const 16 - i32.sub - i32.const 32736 + local.set $2 + else + local.get $2 + i32.const 2146435072 i32.ge_u if + local.get $0 + return + else local.get $2 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const -1 - local.get $1 - local.get $1 - f64.mul - f64.div - br $~lib/util/math/log_lut|inlined.0 - end - local.get $2 - i64.const 9218868437227405312 - i64.eq - if - local.get $1 - br $~lib/util/math/log_lut|inlined.0 - end - local.get $12 - i32.const 32768 - i32.and + i32.const 1072693248 + i32.eq if (result i32) - i32.const 1 + local.get $1 + i64.const 32 + i64.shl + i64.const 0 + i64.eq else - local.get $12 - i32.const 32752 - i32.and - i32.const 32752 - i32.eq + i32.const 0 end if - local.get $1 - local.get $1 - f64.sub - local.get $1 - local.get $1 - f64.sub - f64.div - br $~lib/util/math/log_lut|inlined.0 + f64.const 0 + return end - local.get $1 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $2 end - local.get $2 - i64.const 4604367669032910848 - i64.sub - local.set $13 - local.get $13 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $14 - local.get $13 - i64.const 52 - i64.shr_s - local.set $15 - local.get $2 - local.get $13 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $16 - i32.const 32 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $11 - i32.const 32 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $10 - local.get $16 - f64.reinterpret_i64 - local.set $9 - i32.const 2096 - local.get $14 - i32.const 4 - i32.shl - i32.add - f64.load - local.set $8 - i32.const 2096 - local.get $14 - i32.const 4 - i32.shl - i32.add - f64.load offset=8 - local.set $7 - local.get $9 - local.get $8 - f64.sub - local.get $7 - f64.sub - local.get $11 - f64.mul - local.set $6 - local.get $15 - f64.convert_i64_s - local.set $5 - local.get $5 - f64.const 0.6931471805598903 - f64.mul - local.get $10 - f64.add - local.set $4 - local.get $4 - local.get $6 - f64.add - local.set $3 - local.get $4 - local.get $3 - f64.sub - local.get $6 - f64.add - local.get $5 - f64.const 5.497923018708371e-14 - f64.mul - f64.add - local.set $17 - local.get $6 - local.get $6 - f64.mul - local.set $18 - local.get $17 - local.get $18 - f64.const -0.5000000000000001 - f64.mul - f64.add - local.get $6 - local.get $18 - f64.mul - f64.const 0.33333333331825593 - local.get $6 - f64.const -0.2499999999622955 - f64.mul - f64.add - local.get $18 - f64.const 0.20000304511814496 - local.get $6 - f64.const -0.16667054827627667 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - local.get $3 - f64.add end + local.get $2 + i32.const 1072693248 + i32.const 1072079006 + i32.sub + i32.add + local.set $2 + local.get $3 + local.get $2 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $3 + local.get $2 + i32.const 1048575 + i32.and + i32.const 1072079006 + i32.add + local.set $2 + local.get $2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get $1 + i64.const 4294967295 + i64.and + i64.or + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $0 + f64.const 1 + f64.sub + local.set $4 + f64.const 0.5 + local.get $4 + f64.mul + local.get $4 + f64.mul + local.set $5 + local.get $4 + f64.const 2 + local.get $4 + f64.add + f64.div + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $7 + local.get $7 + f64.mul + local.set $8 + local.get $8 + f64.const 0.3999999999940942 + local.get $8 + f64.const 0.22222198432149784 + local.get $8 + f64.const 0.15313837699209373 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $9 + local.get $7 + f64.const 0.6666666666666735 + local.get $8 + f64.const 0.2857142874366239 + local.get $8 + f64.const 0.1818357216161805 + local.get $8 + f64.const 0.14798198605116586 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $10 + local.get $10 + local.get $9 + f64.add + local.set $11 + local.get $3 + f64.convert_i32_s + local.set $12 + local.get $6 + local.get $5 + local.get $11 + f64.add + f64.mul + local.get $12 + f64.const 1.9082149292705877e-10 + f64.mul + f64.add + local.get $5 + f64.sub + local.get $4 + f64.add + local.get $12 + f64.const 0.6931471803691238 + f64.mul + f64.add return ) (func $~lib/math/NativeMath.acosh (; 6 ;) (param $0 f64) (result f64) @@ -2148,7 +2032,7 @@ i64.const 63 i64.and local.set $4 - i32.const 4160 + i32.const 32 local.get $3 i64.const 6 i64.shr_s @@ -3331,401 +3215,381 @@ local.get $14 f64.mul ) - (func $~lib/math/NativeMath.exp (; 28 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) + (func $~lib/math/NativeMath.scalbn (; 28 ;) (param $0 f64) (param $1 i32) (result f64) + (local $2 f64) (local $3 i32) - (local $4 f64) - (local $5 f64) - (local $6 i64) - (local $7 f64) - (local $8 i32) - (local $9 i64) - (local $10 f64) - (local $11 i64) - (local $12 f64) - (local $13 f64) - (local $14 i64) - (local $15 i64) - (local $16 f64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - block $~lib/util/math/exp_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $4 i32) + local.get $0 + local.set $2 + local.get $1 + i32.const 1023 + i32.gt_s + if local.get $2 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - i32.wrap_i64 - local.set $3 - local.get $3 - i32.const 969 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 i32.sub - i32.const 63 - i32.ge_u + local.set $1 + local.get $1 + i32.const 1023 + i32.gt_s if - local.get $3 - i32.const 969 + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const 1 - br $~lib/util/math/exp_lut|inlined.0 - end + local.tee $3 + i32.const 1023 + local.tee $4 local.get $3 - i32.const 1033 - i32.ge_u + local.get $4 + i32.lt_s + select + local.set $1 + end + else + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.const 53 + i32.sub + i32.add + local.set $1 + local.get $1 + i32.const -1022 + i32.lt_s if local.get $2 - i64.const -4503599627370496 - i64.eq - if - f64.const 0 - br $~lib/util/math/exp_lut|inlined.0 - end + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.add + i32.const 53 + i32.sub + local.tee $3 + i32.const -1022 + local.tee $4 local.get $3 - i32.const 2047 - i32.ge_u - if - f64.const 1 - local.get $1 - f64.add - br $~lib/util/math/exp_lut|inlined.0 - end - f64.const 0 - f64.const inf - local.get $2 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne + local.get $4 + i32.gt_s select - br $~lib/util/math/exp_lut|inlined.0 + local.set $1 end - i32.const 0 - local.set $3 - end - f64.const 184.6649652337873 - local.get $1 - f64.mul - local.set $4 - local.get $4 - f64.const 6755399441055744 - f64.add - local.set $5 - local.get $5 - i64.reinterpret_f64 - local.set $6 - local.get $5 - f64.const 6755399441055744 - f64.sub - local.set $5 - local.get $1 - local.get $5 - f64.const -0.005415212348111709 - f64.mul - f64.add - local.get $5 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $7 - local.get $6 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $8 - local.get $6 - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $9 - i32.const 4368 - local.get $8 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $10 - i32.const 4368 - local.get $8 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $9 - i64.add - local.set $11 - local.get $7 - local.get $7 - f64.mul - local.set $12 - local.get $10 - local.get $7 - f64.add - local.get $12 - f64.const 0.49999999999996786 - local.get $7 - f64.const 0.16666666666665886 - f64.mul - f64.add - f64.mul - f64.add - local.get $12 - local.get $12 - f64.mul - f64.const 0.0416666808410674 - local.get $7 - f64.const 0.008333335853059549 - f64.mul - f64.add - f64.mul - f64.add - local.set $13 - local.get $3 - i32.const 0 - i32.eq - if - block $~lib/util/math/specialcase|inlined.0 (result f64) - local.get $13 - local.set $16 - local.get $11 - local.set $15 - local.get $6 - local.set $14 - local.get $14 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $15 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $15 - local.get $15 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $16 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.0 - end - local.get $15 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $15 - local.get $15 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $16 - f64.mul - f64.add - local.set $18 - local.get $18 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $18 - f64.copysign - local.set $19 - local.get $17 - local.get $18 - f64.sub - local.get $17 - local.get $16 - f64.mul - f64.add - local.set $20 - local.get $19 - local.get $18 - f64.add - local.set $21 - local.get $19 - local.get $21 - f64.sub - local.get $18 - f64.add - local.get $20 - f64.add - local.set $20 - local.get $21 - local.get $20 - f64.add - local.get $19 - f64.sub - local.set $18 - local.get $18 - f64.const 0 - f64.eq - if - local.get $15 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $18 - end - end - local.get $18 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp_lut|inlined.0 end - local.get $11 - f64.reinterpret_i64 - local.set $18 - local.get $18 - local.get $18 - local.get $13 - f64.mul - f64.add end - return + local.get $2 + i64.const 1023 + local.get $1 + i64.extend_i32_s + i64.add + i64.const 52 + i64.shl + f64.reinterpret_i64 + f64.mul ) - (func $~lib/math/NativeMath.cosh (; 29 ;) (param $0 f64) (result f64) - (local $1 i64) + (func $~lib/math/NativeMath.exp (; 29 ;) (param $0 f64) (result f64) + (local $1 i32) (local $2 i32) (local $3 f64) (local $4 f64) - (local $5 f64) + (local $5 i32) + (local $6 f64) + (local $7 f64) + (local $8 f64) + (local $9 f64) local.get $0 i64.reinterpret_f64 - local.set $1 - local.get $1 - i64.const 9223372036854775807 - i64.and - local.set $1 - local.get $1 - f64.reinterpret_i64 - local.set $0 - local.get $1 i64.const 32 i64.shr_u i32.wrap_i64 + local.set $1 + local.get $1 + i32.const 31 + i32.shr_u local.set $2 - local.get $2 - i32.const 1072049730 - i32.lt_u + local.get $1 + i32.const 2147483647 + i32.and + local.set $1 + local.get $1 + i32.const 1082532651 + i32.ge_u if - local.get $2 - i32.const 1045430272 - i32.lt_u + local.get $0 + local.get $0 + f64.ne if - f64.const 1 + local.get $0 return end local.get $0 - call $~lib/math/NativeMath.expm1 - local.set $3 - f64.const 1 - local.get $3 - local.get $3 - f64.mul - f64.const 2 - f64.const 2 - local.get $3 - f64.mul - f64.add - f64.div - f64.add - return - end - local.get $2 - i32.const 1082535490 - i32.lt_u - if + f64.const 709.782712893384 + f64.gt + if + local.get $0 + f64.const 8988465674311579538646525e283 + f64.mul + return + end local.get $0 - call $~lib/math/NativeMath.exp - local.set $3 - f64.const 0.5 - local.get $3 - f64.const 1 - local.get $3 - f64.div - f64.add - f64.mul - return + f64.const -745.1332191019411 + f64.lt + if + f64.const 0 + return + end end - local.get $0 + f64.const 0 local.set $4 - i32.const 1023 - i32.const 2043 - i32.const 2 - i32.div_u - i32.add - i32.const 20 - i32.shl - i64.extend_i32_u - i64.const 32 - i64.shl - f64.reinterpret_i64 + i32.const 0 local.set $5 - local.get $4 - f64.const 1416.0996898839683 - f64.sub - call $~lib/math/NativeMath.exp - local.get $5 - f64.mul - local.get $5 - f64.mul - local.set $3 - local.get $3 - ) - (func $../../lib/libm/assembly/libm/cosh (; 30 ;) (param $0 f64) (result f64) - local.get $0 - call $~lib/math/NativeMath.cosh - ) - (func $../../lib/libm/assembly/libm/exp (; 31 ;) (param $0 f64) (result f64) - local.get $0 - call $~lib/math/NativeMath.exp - ) - (func $../../lib/libm/assembly/libm/expm1 (; 32 ;) (param $0 f64) (result f64) - local.get $0 - call $~lib/math/NativeMath.expm1 - ) - (func $../../lib/libm/assembly/libm/floor (; 33 ;) (param $0 f64) (result f64) - (local $1 f64) - local.get $0 - local.set $1 - local.get $1 - f64.floor - ) - (func $../../lib/libm/assembly/libm/fround (; 34 ;) (param $0 f64) (result f64) - (local $1 f64) - local.get $0 - local.set $1 + local.get $1 + i32.const 1071001154 + i32.gt_u + if + local.get $1 + i32.const 1072734898 + i32.ge_u + if + f64.const 1.4426950408889634 + local.get $0 + f64.mul + f64.const 0.5 + local.get $0 + f64.copysign + f64.add + i32.trunc_f64_s + local.set $5 + else + i32.const 1 + local.get $2 + i32.const 1 + i32.shl + i32.sub + local.set $5 + end + local.get $0 + local.get $5 + f64.convert_i32_s + f64.const 0.6931471803691238 + f64.mul + f64.sub + local.set $3 + local.get $5 + f64.convert_i32_s + f64.const 1.9082149292705877e-10 + f64.mul + local.set $4 + local.get $3 + local.get $4 + f64.sub + local.set $0 + else + local.get $1 + i32.const 1043333120 + i32.gt_u + if + local.get $0 + local.set $3 + else + f64.const 1 + local.get $0 + f64.add + return + end + end + local.get $0 + local.get $0 + f64.mul + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $0 + local.get $6 + f64.const 0.16666666666666602 + f64.mul + local.get $7 + f64.const -2.7777777777015593e-03 + local.get $6 + f64.const 6.613756321437934e-05 + f64.mul + f64.add + local.get $7 + f64.const -1.6533902205465252e-06 + local.get $6 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.sub + local.set $8 + f64.const 1 + local.get $0 + local.get $8 + f64.mul + f64.const 2 + local.get $8 + f64.sub + f64.div + local.get $4 + f64.sub + local.get $3 + f64.add + f64.add + local.set $9 + local.get $5 + i32.const 0 + i32.eq + if (result f64) + local.get $9 + else + local.get $9 + local.get $5 + call $~lib/math/NativeMath.scalbn + end + return + ) + (func $~lib/math/NativeMath.cosh (; 30 ;) (param $0 f64) (result f64) + (local $1 i64) + (local $2 i32) + (local $3 f64) + (local $4 f64) + (local $5 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 9223372036854775807 + i64.and + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + local.get $2 + i32.const 1072049730 + i32.lt_u + if + local.get $2 + i32.const 1045430272 + i32.lt_u + if + f64.const 1 + return + end + local.get $0 + call $~lib/math/NativeMath.expm1 + local.set $3 + f64.const 1 + local.get $3 + local.get $3 + f64.mul + f64.const 2 + f64.const 2 + local.get $3 + f64.mul + f64.add + f64.div + f64.add + return + end + local.get $2 + i32.const 1082535490 + i32.lt_u + if + local.get $0 + call $~lib/math/NativeMath.exp + local.set $3 + f64.const 0.5 + local.get $3 + f64.const 1 + local.get $3 + f64.div + f64.add + f64.mul + return + end + local.get $0 + local.set $4 + i32.const 1023 + i32.const 2043 + i32.const 2 + i32.div_u + i32.add + i32.const 20 + i32.shl + i64.extend_i32_u + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $5 + local.get $4 + f64.const 1416.0996898839683 + f64.sub + call $~lib/math/NativeMath.exp + local.get $5 + f64.mul + local.get $5 + f64.mul + local.set $3 + local.get $3 + ) + (func $../../lib/libm/assembly/libm/cosh (; 31 ;) (param $0 f64) (result f64) + local.get $0 + call $~lib/math/NativeMath.cosh + ) + (func $../../lib/libm/assembly/libm/exp (; 32 ;) (param $0 f64) (result f64) + local.get $0 + call $~lib/math/NativeMath.exp + ) + (func $../../lib/libm/assembly/libm/expm1 (; 33 ;) (param $0 f64) (result f64) + local.get $0 + call $~lib/math/NativeMath.expm1 + ) + (func $../../lib/libm/assembly/libm/floor (; 34 ;) (param $0 f64) (result f64) + (local $1 f64) + local.get $0 + local.set $1 + local.get $1 + f64.floor + ) + (func $../../lib/libm/assembly/libm/fround (; 35 ;) (param $0 f64) (result f64) + (local $1 f64) + local.get $0 + local.set $1 local.get $1 f32.demote_f64 f64.promote_f32 ) - (func $~lib/math/NativeMath.hypot (; 35 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.hypot (; 36 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 i64) (local $3 i64) (local $4 i64) @@ -3920,12 +3784,12 @@ f64.sqrt f64.mul ) - (func $../../lib/libm/assembly/libm/hypot (; 36 ;) (param $0 f64) (param $1 f64) (result f64) + (func $../../lib/libm/assembly/libm/hypot (; 37 ;) (param $0 f64) (param $1 f64) (result f64) local.get $0 local.get $1 call $~lib/math/NativeMath.hypot ) - (func $~lib/math/NativeMath.imul (; 37 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.imul (; 38 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) local.get $0 local.get $1 @@ -3947,16 +3811,16 @@ i32.mul f64.convert_i32_s ) - (func $../../lib/libm/assembly/libm/imul (; 38 ;) (param $0 f64) (param $1 f64) (result f64) + (func $../../lib/libm/assembly/libm/imul (; 39 ;) (param $0 f64) (param $1 f64) (result f64) local.get $0 local.get $1 call $~lib/math/NativeMath.imul ) - (func $../../lib/libm/assembly/libm/log (; 39 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/log (; 40 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.log ) - (func $~lib/math/NativeMath.log10 (; 40 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.log10 (; 41 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -4216,18 +4080,18 @@ local.get $8 f64.add ) - (func $../../lib/libm/assembly/libm/log10 (; 41 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/log10 (; 42 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.log10 ) - (func $../../lib/libm/assembly/libm/log1p (; 42 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/log1p (; 43 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.log1p ) - (func $~lib/math/NativeMath.log2 (; 43 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 f64) + (func $~lib/math/NativeMath.log2 (; 44 ;) (param $0 f64) (result f64) + (local $1 i64) + (local $2 i32) + (local $3 i32) (local $4 f64) (local $5 f64) (local $6 f64) @@ -4236,342 +4100,253 @@ (local $9 f64) (local $10 f64) (local $11 f64) - (local $12 i32) - (local $13 i64) - (local $14 i32) - (local $15 i64) - (local $16 i64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - (local $22 f64) - (local $23 f64) - block $~lib/util/math/log2_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $12 f64) + (local $13 f64) + (local $14 f64) + (local $15 f64) + (local $16 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + i32.const 0 + local.set $3 + local.get $2 + i32.const 1048576 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $2 - i64.const 4606800540372828160 - i64.sub - i64.const 581272283906048 - i64.lt_u - if - local.get $1 - f64.const 1 - f64.sub - local.set $3 - local.get $3 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $4 - local.get $3 - local.get $4 - f64.sub - local.set $5 - local.get $4 - f64.const 1.4426950407214463 - f64.mul - local.set $6 - local.get $5 - f64.const 1.4426950407214463 - f64.mul - local.get $3 - f64.const 1.6751713164886512e-10 - f64.mul - f64.add - local.set $7 - local.get $3 - local.get $3 - f64.mul - local.set $8 - local.get $8 - local.get $8 - f64.mul - local.set $9 - local.get $8 - f64.const -0.7213475204444817 - local.get $3 - f64.const 0.48089834696298744 - f64.mul - f64.add - f64.mul - local.set $10 - local.get $6 - local.get $10 - f64.add - local.set $11 - local.get $7 - local.get $6 - local.get $11 - f64.sub - local.get $10 - f64.add - f64.add - local.set $7 - local.get $7 - local.get $9 - f64.const -0.360673760222145 - local.get $3 - f64.const 0.2885390081805197 - f64.mul - f64.add - local.get $8 - f64.const -0.24044917405728863 - local.get $3 - f64.const 0.2060992861022954 - f64.mul - f64.add - f64.mul - f64.add - local.get $9 - f64.const -0.18033596705327856 - local.get $3 - f64.const 0.1603032746063156 - f64.mul - f64.add - local.get $8 - f64.const -0.14483316576701266 - local.get $3 - f64.const 0.13046826811283835 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add + i32.const 31 + i32.shr_u + end + if + local.get $1 + i64.const 1 + i64.shl + i64.const 0 + i64.eq + if + f64.const -1 + local.get $0 + local.get $0 f64.mul - f64.add - local.set $7 - local.get $11 - local.get $7 - f64.add - br $~lib/util/math/log2_lut|inlined.0 + f64.div + return end local.get $2 - i64.const 48 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.div + return + end + local.get $3 + i32.const 54 + i32.sub + local.set $3 + local.get $0 + f64.const 18014398509481984 + f64.mul + local.set $0 + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 i64.shr_u i32.wrap_i64 - local.set $12 - local.get $12 - i32.const 16 - i32.sub - i32.const 32736 + local.set $2 + else + local.get $2 + i32.const 2146435072 i32.ge_u if + local.get $0 + return + else local.get $2 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const -1 - local.get $1 - local.get $1 - f64.mul - f64.div - br $~lib/util/math/log2_lut|inlined.0 - end - local.get $2 - i64.const 9218868437227405312 - i64.eq - if - local.get $1 - br $~lib/util/math/log2_lut|inlined.0 - end - local.get $12 - i32.const 32768 - i32.and + i32.const 1072693248 + i32.eq if (result i32) - i32.const 1 + local.get $1 + i64.const 32 + i64.shl + i64.const 0 + i64.eq else - local.get $12 - i32.const 32752 - i32.and - i32.const 32752 - i32.eq + i32.const 0 end if - local.get $1 - local.get $1 - f64.sub - local.get $1 - local.get $1 - f64.sub - f64.div - br $~lib/util/math/log2_lut|inlined.0 + f64.const 0 + return end - local.get $1 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $2 end - local.get $2 - i64.const 4604367669032910848 - i64.sub - local.set $13 - local.get $13 - i64.const 52 - i64.const 6 - i64.sub - i64.shr_u - i64.const 63 - i64.and - i32.wrap_i64 - local.set $14 - local.get $13 - i64.const 52 - i64.shr_s - local.set $15 - local.get $2 - local.get $13 - i64.const -4503599627370496 - i64.and - i64.sub - local.set $16 - i32.const 6432 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $11 - i32.const 6432 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $10 - local.get $16 - f64.reinterpret_i64 - local.set $9 - local.get $15 - f64.convert_i64_s - local.set $8 - i32.const 7472 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $7 - i32.const 7472 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $6 - local.get $9 - local.get $7 - f64.sub - local.get $6 - f64.sub - local.get $11 - f64.mul - local.set $5 - local.get $5 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $4 - local.get $5 - local.get $4 - f64.sub - local.set $3 - local.get $4 - f64.const 1.4426950407214463 - f64.mul - local.set $17 - local.get $3 - f64.const 1.4426950407214463 - f64.mul - local.get $5 - f64.const 1.6751713164886512e-10 - f64.mul - f64.add - local.set $18 - local.get $8 - local.get $10 - f64.add - local.set $19 - local.get $19 - local.get $17 - f64.add - local.set $20 - local.get $19 - local.get $20 - f64.sub - local.get $17 - f64.add - local.get $18 - f64.add - local.set $21 - local.get $5 - local.get $5 - f64.mul - local.set $22 - f64.const -0.7213475204444882 - local.get $5 - f64.const 0.4808983469629985 - f64.mul - f64.add - local.get $22 - f64.const -0.36067375954075914 - local.get $5 - f64.const 0.2885390073180969 - f64.mul - f64.add - f64.mul - f64.add - local.get $22 - local.get $22 - f64.mul - f64.const -0.2404693555628422 - local.get $5 - f64.const 0.2061202382173603 - f64.mul - f64.add - f64.mul - f64.add - local.set $23 - local.get $21 - local.get $22 - local.get $23 - f64.mul - f64.add - local.get $20 - f64.add end + local.get $2 + i32.const 1072693248 + i32.const 1072079006 + i32.sub + i32.add + local.set $2 + local.get $3 + local.get $2 + i32.const 20 + i32.shr_u + i32.const 1023 + i32.sub + i32.add + local.set $3 + local.get $2 + i32.const 1048575 + i32.and + i32.const 1072079006 + i32.add + local.set $2 + local.get $2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get $1 + i64.const 4294967295 + i64.and + i64.or + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $0 + f64.const 1 + f64.sub + local.set $4 + f64.const 0.5 + local.get $4 + f64.mul + local.get $4 + f64.mul + local.set $5 + local.get $4 + f64.const 2 + local.get $4 + f64.add + f64.div + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $7 + local.get $7 + f64.mul + local.set $8 + local.get $8 + f64.const 0.3999999999940942 + local.get $8 + f64.const 0.22222198432149784 + local.get $8 + f64.const 0.15313837699209373 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $9 + local.get $7 + f64.const 0.6666666666666735 + local.get $8 + f64.const 0.2857142874366239 + local.get $8 + f64.const 0.1818357216161805 + local.get $8 + f64.const 0.14798198605116586 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $10 + local.get $10 + local.get $9 + f64.add + local.set $11 + local.get $4 + local.get $5 + f64.sub + local.set $12 + local.get $12 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const -4294967296 + i64.and + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $12 + local.get $4 + local.get $12 + f64.sub + local.get $5 + f64.sub + local.get $6 + local.get $5 + local.get $11 + f64.add + f64.mul + f64.add + local.set $13 + local.get $12 + f64.const 1.4426950407214463 + f64.mul + local.set $14 + local.get $13 + local.get $12 + f64.add + f64.const 1.6751713164886512e-10 + f64.mul + local.get $13 + f64.const 1.4426950407214463 + f64.mul + f64.add + local.set $15 + local.get $3 + f64.convert_i32_s + local.set $16 + local.get $16 + local.get $14 + f64.add + local.set $8 + local.get $15 + local.get $16 + local.get $8 + f64.sub + local.get $14 + f64.add + f64.add + local.set $15 + local.get $8 + local.set $14 + local.get $15 + local.get $14 + f64.add return ) - (func $../../lib/libm/assembly/libm/log2 (; 44 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/log2 (; 45 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.log2 ) - (func $../../lib/libm/assembly/libm/max (; 45 ;) (param $0 f64) (param $1 f64) (result f64) + (func $../../lib/libm/assembly/libm/max (; 46 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) (local $3 f64) local.get $0 @@ -4582,7 +4357,7 @@ local.get $2 f64.max ) - (func $../../lib/libm/assembly/libm/min (; 46 ;) (param $0 f64) (param $1 f64) (result f64) + (func $../../lib/libm/assembly/libm/min (; 47 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) (local $3 f64) local.get $0 @@ -4593,20 +4368,20 @@ local.get $2 f64.min ) - (func $~lib/math/NativeMath.pow (; 47 ;) (param $0 f64) (param $1 f64) (result f64) - (local $2 f64) - (local $3 f64) + (func $~lib/math/NativeMath.pow (; 48 ;) (param $0 f64) (param $1 f64) (result f64) + (local $2 i64) + (local $3 i32) (local $4 i32) - (local $5 i64) - (local $6 i64) - (local $7 i64) - (local $8 i64) - (local $9 i64) - (local $10 f64) - (local $11 i64) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) (local $12 i32) - (local $13 i64) - (local $14 i64) + (local $13 i32) + (local $14 f64) (local $15 f64) (local $16 f64) (local $17 f64) @@ -4629,14 +4404,6 @@ (local $34 f64) (local $35 f64) (local $36 f64) - (local $37 f64) - (local $38 f64) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i64) - (local $44 i64) local.get $1 f64.abs f64.const 2 @@ -4690,521 +4457,626 @@ return end end - block $~lib/util/math/pow_lut|inlined.0 (result f64) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i64.reinterpret_f64 - local.set $5 - local.get $2 - i64.reinterpret_f64 - local.set $6 - local.get $5 - i64.const 52 - i64.shr_u - local.set $7 - local.get $6 - i64.const 52 - i64.shr_u - local.set $8 - local.get $7 - i64.const 1 - i64.sub - i64.const 2046 - i64.ge_u - if (result i32) - i32.const 1 - else - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u - end - if - local.get $6 - local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u - if - local.get $6 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - end - if - local.get $3 - local.get $2 - f64.add - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.lt_u - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - i32.eqz - i32.eq - if - f64.const 0 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $2 - local.get $2 - f64.mul - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 + local.get $0 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $3 + local.get $2 + i32.wrap_i64 + local.set $4 + local.get $1 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $2 + i32.wrap_i64 + local.set $6 + local.get $3 + i32.const 2147483647 + i32.and + local.set $7 + local.get $5 + i32.const 2147483647 + i32.and + local.set $8 + local.get $8 + local.get $6 + i32.or + i32.const 0 + i32.eq + if + f64.const 1 + return + end + local.get $7 + i32.const 2146435072 + i32.gt_s + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 2146435072 + i32.eq + if (result i32) + local.get $4 + i32.const 0 + i32.ne + else + i32.const 0 + end + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.gt_s + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.eq + if (result i32) + local.get $6 + i32.const 0 + i32.ne + else + i32.const 0 + end + end + if + local.get $0 + local.get $1 + f64.add + return + end + i32.const 0 + local.set $9 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $8 + i32.const 1128267776 + i32.ge_s + if + i32.const 2 local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + else + local.get $8 + i32.const 1072693248 + i32.ge_s if - local.get $3 - local.get $3 - f64.mul + local.get $8 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub local.set $10 - local.get $5 - i64.const 63 - i64.shr_u - i32.wrap_i64 - if (result i32) - block $~lib/util/math/checkint|inlined.0 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.0 - end - i64.const 1 - i64.const 1075 - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.0 - end - i32.const 2 - end - i32.const 1 - i32.eq - else - i32.const 0 - end - if - local.get $10 - f64.neg - local.set $10 - end + i32.const 52 + i32.const 20 + local.get $10 + i32.const 20 + i32.gt_s + select + local.get $10 + i32.sub + local.set $11 local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - f64.const 1 - local.get $10 - f64.div - else - local.get $10 - end - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if - block $~lib/util/math/checkint|inlined.1 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.1 - end - i64.const 1 - i64.const 1023 - i64.const 52 - i64.add - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.1 - end - i32.const 2 - end + local.get $8 + local.get $10 + i32.const 20 + i32.gt_s + select local.set $12 local.get $12 - i32.const 0 - i32.eq - if - local.get $3 - local.get $3 - f64.sub - local.get $3 - local.get $3 - f64.sub - f64.div - br $~lib/util/math/pow_lut|inlined.0 - end + local.get $11 + i32.shr_u + local.set $13 + local.get $13 + local.get $11 + i32.shl local.get $12 - i32.const 1 i32.eq if - i32.const 262144 - local.set $4 + i32.const 2 + local.get $13 + i32.const 1 + i32.and + i32.sub + local.set $9 end - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $7 - i64.const 2047 - i64.and - local.set $7 end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + end + end + local.get $6 + i32.const 0 + i32.eq + if + local.get $8 + i32.const 2146435072 + i32.eq + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $4 + i32.or + i32.const 0 + i32.eq if - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.lt_u + f64.const nan:0x8000000000000 + return + else + local.get $7 + i32.const 1072693248 + i32.ge_s if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.gt_u - local.get $8 - i64.const 2048 - i64.lt_u + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + local.get $1 + else + f64.const 0 + end + return + else + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + f64.const 0 + else + local.get $1 + f64.neg + end + return + end + unreachable + end + unreachable + end + local.get $8 + i32.const 1072693248 + i32.eq + if + local.get $5 + i32.const 0 + i32.ge_s + if + local.get $0 + return + end + f64.const 1 + local.get $0 + f64.div + return + end + local.get $5 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f64.mul + return + end + local.get $5 + i32.const 1071644672 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if + local.get $0 + f64.sqrt + return + end + end + end + local.get $0 + f64.abs + local.set $14 + local.get $4 + i32.const 0 + i32.eq + if + local.get $7 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 2146435072 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 1072693248 + i32.eq + end + if + local.get $14 + local.set $15 + local.get $5 + i32.const 0 + i32.lt_s + if + f64.const 1 + local.get $15 + f64.div + local.set $15 + end + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $9 + i32.or + i32.const 0 i32.eq - if (result f64) - f64.const inf + if + local.get $15 + local.get $15 + f64.sub + local.set $16 + local.get $16 + local.get $16 + f64.div + local.set $15 else - f64.const 0 + local.get $9 + i32.const 1 + i32.eq + if + local.get $15 + f64.neg + local.set $15 + end end - br $~lib/util/math/pow_lut|inlined.0 end + local.get $15 + return + end + end + f64.const 1 + local.set $16 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $9 + i32.const 0 + i32.eq + if + local.get $0 + local.get $0 + f64.sub + local.set $17 + local.get $17 + local.get $17 + f64.div + return + end + local.get $9 + i32.const 1 + i32.eq + if + f64.const -1 + local.set $16 + end + end + local.get $8 + i32.const 1105199104 + i32.gt_s + if + local.get $8 + i32.const 1139802112 + i32.gt_s + if local.get $7 - i64.const 0 - i64.eq + i32.const 1072693247 + i32.le_s if - local.get $3 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $5 local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 + i32.const 0 + i32.lt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.ge_s + if local.get $5 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $5 + i32.const 0 + i32.gt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return end end - local.get $5 - local.set $9 - local.get $9 - i64.const 4604531861337669632 - i64.sub - local.set $11 - local.get $11 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $12 - local.get $11 - i64.const 52 - i64.shr_s - local.set $13 - local.get $9 - local.get $11 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $14 - local.get $14 - f64.reinterpret_i64 - local.set $10 - local.get $13 - f64.convert_i64_s - local.set $15 - i32.const 8512 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $16 - i32.const 8512 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=16 - local.set $17 - i32.const 8512 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=24 - local.set $18 + local.get $7 + i32.const 1072693247 + i32.lt_s + if + local.get $5 + i32.const 0 + i32.lt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.gt_s + if + local.get $5 + i32.const 0 + i32.gt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end local.get $14 - i64.const 2147483648 - i64.add - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $19 - local.get $10 - local.get $19 + f64.const 1 f64.sub - local.set $20 - local.get $19 - local.get $16 + local.set $22 + local.get $22 + local.get $22 + f64.mul + f64.const 0.5 + local.get $22 + f64.const 0.3333333333333333 + local.get $22 + f64.const 0.25 f64.mul - f64.const 1 f64.sub - local.set $21 - local.get $20 - local.get $16 f64.mul - local.set $22 - local.get $21 + f64.sub + f64.mul + local.set $25 + f64.const 1.4426950216293335 local.get $22 - f64.add + f64.mul local.set $23 - local.get $15 - f64.const 0.6931471805598903 + local.get $22 + f64.const 1.9259629911266175e-08 f64.mul - local.get $17 - f64.add + local.get $25 + f64.const 1.4426950408889634 + f64.mul + f64.sub local.set $24 - local.get $24 local.get $23 + local.get $24 f64.add - local.set $25 - local.get $15 - f64.const 5.497923018708371e-14 - f64.mul - local.get $18 - f64.add - local.set $26 + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $17 local.get $24 - local.get $25 - f64.sub + local.get $17 local.get $23 + f64.sub + f64.sub + local.set $18 + else + i32.const 0 + local.set $12 + local.get $7 + i32.const 1048576 + i32.lt_s + if + local.get $14 + f64.const 9007199254740992 + f64.mul + local.set $14 + local.get $12 + i32.const 53 + i32.sub + local.set $12 + local.get $14 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $7 + end + local.get $12 + local.get $7 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $12 + local.get $7 + i32.const 1048575 + i32.and + local.set $13 + local.get $13 + i32.const 1072693248 + i32.or + local.set $7 + local.get $13 + i32.const 235662 + i32.le_s + if + i32.const 0 + local.set $10 + else + local.get $13 + i32.const 767610 + i32.lt_s + if + i32.const 1 + local.set $10 + else + i32.const 0 + local.set $10 + local.get $12 + i32.const 1 + i32.add + local.set $12 + local.get $7 + i32.const 1048576 + i32.sub + local.set $7 + end + end + local.get $14 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $7 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.set $14 + f64.const 1.5 + f64.const 1 + local.get $10 + select + local.set $32 + local.get $14 + local.get $32 + f64.sub + local.set $23 + f64.const 1 + local.get $14 + local.get $32 f64.add - local.set $27 - f64.const -0.5 + f64.div + local.set $24 local.get $23 + local.get $24 f64.mul + local.set $26 + local.get $26 local.set $28 - local.get $23 local.get $28 - f64.mul - local.set $29 - local.get $23 - local.get $29 - f64.mul + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $28 + local.get $7 + i32.const 1 + i32.shr_s + i32.const 536870912 + i32.or + i32.const 524288 + i32.add + local.get $10 + i32.const 18 + i32.shl + i32.add + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 local.set $30 - f64.const -0.5 - local.get $21 - f64.mul + local.get $14 + local.get $30 + local.get $32 + f64.sub + f64.sub local.set $31 - local.get $21 - local.get $31 + local.get $24 + local.get $23 + local.get $28 + local.get $30 f64.mul - local.set $32 - local.get $25 - local.get $32 - f64.add - local.set $33 - local.get $22 + f64.sub local.get $28 local.get $31 - f64.add f64.mul - local.set $34 - local.get $25 - local.get $33 f64.sub - local.get $32 - f64.add - local.set $35 - local.get $30 - f64.const -0.6666666666666679 - local.get $23 - f64.const 0.5000000000000007 + f64.mul + local.set $29 + local.get $26 + local.get $26 + f64.mul + local.set $27 + local.get $27 + local.get $27 + f64.mul + f64.const 0.5999999999999946 + local.get $27 + f64.const 0.4285714285785502 + local.get $27 + f64.const 0.33333332981837743 + local.get $27 + f64.const 0.272728123808534 + local.get $27 + f64.const 0.23066074577556175 + local.get $27 + f64.const 0.20697501780033842 f64.mul f64.add - local.get $29 - f64.const 0.7999999995323976 - local.get $23 - f64.const -0.6666666663487739 f64.mul f64.add - local.get $29 - f64.const -1.142909628459501 - local.get $23 - f64.const 1.0000415263675542 f64.mul f64.add f64.mul @@ -5212,353 +5084,425 @@ f64.mul f64.add f64.mul - local.set $36 + local.set $21 + local.get $21 + local.get $29 + local.get $28 local.get $26 - local.get $27 - f64.add - local.get $34 - f64.add - local.get $35 f64.add - local.get $36 + f64.mul f64.add - local.set $37 - local.get $33 - local.get $37 + local.set $21 + local.get $28 + local.get $28 + f64.mul + local.set $27 + f64.const 3 + local.get $27 f64.add - local.set $38 - local.get $33 - local.get $38 - f64.sub - local.get $37 + local.get $21 f64.add - global.set $~lib/util/math/log_tail - local.get $38 - local.set $38 - global.get $~lib/util/math/log_tail - local.set $37 - local.get $6 - i64.const -134217728 - i64.and - f64.reinterpret_i64 - local.set $34 - local.get $2 - local.get $34 - f64.sub - local.set $33 - local.get $38 + local.set $30 + local.get $30 i64.reinterpret_f64 - i64.const -134217728 + i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $32 - local.get $38 - local.get $32 + local.set $30 + local.get $21 + local.get $30 + f64.const 3 + f64.sub + local.get $27 + f64.sub f64.sub - local.get $37 - f64.add local.set $31 - local.get $34 - local.get $32 - f64.mul - local.set $36 - local.get $33 - local.get $32 + local.get $28 + local.get $30 + f64.mul + local.set $23 + local.get $29 + local.get $30 f64.mul - local.get $2 local.get $31 + local.get $26 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $19 + local.get $19 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $19 + local.get $24 + local.get $19 + local.get $23 + f64.sub + f64.sub + local.set $20 + f64.const 0.9617967009544373 + local.get $19 + f64.mul + local.set $33 + f64.const 1.350039202129749e-08 + f64.const 0 + local.get $10 + select + local.set $34 + f64.const -7.028461650952758e-09 + local.get $19 + f64.mul + local.get $20 + f64.const 0.9617966939259756 f64.mul f64.add + local.get $34 + f64.add local.set $35 - block $~lib/util/math/exp_inline|inlined.0 (result f64) - local.get $36 - local.set $15 - local.get $35 - local.set $10 - local.get $4 - local.set $12 - local.get $15 - i64.reinterpret_f64 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i32.wrap_i64 - i32.const 2047 - i32.and - local.set $39 - local.get $39 - i32.const 969 - i32.sub - i32.const 63 - i32.ge_u - if - local.get $39 - i32.const 969 - i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const -1 - f64.const 1 - local.get $12 - select - br $~lib/util/math/exp_inline|inlined.0 - end - local.get $39 - i32.const 1033 - i32.ge_u - if - local.get $9 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - local.get $12 - local.set $41 - local.get $41 - local.set $42 - i64.const 1152921504606846976 - f64.reinterpret_i64 - local.set $16 - local.get $16 - f64.neg - local.get $16 - local.get $42 - select - local.get $16 - f64.mul - else - local.get $12 - local.set $42 - local.get $42 - local.set $41 - i64.const 8070450532247928832 - f64.reinterpret_i64 - local.set $17 - local.get $17 - f64.neg - local.get $17 - local.get $41 - select - local.get $17 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 - end - i32.const 0 - local.set $39 - end - f64.const 184.6649652337873 - local.get $15 - f64.mul - local.set $29 - local.get $29 - f64.const 6755399441055744 - f64.add - local.set $30 - local.get $30 - i64.reinterpret_f64 - local.set $14 - local.get $30 - f64.const 6755399441055744 - f64.sub - local.set $30 - local.get $15 - local.get $30 - f64.const -0.005415212348111709 - f64.mul - f64.add - local.get $30 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $28 - local.get $28 - local.get $10 - f64.add - local.set $28 - local.get $14 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $40 - local.get $14 - local.get $12 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $13 - i32.const 4368 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $25 - i32.const 4368 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $13 - i64.add - local.set $11 - local.get $28 - local.get $28 - f64.mul - local.set $27 - local.get $25 - local.get $28 - f64.add - local.get $27 - f64.const 0.49999999999996786 - local.get $28 - f64.const 0.16666666666665886 - f64.mul - f64.add + local.get $12 + f64.convert_i32_s + local.set $22 + f64.const 0.5849624872207642 + f64.const 0 + local.get $10 + select + local.set $36 + local.get $33 + local.get $35 + f64.add + local.get $36 + f64.add + local.get $22 + f64.add + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $17 + local.get $35 + local.get $17 + local.get $22 + f64.sub + local.get $36 + f64.sub + local.get $33 + f64.sub + f64.sub + local.set $18 + end + local.get $1 + local.set $36 + local.get $36 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $36 + local.get $1 + local.get $36 + f64.sub + local.get $17 + f64.mul + local.get $1 + local.get $18 + f64.mul + f64.add + local.set $20 + local.get $36 + local.get $17 + f64.mul + local.set $19 + local.get $20 + local.get $19 + f64.add + local.set $15 + local.get $15 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $2 + i32.wrap_i64 + local.set $11 + local.get $13 + i32.const 1083179008 + i32.ge_s + if + local.get $13 + i32.const 1083179008 + i32.sub + local.get $11 + i32.or + i32.const 0 + i32.ne + if + local.get $16 + f64.const 1.e+300 f64.mul - f64.add - local.get $27 - local.get $27 + f64.const 1.e+300 f64.mul - f64.const 0.0416666808410674 - local.get $28 - f64.const 0.008333335853059549 + return + end + local.get $20 + f64.const 8.008566259537294e-17 + f64.add + local.get $15 + local.get $19 + f64.sub + f64.gt + if + local.get $16 + f64.const 1.e+300 f64.mul - f64.add + f64.const 1.e+300 f64.mul - f64.add - local.set $24 - local.get $39 + return + end + else + local.get $13 + i32.const 2147483647 + i32.and + i32.const 1083231232 + i32.ge_s + if + local.get $13 + i32.const -1064252416 + i32.sub + local.get $11 + i32.or i32.const 0 - i32.eq + i32.ne if - block $~lib/util/math/specialcase|inlined.1 (result f64) - local.get $24 - local.set $18 - local.get $11 - local.set $44 - local.get $14 - local.set $43 - local.get $43 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $44 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.1 - end - local.get $44 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $16 - local.get $16 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $16 - f64.copysign - local.set $23 - local.get $17 - local.get $16 - f64.sub - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $22 - local.get $23 - local.get $16 - f64.add - local.set $21 - local.get $23 - local.get $21 - f64.sub - local.get $16 - f64.add - local.get $22 - f64.add - local.set $22 - local.get $21 - local.get $22 - f64.add - local.get $23 - f64.sub - local.set $16 - local.get $16 - f64.const 0 - f64.eq - if - local.get $44 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $16 - end - end - local.get $16 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return end - local.get $11 - f64.reinterpret_i64 - local.set $26 - local.get $26 - local.get $26 - local.get $24 - f64.mul - f64.add + local.get $20 + local.get $15 + local.get $19 + f64.sub + f64.le + if + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return + end + end + end + local.get $13 + i32.const 2147483647 + i32.and + local.set $11 + local.get $11 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 0 + local.set $12 + local.get $11 + i32.const 1071644672 + i32.gt_s + if + local.get $13 + i32.const 1048576 + local.get $10 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.set $12 + local.get $12 + i32.const 2147483647 + i32.and + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + f64.const 0 + local.set $22 + local.get $12 + i32.const 1048575 + local.get $10 + i32.shr_s + i32.const -1 + i32.xor + i32.and + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $22 + local.get $12 + i32.const 1048575 + i32.and + i32.const 1048576 + i32.or + i32.const 20 + local.get $10 + i32.sub + i32.shr_s + local.set $12 + local.get $13 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $12 + i32.sub + local.set $12 end + local.get $19 + local.get $22 + f64.sub + local.set $19 + end + local.get $20 + local.get $19 + f64.add + local.set $22 + local.get $22 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $22 + local.get $22 + f64.const 0.6931471824645996 + f64.mul + local.set $23 + local.get $20 + local.get $22 + local.get $19 + f64.sub + f64.sub + f64.const 0.6931471805599453 + f64.mul + local.get $22 + f64.const -1.904654299957768e-09 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $15 + local.get $24 + local.get $15 + local.get $23 + f64.sub + f64.sub + local.set $25 + local.get $15 + local.get $15 + f64.mul + local.set $22 + local.get $15 + local.get $22 + f64.const 0.16666666666666602 + local.get $22 + f64.const -2.7777777777015593e-03 + local.get $22 + f64.const 6.613756321437934e-05 + local.get $22 + f64.const -1.6533902205465252e-06 + local.get $22 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.sub + local.set $17 + local.get $15 + local.get $17 + f64.mul + local.get $17 + f64.const 2 + f64.sub + f64.div + local.get $25 + local.get $15 + local.get $25 + f64.mul + f64.add + f64.sub + local.set $21 + f64.const 1 + local.get $21 + local.get $15 + f64.sub + f64.sub + local.set $15 + local.get $15 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $13 + local.get $12 + i32.const 20 + i32.shl + i32.add + local.set $13 + local.get $13 + i32.const 20 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $15 + local.get $12 + call $~lib/math/NativeMath.scalbn + local.set $15 + else + local.get $15 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $13 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.set $15 end + local.get $16 + local.get $15 + f64.mul return ) - (func $../../lib/libm/assembly/libm/pow (; 48 ;) (param $0 f64) (param $1 f64) (result f64) + (func $../../lib/libm/assembly/libm/pow (; 49 ;) (param $0 f64) (param $1 f64) (result f64) local.get $0 local.get $1 call $~lib/math/NativeMath.pow ) - (func $../../lib/libm/assembly/libm/round (; 49 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/round (; 50 ;) (param $0 f64) (result f64) (local $1 f64) local.get $0 local.set $1 @@ -5569,7 +5513,7 @@ local.get $1 f64.copysign ) - (func $../../lib/libm/assembly/libm/sign (; 50 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/sign (; 51 ;) (param $0 f64) (result f64) (local $1 f64) block $~lib/math/NativeMath.sign|inlined.0 (result f64) local.get $0 @@ -5592,7 +5536,7 @@ br $~lib/math/NativeMath.sign|inlined.0 end ) - (func $~lib/math/NativeMath.sin (; 51 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.sin (; 52 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -6121,11 +6065,11 @@ local.get $0 end ) - (func $../../lib/libm/assembly/libm/sin (; 52 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/sin (; 53 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.sin ) - (func $~lib/math/NativeMath.sinh (; 53 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.sinh (; 54 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 f64) (local $3 i32) @@ -6223,18 +6167,18 @@ local.set $4 local.get $4 ) - (func $../../lib/libm/assembly/libm/sinh (; 54 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/sinh (; 55 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.sinh ) - (func $../../lib/libm/assembly/libm/sqrt (; 55 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/sqrt (; 56 ;) (param $0 f64) (result f64) (local $1 f64) local.get $0 local.set $1 local.get $1 f64.sqrt ) - (func $~lib/math/tan_kern (; 56 ;) (param $0 f64) (param $1 f64) (param $2 i32) (result f64) + (func $~lib/math/tan_kern (; 57 ;) (param $0 f64) (param $1 f64) (param $2 i32) (result f64) (local $3 f64) (local $4 f64) (local $5 f64) @@ -6447,7 +6391,7 @@ f64.mul f64.add ) - (func $~lib/math/NativeMath.tan (; 57 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.tan (; 58 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -6759,11 +6703,11 @@ i32.sub call $~lib/math/tan_kern ) - (func $../../lib/libm/assembly/libm/tan (; 58 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/tan (; 59 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.tan ) - (func $~lib/math/NativeMath.tanh (; 59 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.tanh (; 60 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 f64) (local $3 i32) @@ -6855,25 +6799,25 @@ local.get $0 f64.copysign ) - (func $../../lib/libm/assembly/libm/tanh (; 60 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/tanh (; 61 ;) (param $0 f64) (result f64) local.get $0 call $~lib/math/NativeMath.tanh ) - (func $../../lib/libm/assembly/libm/trunc (; 61 ;) (param $0 f64) (result f64) + (func $../../lib/libm/assembly/libm/trunc (; 62 ;) (param $0 f64) (result f64) (local $1 f64) local.get $0 local.set $1 local.get $1 f64.trunc ) - (func $../../lib/libm/assembly/libmf/abs (; 62 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/abs (; 63 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 local.get $1 f32.abs ) - (func $~lib/math/Rf (; 63 ;) (param $0 f32) (result f32) + (func $~lib/math/Rf (; 64 ;) (param $0 f32) (result f32) (local $1 f32) (local $2 f32) local.get $0 @@ -6898,7 +6842,7 @@ local.get $2 f32.div ) - (func $~lib/math/NativeMathf.acos (; 64 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.acos (; 65 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f32) @@ -7038,11 +6982,11 @@ f32.add f32.mul ) - (func $../../lib/libm/assembly/libmf/acos (; 65 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/acos (; 66 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.acos ) - (func $~lib/math/NativeMathf.log1p (; 66 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.log1p (; 67 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -7251,172 +7195,176 @@ f32.mul f32.add ) - (func $~lib/math/NativeMathf.log (; 67 ;) (param $0 f32) (result f32) - (local $1 f32) + (func $~lib/math/NativeMathf.log (; 68 ;) (param $0 f32) (result f32) + (local $1 i32) (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 f64) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (local $12 f64) - (local $13 f64) - block $~lib/util/math/logf_lut|inlined.0 (result f32) - local.get $0 - local.set $1 + (local $3 f32) + (local $4 f32) + (local $5 f32) + (local $6 f32) + (local $7 f32) + (local $8 f32) + (local $9 f32) + (local $10 f32) + (local $11 f32) + local.get $0 + i32.reinterpret_f32 + local.set $1 + i32.const 0 + local.set $2 + local.get $1 + i32.const 8388608 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $1 - i32.reinterpret_f32 - local.set $2 + i32.const 31 + i32.shr_u + end + if + local.get $1 + i32.const 1 + i32.shl + i32.const 0 + i32.eq + if + f32.const -1 + local.get $0 + local.get $0 + f32.mul + f32.div + return + end + local.get $1 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f32.sub + f32.const 0 + f32.div + return + end local.get $2 - i32.const 8388608 + i32.const 25 i32.sub - i32.const 2130706432 + local.set $2 + local.get $0 + f32.const 33554432 + f32.mul + local.set $0 + local.get $0 + i32.reinterpret_f32 + local.set $1 + else + local.get $1 + i32.const 2139095040 i32.ge_u if - local.get $2 - i32.const 1 - i32.shl - i32.const 0 - i32.eq - if - f32.const inf - f32.neg - br $~lib/util/math/logf_lut|inlined.0 - end - local.get $2 - i32.const 2139095040 + local.get $0 + return + else + local.get $1 + i32.const 1065353216 i32.eq if - local.get $1 - br $~lib/util/math/logf_lut|inlined.0 - end - local.get $2 - i32.const 31 - i32.shr_u - if (result i32) - i32.const 1 - else - local.get $2 - i32.const 1 - i32.shl - i32.const -16777216 - i32.ge_u - end - if - local.get $1 - local.get $1 - f32.sub - local.get $1 - local.get $1 - f32.sub - f32.div - br $~lib/util/math/logf_lut|inlined.0 + f32.const 0 + return end - local.get $1 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - local.set $2 - local.get $2 - i32.const 23 - i32.const 23 - i32.shl - i32.sub - local.set $2 end - local.get $2 - i32.const 1060306944 - i32.sub - local.set $3 - local.get $3 - i32.const 23 - i32.const 4 - i32.sub - i32.shr_u - i32.const 15 - i32.and - local.set $4 - local.get $3 - i32.const 23 - i32.shr_s - local.set $5 - local.get $2 - local.get $3 - i32.const 511 - i32.const 23 - i32.shl - i32.and - i32.sub - local.set $6 - i32.const 12624 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $7 - i32.const 12624 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $8 - local.get $6 - f32.reinterpret_i32 - f64.promote_f32 - local.set $9 - local.get $9 - local.get $7 - f64.mul - f64.const 1 - f64.sub - local.set $10 - local.get $8 - local.get $5 - f64.convert_i32_s - f64.const 0.6931471805599453 - f64.mul - f64.add - local.set $11 - local.get $10 - local.get $10 - f64.mul - local.set $12 - f64.const 0.333456765744066 - local.get $10 - f64.mul - f64.const -0.4999997485802103 - f64.add - local.set $13 - local.get $13 - f64.const -0.25089342214237154 - local.get $12 - f64.mul - f64.add - local.set $13 - local.get $13 - local.get $12 - f64.mul - local.get $11 - local.get $10 - f64.add - f64.add - local.set $13 - local.get $13 - f32.demote_f64 end + local.get $1 + i32.const 1065353216 + i32.const 1060439283 + i32.sub + i32.add + local.set $1 + local.get $2 + local.get $1 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + i32.add + local.set $2 + local.get $1 + i32.const 8388607 + i32.and + i32.const 1060439283 + i32.add + local.set $1 + local.get $1 + f32.reinterpret_i32 + local.set $0 + local.get $0 + f32.const 1 + f32.sub + local.set $3 + local.get $3 + f32.const 2 + local.get $3 + f32.add + f32.div + local.set $4 + local.get $4 + local.get $4 + f32.mul + local.set $5 + local.get $5 + local.get $5 + f32.mul + local.set $6 + local.get $6 + f32.const 0.40000972151756287 + local.get $6 + f32.const 0.24279078841209412 + f32.mul + f32.add + f32.mul + local.set $7 + local.get $5 + f32.const 0.6666666269302368 + local.get $6 + f32.const 0.2849878668785095 + f32.mul + f32.add + f32.mul + local.set $8 + local.get $8 + local.get $7 + f32.add + local.set $9 + f32.const 0.5 + local.get $3 + f32.mul + local.get $3 + f32.mul + local.set $10 + local.get $2 + f32.convert_i32_s + local.set $11 + local.get $4 + local.get $10 + local.get $9 + f32.add + f32.mul + local.get $11 + f32.const 9.05800061445916e-06 + f32.mul + f32.add + local.get $10 + f32.sub + local.get $3 + f32.add + local.get $11 + f32.const 0.6931381225585938 + f32.mul + f32.add return ) - (func $~lib/math/NativeMathf.acosh (; 68 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.acosh (; 69 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f32) @@ -7472,11 +7420,11 @@ f32.const 0.6931471824645996 f32.add ) - (func $../../lib/libm/assembly/libmf/acosh (; 69 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/acosh (; 70 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.acosh ) - (func $~lib/math/NativeMathf.asin (; 70 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.asin (; 71 ;) (param $0 f32) (result f32) (local $1 f32) (local $2 i32) (local $3 f32) @@ -7568,11 +7516,11 @@ local.get $1 f32.copysign ) - (func $../../lib/libm/assembly/libmf/asin (; 71 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/asin (; 72 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.asin ) - (func $~lib/math/NativeMathf.asinh (; 72 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.asinh (; 73 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) local.get $0 @@ -7641,11 +7589,11 @@ local.get $0 f32.copysign ) - (func $../../lib/libm/assembly/libmf/asinh (; 73 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/asinh (; 74 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.asinh ) - (func $~lib/math/NativeMathf.atan (; 74 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.atan (; 75 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -7875,11 +7823,11 @@ local.get $2 f32.copysign ) - (func $../../lib/libm/assembly/libmf/atan (; 75 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/atan (; 76 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.atan ) - (func $~lib/math/NativeMathf.atanh (; 76 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.atanh (; 77 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) local.get $0 @@ -7929,11 +7877,11 @@ local.get $0 f32.copysign ) - (func $../../lib/libm/assembly/libmf/atanh (; 77 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/atanh (; 78 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.atanh ) - (func $~lib/math/NativeMathf.atan2 (; 78 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.atan2 (; 79 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -8205,12 +8153,12 @@ end unreachable ) - (func $../../lib/libm/assembly/libmf/atan2 (; 79 ;) (param $0 f32) (param $1 f32) (result f32) + (func $../../lib/libm/assembly/libmf/atan2 (; 80 ;) (param $0 f32) (param $1 f32) (result f32) local.get $0 local.get $1 call $~lib/math/NativeMathf.atan2 ) - (func $~lib/math/NativeMathf.cbrt (; 80 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.cbrt (; 81 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f64) @@ -8326,18 +8274,18 @@ local.get $3 f32.demote_f64 ) - (func $../../lib/libm/assembly/libmf/cbrt (; 81 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/cbrt (; 82 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.cbrt ) - (func $../../lib/libm/assembly/libmf/ceil (; 82 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/ceil (; 83 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 local.get $1 f32.ceil ) - (func $~lib/math/NativeMathf.clz32 (; 83 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.clz32 (; 84 ;) (param $0 f32) (result f32) local.get $0 local.get $0 f32.sub @@ -8354,11 +8302,11 @@ i32.clz f32.convert_i32_s ) - (func $../../lib/libm/assembly/libmf/clz32 (; 84 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/clz32 (; 85 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.clz32 ) - (func $~lib/math/NativeMathf.cos (; 85 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.cos (; 86 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f64) @@ -8781,7 +8729,7 @@ i32.and i64.extend_i32_s local.set $14 - i32.const 12896 + i32.const 240 local.get $13 i32.const 6 i32.shr_s @@ -8972,11 +8920,11 @@ local.get $26 end ) - (func $../../lib/libm/assembly/libmf/cos (; 86 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/cos (; 87 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.cos ) - (func $~lib/math/NativeMathf.expm1 (; 87 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.expm1 (; 88 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -9269,138 +9217,249 @@ local.get $13 f32.mul ) - (func $~lib/math/NativeMathf.exp (; 88 ;) (param $0 f32) (result f32) - (local $1 f32) - (local $2 f64) + (func $~lib/math/NativeMathf.scalbn (; 89 ;) (param $0 f32) (param $1 i32) (result f32) + (local $2 f32) (local $3 i32) (local $4 i32) - (local $5 f64) - (local $6 f64) - (local $7 i64) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 i64) - block $~lib/util/math/expf_lut|inlined.0 (result f32) - local.get $0 - local.set $1 - local.get $1 - f64.promote_f32 + local.get $0 + local.set $2 + local.get $1 + i32.const 127 + i32.gt_s + if + local.get $2 + f32.const 1701411834604692317316873e14 + f32.mul local.set $2 local.get $1 - i32.reinterpret_f32 - local.set $3 - local.get $3 - i32.const 20 - i32.shr_u - i32.const 2047 - i32.and - local.set $4 - local.get $4 - i32.const 1067 - i32.ge_u + i32.const 127 + i32.sub + local.set $1 + local.get $1 + i32.const 127 + i32.gt_s if + local.get $2 + f32.const 1701411834604692317316873e14 + f32.mul + local.set $2 + local.get $1 + i32.const 127 + i32.sub + local.tee $3 + i32.const 127 + local.tee $4 local.get $3 - i32.const -8388608 - i32.eq - if - f32.const 0 - br $~lib/util/math/expf_lut|inlined.0 - end local.get $4 - i32.const 2040 - i32.ge_u + i32.lt_s + select + local.set $1 + end + else + local.get $1 + i32.const -126 + i32.lt_s + if + local.get $2 + f32.const 1.1754943508222875e-38 + f32.const 16777216 + f32.mul + f32.mul + local.set $2 + local.get $1 + i32.const 126 + i32.const 24 + i32.sub + i32.add + local.set $1 + local.get $1 + i32.const -126 + i32.lt_s if + local.get $2 + f32.const 1.1754943508222875e-38 + f32.const 16777216 + f32.mul + f32.mul + local.set $2 local.get $1 - local.get $1 - f32.add - br $~lib/util/math/expf_lut|inlined.0 + i32.const 126 + i32.add + i32.const 24 + i32.sub + local.tee $3 + i32.const -126 + local.tee $4 + local.get $3 + local.get $4 + i32.gt_s + select + local.set $1 end - local.get $1 - f32.const 88.72283172607422 - f32.gt + end + end + local.get $2 + i32.const 127 + local.get $1 + i32.add + i32.const 23 + i32.shl + f32.reinterpret_i32 + f32.mul + ) + (func $~lib/math/NativeMathf.exp (; 90 ;) (param $0 f32) (result f32) + (local $1 i32) + (local $2 i32) + (local $3 f32) + (local $4 f32) + (local $5 i32) + (local $6 f32) + (local $7 f32) + (local $8 f32) + local.get $0 + i32.reinterpret_f32 + local.set $1 + local.get $1 + i32.const 31 + i32.shr_u + local.set $2 + local.get $1 + i32.const 2147483647 + i32.and + local.set $1 + local.get $1 + i32.const 1118743632 + i32.ge_u + if + local.get $1 + i32.const 2139095040 + i32.gt_u + if + local.get $0 + return + end + local.get $1 + i32.const 1118925336 + i32.ge_u + if + local.get $2 + i32.eqz if - local.get $1 + local.get $0 f32.const 1701411834604692317316873e14 f32.mul - br $~lib/util/math/expf_lut|inlined.0 - end - local.get $1 - f32.const -103.97207641601562 - f32.lt - if - f32.const 0 - br $~lib/util/math/expf_lut|inlined.0 + return + else + local.get $1 + i32.const 1120924085 + i32.ge_u + if + f32.const 0 + return + end end end - f64.const 46.16624130844683 - local.get $2 - f64.mul - local.set $5 + end + local.get $1 + i32.const 1051816472 + i32.gt_u + if + local.get $1 + i32.const 1065686418 + i32.gt_u + if + f32.const 1.4426950216293335 + local.get $0 + f32.mul + f32.const 0.5 + local.get $0 + f32.copysign + f32.add + i32.trunc_f32_s + local.set $5 + else + i32.const 1 + local.get $2 + i32.const 1 + i32.shl + i32.sub + local.set $5 + end + local.get $0 local.get $5 - f64.const 6755399441055744 - f64.add - local.set $6 - local.get $6 - i64.reinterpret_f64 - local.set $7 + f32.convert_i32_s + f32.const 0.693145751953125 + f32.mul + f32.sub + local.set $3 local.get $5 - local.get $6 - f64.const 6755399441055744 - f64.sub - f64.sub - local.set $8 - i32.const 12944 - local.get $7 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl - i32.add - i64.load - local.set $11 - local.get $11 - local.get $7 - i64.const 52 - i64.const 5 - i64.sub - i64.shl - i64.add - local.set $11 - local.get $11 - f64.reinterpret_i64 - local.set $9 - f64.const 1.6938359250920212e-06 + f32.convert_i32_s + f32.const 1.428606765330187e-06 + f32.mul + local.set $4 + local.get $3 + local.get $4 + f32.sub + local.set $0 + else + local.get $1 + i32.const 956301312 + i32.gt_u + if + i32.const 0 + local.set $5 + local.get $0 + local.set $3 + f32.const 0 + local.set $4 + else + f32.const 1 + local.get $0 + f32.add + return + end + end + local.get $0 + local.get $0 + f32.mul + local.set $6 + local.get $0 + local.get $6 + f32.const 0.16666625440120697 + local.get $6 + f32.const -2.7667332906275988e-03 + f32.mul + f32.add + f32.mul + f32.sub + local.set $7 + f32.const 1 + local.get $0 + local.get $7 + f32.mul + f32.const 2 + local.get $7 + f32.sub + f32.div + local.get $4 + f32.sub + local.get $3 + f32.add + f32.add + local.set $8 + local.get $5 + i32.const 0 + i32.eq + if (result f32) local.get $8 - f64.mul - f64.const 2.3459809789509004e-04 - f64.add - local.set $5 - f64.const 0.021660849396613134 + else local.get $8 - f64.mul - f64.const 1 - f64.add - local.set $10 - local.get $10 local.get $5 - local.get $8 - local.get $8 - f64.mul - f64.mul - f64.add - local.set $10 - local.get $10 - local.get $9 - f64.mul - local.set $10 - local.get $10 - f32.demote_f64 + call $~lib/math/NativeMathf.scalbn end return ) - (func $~lib/math/NativeMathf.cosh (; 89 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.cosh (; 91 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -9477,32 +9536,32 @@ local.get $3 f32.mul ) - (func $../../lib/libm/assembly/libmf/cosh (; 90 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/cosh (; 92 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.cosh ) - (func $../../lib/libm/assembly/libmf/exp (; 91 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/exp (; 93 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.exp ) - (func $../../lib/libm/assembly/libmf/expm1 (; 92 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/expm1 (; 94 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.expm1 ) - (func $../../lib/libm/assembly/libmf/floor (; 93 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/floor (; 95 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 local.get $1 f32.floor ) - (func $../../lib/libm/assembly/libmf/fround (; 94 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/fround (; 96 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 local.get $1 ) - (func $~lib/math/NativeMathf.hypot (; 95 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.hypot (; 97 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9619,12 +9678,12 @@ f32.sqrt f32.mul ) - (func $../../lib/libm/assembly/libmf/hypot (; 96 ;) (param $0 f32) (param $1 f32) (result f32) + (func $../../lib/libm/assembly/libmf/hypot (; 98 ;) (param $0 f32) (param $1 f32) (result f32) local.get $0 local.get $1 call $~lib/math/NativeMathf.hypot ) - (func $../../lib/libm/assembly/libmf/imul (; 97 ;) (param $0 f32) (param $1 f32) (result f32) + (func $../../lib/libm/assembly/libmf/imul (; 99 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 f32) (local $3 f32) (local $4 f32) @@ -9656,11 +9715,11 @@ f32.convert_i32_s end ) - (func $../../lib/libm/assembly/libmf/log (; 98 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/log (; 100 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.log ) - (func $~lib/math/NativeMathf.log10 (; 99 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.log10 (; 101 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f32) @@ -9860,188 +9919,215 @@ f32.mul f32.add ) - (func $../../lib/libm/assembly/libmf/log10 (; 100 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/log10 (; 102 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.log10 ) - (func $../../lib/libm/assembly/libmf/log1p (; 101 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/log1p (; 103 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.log1p ) - (func $~lib/math/NativeMathf.log2 (; 102 ;) (param $0 f32) (result f32) - (local $1 f32) + (func $~lib/math/NativeMathf.log2 (; 104 ;) (param $0 f32) (result f32) + (local $1 i32) (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (local $12 f64) - (local $13 f64) - (local $14 f64) - (local $15 f64) - block $~lib/util/math/log2f_lut|inlined.0 (result f32) - local.get $0 - local.set $1 + (local $3 f32) + (local $4 f32) + (local $5 f32) + (local $6 f32) + (local $7 f32) + (local $8 f32) + (local $9 f32) + (local $10 f32) + (local $11 f32) + (local $12 i32) + (local $13 f32) + (local $14 f32) + local.get $0 + i32.reinterpret_f32 + local.set $1 + i32.const 0 + local.set $2 + local.get $1 + i32.const 8388608 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $1 - i32.reinterpret_f32 - local.set $2 - local.get $2 - i32.const 8388608 - i32.sub - i32.const 2130706432 - i32.ge_u + i32.const 31 + i32.shr_u + end + if + local.get $1 + i32.const 1 + i32.shl + i32.const 0 + i32.eq if - local.get $2 - i32.const 2 - i32.mul - i32.const 0 - i32.eq - if - f32.const inf - f32.neg - br $~lib/util/math/log2f_lut|inlined.0 - end - local.get $2 - i32.const 2139095040 - i32.eq - if - local.get $1 - br $~lib/util/math/log2f_lut|inlined.0 - end - local.get $2 - i32.const 31 - i32.shr_u - if (result i32) - i32.const 1 - else - local.get $2 - i32.const 2 - i32.mul - i32.const -16777216 - i32.ge_u - end - if - local.get $1 - local.get $1 - f32.sub - local.get $1 - local.get $1 - f32.sub - f32.div - br $~lib/util/math/log2f_lut|inlined.0 - end - local.get $1 - f32.const 8388608 + f32.const -1 + local.get $0 + local.get $0 f32.mul - i32.reinterpret_f32 - local.set $2 - local.get $2 - i32.const 23 - i32.const 23 - i32.shl - i32.sub - local.set $2 + f32.div + return end - local.get $2 - i32.const 1060306944 - i32.sub - local.set $3 - local.get $3 - i32.const 23 - i32.const 4 - i32.sub + local.get $1 + i32.const 31 i32.shr_u - i32.const 15 - i32.and - local.set $4 - local.get $3 - i32.const -8388608 - i32.and - local.set $5 + if + local.get $0 + local.get $0 + f32.sub + f32.const 0 + f32.div + return + end local.get $2 - local.get $5 + i32.const 25 i32.sub - local.set $6 - local.get $3 - i32.const 23 - i32.shr_s - local.set $7 - i32.const 13216 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $8 - i32.const 13216 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $9 - local.get $6 - f32.reinterpret_i32 - f64.promote_f32 - local.set $10 - local.get $10 - local.get $8 - f64.mul - f64.const 1 - f64.sub - local.set $11 - local.get $9 - local.get $7 - f64.convert_i32_s - f64.add - local.set $12 - f64.const 0.4811247078767291 - local.get $11 - f64.mul - f64.const -0.7213476299867769 - f64.add - local.set $13 - f64.const 1.4426950186867042 - local.get $11 - f64.mul - local.get $12 - f64.add - local.set $14 - local.get $11 - local.get $11 - f64.mul - local.set $15 - local.get $13 - f64.const -0.36051725506874704 - local.get $15 - f64.mul - f64.add - local.set $13 - local.get $13 - local.get $15 - f64.mul - local.get $14 - f64.add - local.set $13 - local.get $13 - f32.demote_f64 + local.set $2 + local.get $0 + f32.const 33554432 + f32.mul + local.set $0 + local.get $0 + i32.reinterpret_f32 + local.set $1 + else + local.get $1 + i32.const 2139095040 + i32.ge_u + if + local.get $0 + return + else + local.get $1 + i32.const 1065353216 + i32.eq + if + f32.const 0 + return + end + end end + local.get $1 + i32.const 1065353216 + i32.const 1060439283 + i32.sub + i32.add + local.set $1 + local.get $2 + local.get $1 + i32.const 23 + i32.shr_u + i32.const 127 + i32.sub + i32.add + local.set $2 + local.get $1 + i32.const 8388607 + i32.and + i32.const 1060439283 + i32.add + local.set $1 + local.get $1 + f32.reinterpret_i32 + local.set $0 + local.get $0 + f32.const 1 + f32.sub + local.set $3 + local.get $3 + f32.const 2 + local.get $3 + f32.add + f32.div + local.set $4 + local.get $4 + local.get $4 + f32.mul + local.set $5 + local.get $5 + local.get $5 + f32.mul + local.set $6 + local.get $6 + f32.const 0.40000972151756287 + local.get $6 + f32.const 0.24279078841209412 + f32.mul + f32.add + f32.mul + local.set $7 + local.get $5 + f32.const 0.6666666269302368 + local.get $6 + f32.const 0.2849878668785095 + f32.mul + f32.add + f32.mul + local.set $8 + local.get $8 + local.get $7 + f32.add + local.set $9 + f32.const 0.5 + local.get $3 + f32.mul + local.get $3 + f32.mul + local.set $10 + local.get $3 + local.get $10 + f32.sub + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $12 + local.get $12 + i32.const -4096 + i32.and + local.set $12 + local.get $12 + f32.reinterpret_i32 + local.set $11 + local.get $3 + local.get $11 + f32.sub + local.get $10 + f32.sub + local.get $4 + local.get $10 + local.get $9 + f32.add + f32.mul + f32.add + local.set $13 + local.get $2 + f32.convert_i32_s + local.set $14 + local.get $13 + local.get $11 + f32.add + f32.const -1.7605285393074155e-04 + f32.mul + local.get $13 + f32.const 1.44287109375 + f32.mul + f32.add + local.get $11 + f32.const 1.44287109375 + f32.mul + f32.add + local.get $14 + f32.add return ) - (func $../../lib/libm/assembly/libmf/log2 (; 103 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/log2 (; 105 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.log2 ) - (func $../../lib/libm/assembly/libmf/max (; 104 ;) (param $0 f32) (param $1 f32) (result f32) + (func $../../lib/libm/assembly/libmf/max (; 106 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 f32) (local $3 f32) local.get $0 @@ -10052,7 +10138,7 @@ local.get $2 f32.max ) - (func $../../lib/libm/assembly/libmf/min (; 105 ;) (param $0 f32) (param $1 f32) (result f32) + (func $../../lib/libm/assembly/libmf/min (; 107 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 f32) (local $3 f32) local.get $0 @@ -10063,597 +10149,999 @@ local.get $2 f32.min ) - (func $~lib/math/NativeMathf.pow (; 106 ;) (param $0 f32) (param $1 f32) (result f32) - (local $2 f32) - (local $3 f32) + (func $~lib/math/NativeMathf.pow (; 108 ;) (param $0 f32) (param $1 f32) (result f32) + (local $2 i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) - (local $9 f32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 f64) - (local $16 f64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - (local $22 f64) - (local $23 i64) - (local $24 i64) + (local $9 i32) + (local $10 f32) + (local $11 f32) + (local $12 f32) + (local $13 f32) + (local $14 f32) + (local $15 f32) + (local $16 f32) + (local $17 f32) + (local $18 f32) + (local $19 f32) + (local $20 f32) + (local $21 f32) + (local $22 f32) + (local $23 f32) + (local $24 i32) + (local $25 i32) + (local $26 f32) + (local $27 f32) + (local $28 f32) + (local $29 f32) + (local $30 f32) + (local $31 f32) + (local $32 f32) + (local $33 f32) + (local $34 f32) + (local $35 f32) + (local $36 i32) local.get $1 f32.abs f32.const 2 f32.le if - local.get $1 - f32.const 2 - f32.eq + local.get $1 + f32.const 2 + f32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $1 + f32.const 0.5 + f32.eq + if + local.get $0 + f32.sqrt + f32.abs + f32.const inf + local.get $0 + f32.const inf + f32.neg + f32.ne + select + return + end + local.get $1 + f32.const -1 + f32.eq + if + f32.const 1 + local.get $0 + f32.div + return + end + local.get $1 + f32.const 1 + f32.eq + if + local.get $0 + return + end + local.get $1 + f32.const 0 + f32.eq + if + f32.const 1 + return + end + end + local.get $0 + i32.reinterpret_f32 + local.set $2 + local.get $1 + i32.reinterpret_f32 + local.set $3 + local.get $2 + i32.const 2147483647 + i32.and + local.set $4 + local.get $3 + i32.const 2147483647 + i32.and + local.set $5 + local.get $5 + i32.const 0 + i32.eq + if + f32.const 1 + return + end + local.get $4 + i32.const 2139095040 + i32.gt_s + if (result i32) + i32.const 1 + else + local.get $5 + i32.const 2139095040 + i32.gt_s + end + if + local.get $0 + local.get $1 + f32.add + return + end + i32.const 0 + local.set $6 + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $5 + i32.const 1266679808 + i32.ge_s + if + i32.const 2 + local.set $6 + else + local.get $5 + i32.const 1065353216 + i32.ge_s + if + local.get $5 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 + i32.const 23 + local.get $8 + i32.sub + local.set $9 + local.get $5 + local.get $9 + i32.shr_s + local.set $7 + local.get $7 + local.get $9 + i32.shl + local.get $5 + i32.eq + if + i32.const 2 + local.get $7 + i32.const 1 + i32.and + i32.sub + local.set $6 + end + end + end + end + local.get $5 + i32.const 2139095040 + i32.eq + if + local.get $4 + i32.const 1065353216 + i32.eq if + f32.const nan:0x400000 + return + else + local.get $4 + i32.const 1065353216 + i32.gt_s + if + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + local.get $1 + else + f32.const 0 + end + return + else + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + f32.const 0 + else + local.get $1 + f32.neg + end + return + end + unreachable + end + unreachable + end + local.get $5 + i32.const 1065353216 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) local.get $0 + else + f32.const 1 local.get $0 - f32.mul - return + f32.div end - local.get $1 - f32.const 0.5 - f32.eq + return + end + local.get $3 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $3 + i32.const 1056964608 + i32.eq + if + local.get $2 + i32.const 0 + i32.ge_s if local.get $0 f32.sqrt - f32.abs - f32.const inf - local.get $0 - f32.const inf - f32.neg - f32.ne - select return end - local.get $1 - f32.const -1 - f32.eq + end + local.get $0 + f32.abs + local.set $10 + local.get $4 + i32.const 2139095040 + i32.eq + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 0 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 1065353216 + i32.eq + end + if + local.get $10 + local.set $11 + local.get $3 + i32.const 0 + i32.lt_s if f32.const 1 + local.get $11 + f32.div + local.set $11 + end + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $4 + i32.const 1065353216 + i32.sub + local.get $6 + i32.or + i32.const 0 + i32.eq + if + local.get $11 + local.get $11 + f32.sub + local.set $12 + local.get $12 + local.get $12 + f32.div + local.set $11 + else + local.get $6 + i32.const 1 + i32.eq + if + local.get $11 + f32.neg + local.set $11 + end + end + end + local.get $11 + return + end + f32.const 1 + local.set $13 + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $6 + i32.const 0 + i32.eq + if + local.get $0 local.get $0 + f32.sub + local.set $12 + local.get $12 + local.get $12 f32.div return end - local.get $1 - f32.const 1 - f32.eq + local.get $6 + i32.const 1 + i32.eq if - local.get $0 + f32.const -1 + local.set $13 + end + end + local.get $5 + i32.const 1291845632 + i32.gt_s + if + local.get $4 + i32.const 1065353208 + i32.lt_s + if + local.get $3 + i32.const 0 + i32.lt_s + if (result f32) + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + else + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + end return end - local.get $1 - f32.const 0 - f32.eq + local.get $4 + i32.const 1065353223 + i32.gt_s if - f32.const 1 + local.get $3 + i32.const 0 + i32.gt_s + if (result f32) + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + else + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + end return end - end - block $~lib/util/math/powf_lut|inlined.0 (result f32) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i32.reinterpret_f32 - local.set $5 - local.get $2 + local.get $10 + f32.const 1 + f32.sub + local.set $18 + local.get $18 + local.get $18 + f32.mul + f32.const 0.5 + local.get $18 + f32.const 0.3333333432674408 + local.get $18 + f32.const 0.25 + f32.mul + f32.sub + f32.mul + f32.sub + f32.mul + local.set $21 + f32.const 1.44268798828125 + local.get $18 + f32.mul + local.set $19 + local.get $18 + f32.const 7.052607543300837e-06 + f32.mul + local.get $21 + f32.const 1.4426950216293335 + f32.mul + f32.sub + local.set $20 + local.get $19 + local.get $20 + f32.add + local.set $14 + local.get $14 i32.reinterpret_f32 - local.set $6 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $14 + local.get $20 + local.get $14 + local.get $19 + f32.sub + f32.sub + local.set $15 + else i32.const 0 - local.set $7 - local.get $5 + local.set $24 + local.get $4 i32.const 8388608 + i32.lt_s + if + local.get $10 + f32.const 16777216 + f32.mul + local.set $10 + local.get $24 + i32.const 24 + i32.sub + local.set $24 + local.get $10 + i32.reinterpret_f32 + local.set $4 + end + local.get $24 + local.get $4 + i32.const 23 + i32.shr_s + i32.const 127 i32.sub - i32.const 2130706432 - i32.ge_u - local.get $6 - local.set $8 - local.get $8 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - i32.const 0 - i32.ne - local.tee $7 + i32.add + local.set $24 + local.get $4 + i32.const 8388607 + i32.and + local.set $7 + local.get $7 + i32.const 1065353216 i32.or + local.set $4 + local.get $7 + i32.const 1885297 + i32.le_s if + i32.const 0 + local.set $8 + else local.get $7 + i32.const 6140887 + i32.lt_s if - local.get $6 - i32.const 1 - i32.shl - i32.const 0 - i32.eq - if - f32.const 1 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1065353216 - i32.eq - if - f32.const nan:0x400000 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - end - if - local.get $3 - local.get $2 - f32.add - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const 2130706432 - i32.eq - if - f32.const nan:0x400000 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 i32.const 1 - i32.shl - i32.const 2130706432 - i32.lt_u - local.get $6 - i32.const 31 - i32.shr_u - i32.eqz - i32.eq - if - f32.const 0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - local.get $2 - f32.mul - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - local.set $8 - local.get $8 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - if - local.get $3 - local.get $3 - f32.mul - local.set $9 - local.get $5 - i32.const 31 - i32.shr_u - if (result i32) - block $~lib/util/math/checkintf|inlined.0 (result i32) - local.get $6 - local.set $8 - local.get $8 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.set $10 - local.get $10 - i32.const 127 - i32.lt_u - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.0 - end - local.get $10 - i32.const 150 - i32.gt_u - if - i32.const 2 - br $~lib/util/math/checkintf|inlined.0 - end - i32.const 1 - i32.const 150 - local.get $10 - i32.sub - i32.shl - local.set $10 - local.get $8 - local.get $10 - i32.const 1 - i32.sub - i32.and - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.0 - end - local.get $8 - local.get $10 - i32.and - if - i32.const 1 - br $~lib/util/math/checkintf|inlined.0 - end - i32.const 2 - end - i32.const 1 - i32.eq - else - i32.const 0 - end - if - local.get $9 - f32.neg - local.set $9 - end - local.get $6 - i32.const 31 - i32.shr_u - if (result f32) - f32.const 1 - local.get $9 - f32.div - else - local.get $9 - end - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 31 - i32.shr_u - if - block $~lib/util/math/checkintf|inlined.1 (result i32) - local.get $6 - local.set $8 - local.get $8 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.set $10 - local.get $10 - i32.const 127 - i32.lt_u - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.1 - end - local.get $10 - i32.const 150 - i32.gt_u - if - i32.const 2 - br $~lib/util/math/checkintf|inlined.1 - end - i32.const 1 - i32.const 127 - i32.const 23 - i32.add - local.get $10 - i32.sub - i32.shl - local.set $10 - local.get $8 - local.get $10 - i32.const 1 - i32.sub - i32.and - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.1 - end - local.get $8 - local.get $10 - i32.and - if - i32.const 1 - br $~lib/util/math/checkintf|inlined.1 - end - i32.const 2 - end - local.set $10 - local.get $10 + local.set $8 + else i32.const 0 - i32.eq - if - local.get $3 - local.get $3 - f32.sub - local.get $3 - local.get $3 - f32.sub - f32.div - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $10 + local.set $8 + local.get $24 i32.const 1 - i32.eq - if - i32.const 65536 - local.set $4 - end - local.get $5 - i32.const 2147483647 - i32.and - local.set $5 - end - local.get $5 - i32.const 8388608 - i32.lt_u - if - local.get $3 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - local.set $5 - local.get $5 - i32.const 2147483647 - i32.and - local.set $5 - local.get $5 - i32.const 23 - i32.const 23 - i32.shl + i32.add + local.set $24 + local.get $4 + i32.const 8388608 i32.sub - local.set $5 + local.set $4 end end - local.get $5 - local.set $8 - local.get $8 - i32.const 1060306944 - i32.sub + local.get $4 + f32.reinterpret_i32 local.set $10 + f32.const 1.5 + f32.const 1 + local.get $8 + select + local.set $30 local.get $10 - i32.const 23 - i32.const 4 - i32.sub - i32.shr_u - i32.const 15 - i32.and - local.set $11 + local.get $30 + f32.sub + local.set $19 + f32.const 1 local.get $10 - i32.const -8388608 + local.get $30 + f32.add + f32.div + local.set $20 + local.get $19 + local.get $20 + f32.mul + local.set $17 + local.get $17 + local.set $26 + local.get $26 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 i32.and - local.set $12 - local.get $8 - local.get $12 - i32.sub - local.set $13 - local.get $12 - i32.const 23 - i32.shr_s - local.set $14 - i32.const 13216 - local.get $11 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $15 - i32.const 13216 - local.get $11 + f32.reinterpret_i32 + local.set $26 + local.get $4 i32.const 1 - i32.const 3 + i32.shr_s + i32.const -4096 + i32.and + i32.const 536870912 + i32.or + local.set $25 + local.get $25 + i32.const 4194304 i32.add + local.get $8 + i32.const 21 i32.shl i32.add - f64.load offset=8 - local.set $16 - local.get $13 f32.reinterpret_i32 - f64.promote_f32 - local.set $17 + local.set $28 + local.get $10 + local.get $28 + local.get $30 + f32.sub + f32.sub + local.set $29 + local.get $20 + local.get $19 + local.get $26 + local.get $28 + f32.mul + f32.sub + local.get $26 + local.get $29 + f32.mul + f32.sub + f32.mul + local.set $27 local.get $17 - local.get $15 - f64.mul - f64.const 1 - f64.sub - local.set $18 + local.get $17 + f32.mul + local.set $12 + local.get $12 + local.get $12 + f32.mul + f32.const 0.6000000238418579 + local.get $12 + f32.const 0.4285714328289032 + local.get $12 + f32.const 0.3333333432674408 + local.get $12 + f32.const 0.2727281153202057 + local.get $12 + f32.const 0.23066075146198273 + local.get $12 + f32.const 0.20697501301765442 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + local.set $16 local.get $16 - local.get $14 - f64.convert_i32_s - f64.add + local.get $27 + local.get $26 + local.get $17 + f32.add + f32.mul + f32.add + local.set $16 + local.get $26 + local.get $26 + f32.mul + local.set $12 + f32.const 3 + local.get $12 + f32.add + local.get $16 + f32.add + local.set $28 + local.get $28 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $28 + local.get $16 + local.get $28 + f32.const 3 + f32.sub + local.get $12 + f32.sub + f32.sub + local.set $29 + local.get $26 + local.get $28 + f32.mul local.set $19 - f64.const 0.288457581109214 - local.get $18 - f64.mul - f64.const -0.36092606229713164 - f64.add + local.get $27 + local.get $28 + f32.mul + local.get $29 + local.get $17 + f32.mul + f32.add local.set $20 - f64.const 0.480898481472577 - local.get $18 - f64.mul - f64.const -0.7213474675006291 - f64.add - local.set $21 - f64.const 1.4426950408774342 - local.get $18 - f64.mul local.get $19 - f64.add + local.get $20 + f32.add local.set $22 - local.get $18 - local.get $18 - f64.mul - local.set $18 local.get $22 - local.get $21 - local.get $18 - f64.mul - f64.add + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 local.set $22 local.get $20 - local.get $18 - local.get $18 - f64.mul - f64.mul local.get $22 - f64.add - local.set $20 - local.get $20 - local.set $22 - local.get $2 - f64.promote_f32 + local.get $19 + f32.sub + f32.sub + local.set $23 + f32.const 0.9619140625 local.get $22 - f64.mul - local.set $21 - local.get $21 - i64.reinterpret_f64 - i64.const 47 - i64.shr_u - i64.const 65535 - i64.and - i64.const 32959 - i64.ge_u + f32.mul + local.set $31 + f32.const 1.5632208487659227e-06 + f32.const 0 + local.get $8 + select + local.set $32 + f32.const -1.1736857413779944e-04 + local.get $22 + f32.mul + local.get $23 + f32.const 0.9617967009544373 + f32.mul + f32.add + local.get $32 + f32.add + local.set $33 + local.get $24 + f32.convert_i32_s + local.set $18 + f32.const 0.5849609375 + f32.const 0 + local.get $8 + select + local.set $34 + local.get $31 + local.get $33 + f32.add + local.get $34 + f32.add + local.get $18 + f32.add + local.set $14 + local.get $14 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $14 + local.get $33 + local.get $14 + local.get $18 + f32.sub + local.get $34 + f32.sub + local.get $31 + f32.sub + f32.sub + local.set $15 + end + local.get $1 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $35 + local.get $1 + local.get $35 + f32.sub + local.get $14 + f32.mul + local.get $1 + local.get $15 + f32.mul + f32.add + local.set $23 + local.get $35 + local.get $14 + f32.mul + local.set $22 + local.get $23 + local.get $22 + f32.add + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $7 + local.get $7 + i32.const 1124073472 + i32.gt_s + if + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + return + else + local.get $7 + i32.const 1124073472 + i32.eq if - local.get $21 - f64.const 127.99999995700433 - f64.gt + local.get $23 + f32.const 4.299566569443414e-08 + f32.add + local.get $11 + local.get $22 + f32.sub + f32.gt if - local.get $4 - local.set $8 - local.get $8 - local.set $10 - i32.const 1879048192 - f32.reinterpret_i32 - local.set $9 - local.get $9 - f32.neg - local.get $9 - local.get $10 - select - local.get $9 + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 f32.mul - br $~lib/util/math/powf_lut|inlined.0 + return end - local.get $21 - f64.const -150 - f64.le + else + local.get $7 + i32.const 2147483647 + i32.and + i32.const 1125515264 + i32.gt_s if - local.get $4 - local.set $11 - local.get $11 - local.set $12 - i32.const 268435456 - f32.reinterpret_i32 - local.set $9 - local.get $9 - f32.neg - local.get $9 - local.get $12 - select - local.get $9 + local.get $13 + f32.const 1.0000000031710769e-30 f32.mul - br $~lib/util/math/powf_lut|inlined.0 + f32.const 1.0000000031710769e-30 + f32.mul + return + else + local.get $7 + i32.const -1021968384 + i32.eq + if + local.get $23 + local.get $11 + local.get $22 + f32.sub + f32.le + if + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + return + end + end end end - local.get $21 - local.set $15 - local.get $4 - local.set $13 - local.get $15 - f64.const 211106232532992 - f64.add - local.set $20 - local.get $20 - i64.reinterpret_f64 - local.set $23 - local.get $15 - local.get $20 - f64.const 211106232532992 - f64.sub - f64.sub - local.set $19 - i32.const 12944 - local.get $23 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl + end + local.get $7 + i32.const 2147483647 + i32.and + local.set $36 + local.get $36 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 + i32.const 0 + local.set $24 + local.get $36 + i32.const 1056964608 + i32.gt_s + if + local.get $7 + i32.const 8388608 + local.get $8 + i32.const 1 + i32.add + i32.shr_s i32.add - i64.load local.set $24 local.get $24 - local.get $23 - local.get $13 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 5 - i64.sub - i64.shl - i64.add - local.set $24 + i32.const 2147483647 + i32.and + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 local.get $24 - f64.reinterpret_i64 - local.set $16 - f64.const 0.05550361559341535 - local.get $19 - f64.mul - f64.const 0.2402284522445722 - f64.add + i32.const 8388607 + local.get $8 + i32.shr_s + i32.const -1 + i32.xor + i32.and + f32.reinterpret_i32 local.set $18 - f64.const 0.6931471806916203 - local.get $19 - f64.mul - f64.const 1 - f64.add - local.set $17 - local.get $17 + local.get $24 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + i32.const 23 + local.get $8 + i32.sub + i32.shr_s + local.set $24 + local.get $7 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $24 + i32.sub + local.set $24 + end + local.get $22 local.get $18 - local.get $19 - local.get $19 - f64.mul - f64.mul - f64.add - local.set $17 - local.get $17 - local.get $16 - f64.mul - local.set $17 - local.get $17 - f32.demote_f64 + f32.sub + local.set $22 + end + local.get $23 + local.get $22 + f32.add + local.set $18 + local.get $18 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -32768 + i32.and + f32.reinterpret_i32 + local.set $18 + local.get $18 + f32.const 0.693145751953125 + f32.mul + local.set $19 + local.get $23 + local.get $18 + local.get $22 + f32.sub + f32.sub + f32.const 0.6931471824645996 + f32.mul + local.get $18 + f32.const 1.4286065379565116e-06 + f32.mul + f32.add + local.set $20 + local.get $19 + local.get $20 + f32.add + local.set $11 + local.get $20 + local.get $11 + local.get $19 + f32.sub + f32.sub + local.set $21 + local.get $11 + local.get $11 + f32.mul + local.set $18 + local.get $11 + local.get $18 + f32.const 0.1666666716337204 + local.get $18 + f32.const -2.7777778450399637e-03 + local.get $18 + f32.const 6.61375597701408e-05 + local.get $18 + f32.const -1.6533901998627698e-06 + local.get $18 + f32.const 4.138136944220605e-08 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.sub + local.set $14 + local.get $11 + local.get $14 + f32.mul + local.get $14 + f32.const 2 + f32.sub + f32.div + local.get $21 + local.get $11 + local.get $21 + f32.mul + f32.add + f32.sub + local.set $16 + f32.const 1 + local.get $16 + local.get $11 + f32.sub + f32.sub + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $7 + local.get $7 + local.get $24 + i32.const 23 + i32.shl + i32.add + local.set $7 + local.get $7 + i32.const 23 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $11 + local.get $24 + call $~lib/math/NativeMathf.scalbn + local.set $11 + else + local.get $7 + f32.reinterpret_i32 + local.set $11 end + local.get $13 + local.get $11 + f32.mul ) - (func $../../lib/libm/assembly/libmf/pow (; 107 ;) (param $0 f32) (param $1 f32) (result f32) + (func $../../lib/libm/assembly/libmf/pow (; 109 ;) (param $0 f32) (param $1 f32) (result f32) local.get $0 local.get $1 call $~lib/math/NativeMathf.pow ) - (func $../../lib/libm/assembly/libmf/round (; 108 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/round (; 110 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 @@ -10664,7 +11152,7 @@ local.get $1 f32.copysign ) - (func $../../lib/libm/assembly/libmf/sign (; 109 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/sign (; 111 ;) (param $0 f32) (result f32) (local $1 f32) block $~lib/math/NativeMathf.sign|inlined.0 (result f32) local.get $0 @@ -10687,7 +11175,7 @@ br $~lib/math/NativeMathf.sign|inlined.0 end ) - (func $~lib/math/NativeMathf.sin (; 110 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.sin (; 112 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f64) @@ -11104,7 +11592,7 @@ i32.and i64.extend_i32_s local.set $14 - i32.const 12896 + i32.const 240 local.get $13 i32.const 6 i32.shr_s @@ -11293,11 +11781,11 @@ local.get $26 end ) - (func $../../lib/libm/assembly/libmf/sin (; 111 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/sin (; 113 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.sin ) - (func $~lib/math/NativeMathf.sinh (; 112 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.sinh (; 114 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -11386,18 +11874,18 @@ local.set $3 local.get $3 ) - (func $../../lib/libm/assembly/libmf/sinh (; 113 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/sinh (; 115 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.sinh ) - (func $../../lib/libm/assembly/libmf/sqrt (; 114 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/sqrt (; 116 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 local.get $1 f32.sqrt ) - (func $~lib/math/NativeMathf.tan (; 115 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.tan (; 117 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -11878,7 +12366,7 @@ i32.and i64.extend_i32_s local.set $16 - i32.const 12896 + i32.const 240 local.get $15 i32.const 6 i32.shr_s @@ -12044,11 +12532,11 @@ end f32.demote_f64 ) - (func $../../lib/libm/assembly/libmf/tan (; 116 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/tan (; 118 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.tan ) - (func $~lib/math/NativeMathf.tanh (; 117 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.tanh (; 119 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -12134,11 +12622,11 @@ local.get $0 f32.copysign ) - (func $../../lib/libm/assembly/libmf/tanh (; 118 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/tanh (; 120 ;) (param $0 f32) (result f32) local.get $0 call $~lib/math/NativeMathf.tanh ) - (func $../../lib/libm/assembly/libmf/trunc (; 119 ;) (param $0 f32) (result f32) + (func $../../lib/libm/assembly/libmf/trunc (; 121 ;) (param $0 f32) (result f32) (local $1 f32) local.get $0 local.set $1 diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index b50f8038e5..e131578265 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -50,7 +50,6 @@ (import "Math" "cosh" (func $~lib/bindings/Math/cosh (param f64) (result f64))) (import "Math" "exp" (func $~lib/bindings/Math/exp (param f64) (result f64))) (import "Math" "expm1" (func $~lib/bindings/Math/expm1 (param f64) (result f64))) - (import "Math" "pow" (func $~lib/bindings/Math/pow (param f64 f64) (result f64))) (import "Math" "floor" (func $~lib/bindings/Math/floor (param f64) (result f64))) (import "Math" "log" (func $~lib/bindings/Math/log (param f64) (result f64))) (import "Math" "log10" (func $~lib/bindings/Math/log10 (param f64) (result f64))) @@ -59,6 +58,7 @@ (import "Math" "max" (func $~lib/bindings/Math/max (param f64 f64) (result f64))) (import "Math" "min" (func $~lib/bindings/Math/min (param f64 f64) (result f64))) (import "math" "mod" (func $std/math/mod (param f64 f64) (result f64))) + (import "Math" "pow" (func $~lib/bindings/Math/pow (param f64 f64) (result f64))) (import "Math" "random" (func $~lib/bindings/Math/random (result f64))) (import "Math" "sign" (func $~lib/bindings/Math/sign (param f64) (result f64))) (import "Math" "sin" (func $~lib/bindings/Math/sin (param f64) (result f64))) @@ -71,12 +71,8 @@ (data (i32.const 16) "\16\00\00\00\01\00\00\00\01\00\00\00\16\00\00\00s\00t\00d\00/\00m\00a\00t\00h\00.\00t\00s") (data (i32.const 64) "\c0\00\00\00\01\00\00\00\03\00\00\00\c0\00\00\00n\83\f9\a2\00\00\00\00\d1W\'\fc)\15DN\99\95b\db\c0\dd4\f5\abcQ\feA\90C<:n$\b7a\c5\bb\de\ea.I\06\e0\d2MB\1c\eb\1d\fe\1c\92\d1\t\f55\82\e8>\a7)\b1&p\9c\e9\84D\bb.9\d6\919A~_\b4\8b_\84\9c\f49S\83\ff\97\f8\1f;(\f9\bd\8b\11/\ef\0f\98\05\de\cf~6m\1fm\nZf?FO\b7\t\cb\'\c7\ba\'u-\ea_\9e\f79\07={\f1\e5\eb\b1_\fbk\ea\92R\8aF0\03V\08]\8d\1f \bc\cf\f0\abk{\fca\91\e3\a9\1d6\f4\9a_\85\99e\08\1b\e6^\80\d8\ff\8d@h\a0\14W\15\06\061\'sM") (data (i32.const 272) " \00\00\00\01\00\00\00\03\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") - (data (i32.const 321) "\08\00\00\01\00\00\00\03\00\00\00\00\08") - (data (i32.const 350) "\f0?n\bf\88\1aO;\9b<53\fb\a9=\f6\ef?]\dc\d8\9c\13`q\bca\80w>\9a\ec\ef?\d1f\87\10z^\90\bc\85\7fn\e8\15\e3\ef?\13\f6g5R\d2\8c\be\ef?m{\83]\a6\9a\97<\0f\89\f9lX\b5\ef?\fc\ef\fd\92\1a\b5\8e<\f7Gr+\92\ac\ef?\d1\9c/p=\be><\a2\d1\d32\ec\a3\ef?\0bn\90\894\03j\bc\1b\d3\fe\aff\9b\ef?\0e\bd/*RV\95\bcQ[\12\d0\01\93\ef?U\eaN\8c\ef\80P\bc\cc1l\c0\bd\8a\ef?\16\f4\d5\b9#\c9\91\bc\e0-\a9\ae\9a\82\ef?\afU\\\e9\e3\d3\80\f7\ec\9a<\aa\b9h1\87T\ef?\9d8\86\cb\82\e7\8f\bc\1d\d9\fc\"PM\ef?\8d\c3\a6DAo\8a<\d6\8cb\88;F\ef?}\04\e4\b0\05z\80<\96\dc}\91I?\ef?\94\a8\a8\e3\fd\8e\96<8bunz8\ef?}Ht\f2\18^\87\a9\af\0c\ef?\b6\ab\b0MuM\83<\15\b71\n\fe\06\ef?Lt\ac\e2\01B\86<1\d8L\fcp\01\ef?J\f8\d3]9\dd\8f<\ff\16d\b2\08\fc\ee?\04[\8e;\80\a3\86\bc\f1\9f\92_\c5\f6\ee?hPK\cc\edJ\92\bc\cb\a9:7\a7\f1\ee?\8e-Q\1b\f8\07\99\bcf\d8\05m\ae\ec\ee?\d26\94>\e8\d1q\bc\f7\9f\e54\db\e7\ee?\15\1b\ce\b3\19\19\99\bc\e5\a8\13\c3-\e3\ee?mL*\a7H\9f\85<\"4\12L\a6\de\ee?\8ai(z`\12\93\bc\1c\80\ac\04E\da\ee?[\89\17H\8f\a7X\bc*.\f7!\n\d6\ee?\1b\9aIg\9b,|\bc\97\a8P\d9\f5\d1\ee?\11\ac\c2`\edcC<-\89a`\08\ce\ee?\efd\06;\tf\96Z~d\1fx\bct_\ec\e8u\9f\ee?\b0}\8b\c0J\ee\86\bct\81\a5H\9a\9f\ee?\8a\e6U\1e2\19\86\bc\c9gBV\eb\9f\ee?\d3\d4\t^\cb\9c\90T\'\a4\ee?47;\f1\b6i\93\bc\13\ceL\99\89\a5\ee?\1e\ff\19:\84^\80\bc\ad\c7#F\1a\a7\ee?nWr\d8P\d4\94\bc\ed\92D\9b\d9\a8\ee?\00\8a\0e[g\ad\90<\99f\8a\d9\c7\aa\ee?\b4\ea\f0\c1/\b7\8d<\db\a0*B\e5\ac\ee?\ff\e7\c5\9c`\b6e\bc\8cD\b5\162\af\ee?D_\f3Y\83\f6{<6w\15\99\ae\b1\ee?\83=\1e\a7\1f\t\93\bc\c6\ff\91\0b[\b4\ee?)\1el\8b\b8\a9]\bc\e5\c5\cd\b07\b7\ee?Y\b9\90|\f9#l\bc\0fR\c8\cbD\ba\ee?\aa\f9\f4\"CC\92\bcPN\de\9f\82\bd\ee?K\8ef\d7l\ca\85\bc\ba\07\cap\f1\c0\ee?\'\ce\91+\fc\afq<\90\f0\a3\82\91\c4\ee?\bbs\n\e15\d2m<##\e3\19c\c8\ee?c\"b\"\04\c5\87\bce\e5]{f\cc\ee?\d51\e2\e3\86\1c\8b<3-J\ec\9b\d0\ee?\15\bb\bc\d3\d1\bb\91\bc]%>\b2\03\d5\ee?\d21\ee\9c1\cc\90\b4\07!\d5\82\bc_\9b{3\97|\ef?\c9\0dG;\b9*\89\bc)\a1\f5\14F\86\ef?\d3\88:`\04\b6t<\f6?\8b\e7.\90\ef?qr\9dQ\ec\c5\83<\83L\c7\fbQ\9a\ef?\f0\91\d3\8f\12\f7\8f\bc\da\90\a4\a2\af\a4\ef?}t#\e2\98\ae\8d\bc\f1g\8e-H\af\ef?\08 \aaA\bc\c3\8e<\'Za\ee\1b\ba\ef?2\eb\a9\c3\94+\84<\97\bak7+\c5\ef?\ee\85\d11\a9d\8a<@En[v\d0\ef?\ed\e3;\e4\ba7\8e\bc\14\be\9c\ad\fd\db\ef?\9d\cd\91M;\89w<\d8\90\9e\81\c1\e7\ef?\89\cc`A\c1\05S<\f1q\8f+\c2\f3\ef?") - (data (i32.const 2385) "\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\00\00\00\00\00\00\f0?t\85\15\d3\b0\d9\ef?\0f\89\f9lX\b5\ef?Q[\12\d0\01\93\ef?{Q}<\b8r\ef?\aa\b9h1\87T\ef?8bunz8\ef?\e1\de\1f\f5\9d\1e\ef?\15\b71\n\fe\06\ef?\cb\a9:7\a7\f1\ee?\"4\12L\a6\de\ee?-\89a`\08\ce\ee?\'*6\d5\da\bf\ee?\82O\9dV+\b4\ee?)TH\dd\07\ab\ee?\85U:\b0~\a4\ee?\cd;\7ff\9e\a0\ee?t_\ec\e8u\9f\ee?\87\01\ebs\14\a1\ee?\13\ceL\99\89\a5\ee?\db\a0*B\e5\ac\ee?\e5\c5\cd\b07\b7\ee?\90\f0\a3\82\91\c4\ee?]%>\b2\03\d5\ee?\ad\d3Z\99\9f\e8\ee?G^\fb\f2v\ff\ee?\9cR\85\dd\9b\19\ef?i\90\ef\dc 7\ef?\87\a4\fb\dc\18X\ef?_\9b{3\97|\ef?\da\90\a4\a2\af\a4\ef?@En[v\d0\ef?") - (data (i32.const 2657) "\01\00\00\01\00\00\00\04\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\190\96[\c6\fe\de\bf=\88\afJ\edq\f5?\a4\fc\d42h\0b\db\bf\b0\10\f0\f09\95\f4?{\b7\1f\n\8bA\d7\bf\85\03\b8\b0\95\c9\f3?{\cfm\1a\e9\9d\d3\bf\a5d\88\0c\19\0d\f3?1\b6\f2\f3\9b\1d\d0\bf\a0\8e\0b{\"^\f2?\f0z;\1b\1d|\c9\bf?4\1aJJ\bb\f1?\9f<\af\93\e3\f9\c2\bf\ba\e5\8a\f0X#\f1?\\\8dx\bf\cb`\b9\bf\a7\00\99A?\95\f0?\ce_G\b6\9do\aa\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?=\f5$\9f\ca8\b3?\a0j\02\1f\b3\a4\ec?\ba\918T\a9v\c4?\e6\fcjW6 \eb?\d2\e4\c4J\0b\84\ce?-\aa\a1c\d1\c2\e9?\1ce\c6\f0E\06\d4?\edAx\03\e6\86\e8?\f8\9f\1b,\9c\8e\d8?bHS\f5\dcg\e7?\cc{\b1N\a4\e0\dc?") - (data (i32.const 2928) "\18\00\00\00\01\00\00\00\01\00\00\00\18\00\00\00~\00l\00i\00b\00/\00m\00a\00t\00h\00.\00t\00s") - (data (i32.const 2976) "(\00\00\00\01\00\00\00\01\00\00\00(\00\00\00P\00R\00N\00G\00 \00m\00u\00s\00t\00 \00b\00e\00 \00s\00e\00e\00d\00e\00d\00.") + (data (i32.const 320) "\18\00\00\00\01\00\00\00\01\00\00\00\18\00\00\00~\00l\00i\00b\00/\00m\00a\00t\00h\00.\00t\00s") + (data (i32.const 368) "(\00\00\00\01\00\00\00\01\00\00\00(\00\00\00P\00R\00N\00G\00 \00m\00u\00s\00t\00 \00b\00e\00 \00s\00e\00e\00d\00e\00d\00.") (global $~lib/math/rempio2_y0 (mut f64) (f64.const 0)) (global $~lib/math/rempio2_y1 (mut f64) (f64.const 0)) (global $~lib/math/res128_hi (mut i64) (i64.const 0)) @@ -5218,332 +5214,7 @@ local.get $2 call $std/math/check ) - (func $~lib/math/NativeMath.exp2 (; 99 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 i32) - (local $4 f64) - (local $5 f64) - (local $6 i64) - (local $7 i32) - block $~lib/util/math/exp2_lut|inlined.0 (result f64) - local.get $0 - i64.reinterpret_f64 - local.tee $2 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - i32.wrap_i64 - local.tee $3 - i32.const 969 - i32.sub - i32.const 63 - i32.ge_u - if - f64.const 1 - local.get $3 - i32.const 969 - i32.sub - i32.const -2147483648 - i32.ge_u - br_if $~lib/util/math/exp2_lut|inlined.0 - drop - local.get $3 - i32.const 1033 - i32.ge_u - if - f64.const 0 - local.get $2 - i64.const -4503599627370496 - i64.eq - br_if $~lib/util/math/exp2_lut|inlined.0 - drop - f64.const 1 - local.get $0 - f64.add - local.get $3 - i32.const 2047 - i32.ge_u - br_if $~lib/util/math/exp2_lut|inlined.0 - drop - f64.const inf - local.get $2 - i64.const 63 - i64.shr_u - i64.eqz - br_if $~lib/util/math/exp2_lut|inlined.0 - drop - f64.const 0 - local.get $2 - i64.const -4570929321408987136 - i64.ge_u - br_if $~lib/util/math/exp2_lut|inlined.0 - drop - end - i32.const 0 - local.get $3 - local.get $2 - i64.const 1 - i64.shl - i64.const -9143996093422370816 - i64.gt_u - select - local.set $3 - end - local.get $0 - f64.const 52776558133248 - f64.add - local.tee $1 - f64.const 52776558133248 - f64.sub - local.set $4 - local.get $1 - i64.reinterpret_f64 - local.tee $6 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - i32.const 3 - i32.shl - i32.const 336 - i32.add - local.tee $7 - i64.load - f64.reinterpret_i64 - local.get $7 - i64.load offset=8 - local.get $6 - i64.const 45 - i64.shl - i64.add - local.set $2 - local.get $0 - local.get $4 - f64.sub - local.tee $0 - local.get $0 - f64.mul - local.set $1 - local.get $0 - f64.const 0.6931471805599453 - f64.mul - f64.add - local.get $1 - f64.const 0.24022650695909065 - local.get $0 - f64.const 0.0555041086686087 - f64.mul - f64.add - f64.mul - f64.add - local.get $1 - local.get $1 - f64.mul - f64.const 0.009618131975721055 - local.get $0 - f64.const 1.3332074570119598e-03 - f64.mul - f64.add - f64.mul - f64.add - local.set $0 - local.get $3 - i32.eqz - if - block $~lib/util/math/specialcase2|inlined.0 (result f64) - local.get $6 - i64.const 2147483648 - i64.and - i64.eqz - if - f64.const 2 - local.get $2 - i64.const 4503599627370496 - i64.sub - f64.reinterpret_i64 - local.tee $1 - local.get $0 - f64.mul - local.get $1 - f64.add - f64.mul - br $~lib/util/math/specialcase2|inlined.0 - end - local.get $2 - i64.const 4602678819172646912 - i64.add - f64.reinterpret_i64 - local.tee $4 - local.get $0 - f64.mul - local.get $4 - f64.add - local.tee $1 - f64.const 1 - f64.lt - if (result f64) - f64.const 1 - f64.const 1 - local.get $1 - f64.add - local.tee $5 - f64.sub - local.get $1 - f64.add - local.get $4 - local.get $1 - f64.sub - local.get $4 - local.get $0 - f64.mul - f64.add - f64.add - local.set $0 - local.get $5 - local.get $0 - f64.add - f64.const 1 - f64.sub - else - local.get $1 - end - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp2_lut|inlined.0 - end - local.get $2 - f64.reinterpret_i64 - local.tee $1 - local.get $0 - f64.mul - local.get $1 - f64.add - end - ) - (func $std/math/test_exp2 (; 100 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) - local.get $0 - call $~lib/math/NativeMath.exp2 - local.get $1 - local.get $2 - call $std/math/check - if (result i32) - f64.const 2 - local.get $0 - call $~lib/bindings/Math/pow - local.get $1 - local.get $2 - call $std/math/check - else - i32.const 0 - end - ) - (func $~lib/math/NativeMathf.exp2 (; 101 ;) (param $0 f32) (result f32) - (local $1 f64) - (local $2 i64) - (local $3 i32) - (local $4 i32) - (local $5 f64) - block $~lib/util/math/exp2f_lut|inlined.0 (result f32) - local.get $0 - f64.promote_f32 - local.set $1 - local.get $0 - i32.reinterpret_f32 - local.tee $3 - i32.const 20 - i32.shr_u - i32.const 2047 - i32.and - local.tee $4 - i32.const 1072 - i32.ge_u - if - f32.const 0 - local.get $3 - i32.const -8388608 - i32.eq - br_if $~lib/util/math/exp2f_lut|inlined.0 - drop - local.get $0 - local.get $0 - f32.add - local.get $4 - i32.const 2040 - i32.ge_u - br_if $~lib/util/math/exp2f_lut|inlined.0 - drop - local.get $0 - f32.const 1701411834604692317316873e14 - f32.mul - local.get $0 - f32.const 0 - f32.gt - br_if $~lib/util/math/exp2f_lut|inlined.0 - drop - f32.const 0 - local.get $0 - f32.const -150 - f32.le - br_if $~lib/util/math/exp2f_lut|inlined.0 - drop - end - local.get $1 - f64.const 211106232532992 - f64.add - local.tee $5 - i64.reinterpret_f64 - local.tee $2 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl - i32.const 2400 - i32.add - i64.load - local.get $2 - i64.const 47 - i64.shl - i64.add - local.set $2 - f64.const 0.6931471806916203 - local.get $1 - local.get $5 - f64.const 211106232532992 - f64.sub - f64.sub - local.tee $1 - f64.mul - f64.const 1 - f64.add - f64.const 0.05550361559341535 - local.get $1 - f64.mul - f64.const 0.2402284522445722 - f64.add - local.get $1 - local.get $1 - f64.mul - f64.mul - f64.add - local.get $2 - f64.reinterpret_i64 - f64.mul - f32.demote_f64 - end - ) - (func $std/math/test_exp2f (; 102 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) - local.get $0 - call $~lib/math/NativeMathf.exp2 - local.get $1 - local.get $2 - call $std/math/check - ) - (func $std/math/test_floor (; 103 ;) (param $0 f64) (param $1 f64) (result i32) + (func $std/math/test_floor (; 99 ;) (param $0 f64) (param $1 f64) (result i32) local.get $0 f64.floor local.get $1 @@ -5559,14 +5230,14 @@ i32.const 0 end ) - (func $std/math/test_floorf (; 104 ;) (param $0 f32) (param $1 f32) (result i32) + (func $std/math/test_floorf (; 100 ;) (param $0 f32) (param $1 f32) (result i32) local.get $0 f32.floor local.get $1 f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.hypot (; 105 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.hypot (; 101 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) (local $3 i64) (local $4 i64) @@ -5735,7 +5406,7 @@ f64.sqrt f64.mul ) - (func $std/math/test_hypot (; 106 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (result i32) + (func $std/math/test_hypot (; 102 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.hypot @@ -5743,7 +5414,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMathf.hypot (; 107 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.hypot (; 103 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 f32) @@ -5848,7 +5519,7 @@ f32.sqrt f32.mul ) - (func $std/math/test_hypotf (; 108 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (result i32) + (func $std/math/test_hypotf (; 104 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.hypot @@ -5856,7 +5527,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_log (; 109 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_log (; 105 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.log local.get $1 @@ -5872,14 +5543,14 @@ i32.const 0 end ) - (func $std/math/test_logf (; 110 ;) (param $0 f32) (param $1 f32) (result i32) + (func $std/math/test_logf (; 106 ;) (param $0 f32) (param $1 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.log local.get $1 f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.log10 (; 111 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.log10 (; 107 ;) (param $0 f64) (result f64) (local $1 f64) (local $2 i32) (local $3 i64) @@ -6081,7 +5752,7 @@ local.get $1 f64.add ) - (func $std/math/test_log10 (; 112 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_log10 (; 108 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.log10 local.get $1 @@ -6097,7 +5768,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.log10 (; 113 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.log10 (; 109 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -6255,14 +5926,14 @@ f32.mul f32.add ) - (func $std/math/test_log10f (; 114 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_log10f (; 110 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.log10 local.get $1 local.get $2 call $std/math/check ) - (func $std/math/test_log1p (; 115 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_log1p (; 111 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.log1p local.get $1 @@ -6278,14 +5949,14 @@ i32.const 0 end ) - (func $std/math/test_log1pf (; 116 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_log1pf (; 112 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.log1p local.get $1 local.get $2 call $std/math/check ) - (func $~lib/math/NativeMath.log2 (; 117 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.log2 (; 113 ;) (param $0 f64) (result f64) (local $1 f64) (local $2 i32) (local $3 i64) @@ -6480,7 +6151,7 @@ local.get $1 f64.add ) - (func $std/math/test_log2 (; 118 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_log2 (; 114 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.log2 local.get $1 @@ -6496,7 +6167,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.log2 (; 119 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.log2 (; 115 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -6646,14 +6317,14 @@ f32.convert_i32_s f32.add ) - (func $std/math/test_log2f (; 120 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_log2f (; 116 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.log2 local.get $1 local.get $2 call $std/math/check ) - (func $std/math/test_max (; 121 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_max (; 117 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 local.get $1 f64.max @@ -6671,7 +6342,7 @@ i32.const 0 end ) - (func $std/math/test_maxf (; 122 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_maxf (; 118 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 local.get $1 f32.max @@ -6679,7 +6350,7 @@ f32.const 0 call $std/math/check ) - (func $std/math/test_min (; 123 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_min (; 119 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 local.get $1 f64.min @@ -6697,7 +6368,7 @@ i32.const 0 end ) - (func $std/math/test_minf (; 124 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_minf (; 120 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 local.get $1 f32.min @@ -6705,7 +6376,7 @@ f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.mod (; 125 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.mod (; 121 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 i64) (local $3 i64) (local $4 i64) @@ -6908,7 +6579,7 @@ local.get $0 f64.mul ) - (func $std/math/test_mod (; 126 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_mod (; 122 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.mod @@ -6926,7 +6597,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.mod (; 127 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.mod (; 123 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -7118,7 +6789,7 @@ local.get $0 f32.mul ) - (func $std/math/test_modf (; 128 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_modf (; 124 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.mod @@ -7126,7 +6797,7 @@ f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.pow (; 129 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.pow (; 125 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) (local $3 f64) (local $4 i32) @@ -8082,7 +7753,7 @@ f64.const 1e-300 f64.mul ) - (func $std/math/test_pow (; 130 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (result i32) + (func $std/math/test_pow (; 126 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.pow @@ -8100,15 +7771,22 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.pow (; 131 ;) (param $0 f32) (param $1 f32) (result f32) - (local $2 i32) - (local $3 i32) - (local $4 f64) + (func $~lib/math/NativeMathf.pow (; 127 ;) (param $0 f32) (param $1 f32) (result f32) + (local $2 f32) + (local $3 f32) + (local $4 i32) (local $5 i32) - (local $6 f64) + (local $6 i32) (local $7 i32) - (local $8 i64) - (local $9 f64) + (local $8 f32) + (local $9 i32) + (local $10 i32) + (local $11 f32) + (local $12 i32) + (local $13 f32) + (local $14 f32) + (local $15 f32) + (local $16 f32) local.get $1 f32.abs f32.const 2 @@ -8161,404 +7839,775 @@ return end end - block $~lib/util/math/powf_lut|inlined.0 - local.get $1 - i32.reinterpret_f32 - local.tee $3 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - i32.const 0 - i32.ne - local.tee $5 + local.get $0 + i32.reinterpret_f32 + local.tee $7 + i32.const 2147483647 + i32.and + local.set $4 + local.get $1 + i32.reinterpret_f32 + local.tee $10 + i32.const 2147483647 + i32.and + local.tee $9 + i32.eqz + if + f32.const 1 + return + end + i32.const 1 + local.get $9 + i32.const 2139095040 + i32.gt_s + local.get $4 + i32.const 2139095040 + i32.gt_s + select + if local.get $0 - i32.reinterpret_f32 - local.tee $2 - i32.const 8388608 - i32.sub - i32.const 2130706432 - i32.ge_u - i32.or - if - local.get $5 - if - local.get $3 - i32.const 1 - i32.shl - i32.eqz - if - f32.const 1 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - i32.const 1065353216 - i32.eq - if - f32.const nan:0x400000 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - i32.const 1 - local.get $3 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - local.get $2 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - select - if - local.get $0 - local.get $1 - f32.add - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - i32.const 1 - i32.shl - i32.const 2130706432 - i32.eq - if - f32.const nan:0x400000 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $3 - i32.const 31 - i32.shr_u - i32.eqz - local.get $2 - i32.const 1 + local.get $1 + f32.add + return + end + local.get $7 + i32.const 0 + i32.lt_s + if + local.get $9 + i32.const 1266679808 + i32.ge_s + if (result i32) + i32.const 2 + else + local.get $9 + i32.const 1065353216 + i32.ge_s + if (result i32) + local.get $9 + local.get $9 + i32.const 150 + local.get $9 + i32.const 23 + i32.shr_s + i32.sub + local.tee $12 + i32.shr_s + local.tee $5 + local.get $12 i32.shl - i32.const 2130706432 - i32.lt_u i32.eq - if - f32.const 0 - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $1 - local.get $1 - f32.mul - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - if - local.get $0 - local.get $0 - f32.mul - local.set $0 - local.get $2 - i32.const 31 - i32.shr_u if (result i32) - block $~lib/util/math/checkintf|inlined.0 (result i32) - i32.const 0 - local.get $3 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.tee $2 - i32.const 127 - i32.lt_u - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 2 - local.get $2 - i32.const 150 - i32.gt_u - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 0 - local.get $3 - i32.const 1 - i32.const 150 - local.get $2 - i32.sub - i32.shl - local.tee $2 - i32.const 1 - i32.sub - i32.and - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 1 - local.get $2 - local.get $3 - i32.and - br_if $~lib/util/math/checkintf|inlined.0 - drop - i32.const 2 - end + i32.const 2 + local.get $5 i32.const 1 - i32.eq + i32.and + i32.sub else i32.const 0 end - if - local.get $0 - f32.neg - local.set $0 - end - local.get $3 - i32.const 31 - i32.shr_u - if - f32.const 1 - local.get $0 - f32.div - local.set $0 - end - br $~lib/util/math/powf_lut|inlined.0 + else + i32.const 0 end - local.get $2 - i32.const 31 - i32.shr_u + end + local.set $6 + end + local.get $9 + i32.const 2139095040 + i32.eq + if + local.get $4 + i32.const 1065353216 + i32.eq + if + f32.const nan:0x400000 + return + else + local.get $4 + i32.const 1065353216 + i32.gt_s if - block $~lib/util/math/checkintf|inlined.1 (result i32) - i32.const 0 - local.get $3 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.tee $5 - i32.const 127 - i32.lt_u - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 2 - local.get $5 - i32.const 150 - i32.gt_u - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 0 - local.get $3 - i32.const 1 - i32.const 150 - local.get $5 - i32.sub - i32.shl - local.tee $5 - i32.const 1 - i32.sub - i32.and - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 1 - local.get $3 - local.get $5 - i32.and - br_if $~lib/util/math/checkintf|inlined.1 - drop - i32.const 2 - end - local.tee $3 - i32.eqz + local.get $10 + i32.const 0 + i32.lt_s if - local.get $0 - local.get $0 - f32.sub - local.tee $0 - local.get $0 - f32.div - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 + f32.const 0 + local.set $1 end - i32.const 65536 + local.get $1 + return + else + f32.const 0 + local.get $1 + f32.neg + local.get $10 i32.const 0 + i32.ge_s + select + return + end + unreachable + end + unreachable + end + local.get $9 + i32.const 1065353216 + i32.eq + if + local.get $10 + i32.const 0 + i32.lt_s + if + f32.const 1 + local.get $0 + f32.div + local.set $0 + end + local.get $0 + return + end + local.get $10 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $10 + i32.const 1056964608 + i32.eq + if + local.get $7 + i32.const 0 + i32.ge_s + if + local.get $0 + f32.sqrt + return + end + end + local.get $0 + f32.abs + local.set $3 + i32.const 1 + local.get $4 + i32.const 1065353216 + i32.eq + i32.const 1 + local.get $4 + i32.eqz + local.get $4 + i32.const 2139095040 + i32.eq + select + select + if + f32.const 1 + local.get $3 + f32.div + local.get $3 + local.get $10 + i32.const 0 + i32.lt_s + select + local.set $3 + local.get $7 + i32.const 0 + i32.lt_s + if (result f32) + local.get $6 + local.get $4 + i32.const 1065353216 + i32.sub + i32.or + if (result f32) local.get $3 + f32.neg + local.get $3 + local.get $6 i32.const 1 i32.eq select - local.set $7 - local.get $2 - i32.const 2147483647 - i32.and - local.set $2 - end - local.get $2 - i32.const 8388608 - i32.lt_u - if + else + local.get $3 + local.get $3 + f32.sub + local.tee $0 local.get $0 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - i32.const 2147483647 - i32.and - i32.const 192937984 - i32.sub - local.set $2 + f32.div end + else + local.get $3 + end + return + end + f32.const 1 + local.set $11 + local.get $7 + i32.const 0 + i32.lt_s + if + local.get $6 + i32.eqz + if + local.get $0 + local.get $0 + f32.sub + local.tee $0 + local.get $0 + f32.div + return + end + f32.const -1 + f32.const 1 + local.get $6 + i32.const 1 + i32.eq + select + local.set $11 + end + local.get $9 + i32.const 1291845632 + i32.gt_s + if (result f32) + local.get $4 + i32.const 1065353208 + i32.lt_s + if + local.get $11 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + local.get $11 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + local.get $10 + i32.const 0 + i32.lt_s + select + return end - f64.const 1.4426950408774342 + local.get $4 + i32.const 1065353223 + i32.gt_s + if + local.get $11 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + local.get $11 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + local.get $10 + i32.const 0 + i32.gt_s + select + return + end + local.get $3 + f32.const 1 + f32.sub + local.tee $2 local.get $2 + f32.mul + f32.const 0.5 local.get $2 - i32.const 1060306944 - i32.sub + f32.const 0.3333333432674408 + local.get $2 + f32.const 0.25 + f32.mul + f32.sub + f32.mul + f32.sub + f32.mul + local.set $0 + f32.const 1.44268798828125 + local.get $2 + f32.mul local.tee $3 - i32.const -8388608 + local.get $2 + f32.const 7.052607543300837e-06 + f32.mul + local.get $0 + f32.const 1.4426950216293335 + f32.mul + f32.sub + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 i32.and - local.tee $2 + f32.reinterpret_i32 + local.set $8 + local.get $0 + local.get $8 + local.get $3 + f32.sub + f32.sub + else + i32.const 0 + local.set $6 + local.get $4 + i32.const 8388608 + i32.lt_s + if (result i32) + local.get $3 + f32.const 16777216 + f32.mul + i32.reinterpret_f32 + local.set $4 + i32.const -24 + else + i32.const 0 + end + local.get $4 + i32.const 23 + i32.shr_s + i32.const 127 i32.sub + i32.add + local.set $6 + local.get $4 + i32.const 8388607 + i32.and + local.tee $5 + i32.const 1065353216 + i32.or + local.set $4 + local.get $5 + i32.const 1885297 + i32.le_s + if (result i32) + i32.const 0 + else + local.get $5 + i32.const 6140887 + 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 8388608 + i32.sub + local.set $4 + i32.const 0 + end + end + local.set $5 + local.get $4 f32.reinterpret_i32 - f64.promote_f32 + local.tee $3 + f32.const 1.5 + f32.const 1 + local.get $5 + select + local.tee $0 + f32.sub + local.tee $8 + f32.const 1 local.get $3 - i32.const 19 - i32.shr_u - i32.const 15 + local.get $0 + f32.add + f32.div + local.tee $2 + f32.mul + local.tee $15 + i32.reinterpret_f32 + i32.const -4096 i32.and - i32.const 4 + f32.reinterpret_i32 + local.set $13 + local.get $3 + local.get $4 + i32.const 1 + i32.shr_s + i32.const -4096 + i32.and + i32.const 536870912 + i32.or + i32.const 4194304 + i32.add + local.get $5 + i32.const 21 i32.shl - i32.const 2672 i32.add + f32.reinterpret_i32 local.tee $3 - f64.load - f64.mul - f64.const 1 - f64.sub - local.tee $4 - f64.mul + local.get $0 + f32.sub + f32.sub + local.set $0 + f32.const 0.9619140625 + local.get $13 + f32.const 3 + local.get $13 + local.get $13 + f32.mul + local.tee $16 + f32.add + local.get $15 + local.get $15 + f32.mul + local.tee $14 + local.get $14 + f32.mul + f32.const 0.6000000238418579 + local.get $14 + f32.const 0.4285714328289032 + local.get $14 + f32.const 0.3333333432674408 + local.get $14 + f32.const 0.2727281153202057 + local.get $14 + f32.const 0.23066075146198273 + local.get $14 + f32.const 0.20697501301765442 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + local.get $2 + local.get $8 + local.get $13 local.get $3 - f64.load offset=8 + f32.mul + f32.sub + local.get $13 + local.get $0 + f32.mul + f32.sub + f32.mul + local.tee $2 + local.get $13 + local.get $15 + f32.add + f32.mul + f32.add + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.tee $8 + f32.mul + local.tee $3 local.get $2 - i32.const 23 - i32.shr_s - f64.convert_i32_s - f64.add - f64.add - f64.const 0.480898481472577 - local.get $4 - f64.mul - f64.const -0.7213474675006291 - f64.add - local.get $4 - local.get $4 - f64.mul - local.tee $6 - f64.mul - f64.add - local.set $9 - local.get $1 - f64.promote_f32 - f64.const 0.288457581109214 - local.get $4 - f64.mul - f64.const -0.36092606229713164 - f64.add - local.get $6 + local.get $8 + f32.mul + local.get $0 + local.get $8 + f32.const 3 + f32.sub + local.get $16 + f32.sub + f32.sub + local.get $15 + f32.mul + f32.add + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.tee $2 + f32.mul + local.tee $16 + f32.const -1.1736857413779944e-04 + local.get $2 + f32.mul + local.get $0 + local.get $2 + local.get $3 + f32.sub + f32.sub + f32.const 0.9617967009544373 + f32.mul + f32.add + f32.const 1.5632208487659227e-06 + f32.const 0 + local.get $5 + select + f32.add + local.tee $2 + f32.add + f32.const 0.5849609375 + f32.const 0 + local.get $5 + select + local.tee $3 + f32.add local.get $6 - f64.mul - f64.mul - local.get $9 - f64.add - f64.mul - local.tee $4 - i64.reinterpret_f64 - i64.const 47 - i64.shr_u - i64.const 65535 - i64.and - i64.const 32959 - i64.ge_u - if - local.get $4 - f64.const 127.99999995700433 - f64.gt + f32.convert_i32_s + local.tee $0 + f32.add + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $8 + local.get $2 + local.get $8 + local.get $0 + f32.sub + local.get $3 + f32.sub + local.get $16 + f32.sub + f32.sub + end + local.set $3 + block $folding-inner1 + block $folding-inner0 + local.get $1 + local.get $1 + i32.reinterpret_f32 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.tee $0 + f32.sub + local.get $8 + f32.mul + local.get $1 + local.get $3 + f32.mul + f32.add + local.tee $1 + local.get $0 + local.get $8 + f32.mul + local.tee $2 + f32.add + local.tee $0 + i32.reinterpret_f32 + local.tee $7 + i32.const 1124073472 + i32.gt_s + br_if $folding-inner0 + local.get $7 + i32.const 1124073472 + i32.eq if - f32.const -1584563250285286751870879e5 - f32.const 1584563250285286751870879e5 + local.get $1 + f32.const 4.299566569443414e-08 + f32.add + local.get $0 + local.get $2 + f32.sub + f32.gt + br_if $folding-inner0 + else local.get $7 - select - f32.const 1584563250285286751870879e5 - f32.mul - local.set $0 - br $~lib/util/math/powf_lut|inlined.0 + i32.const 2147483647 + i32.and + i32.const 1125515264 + i32.gt_s + if + br $folding-inner1 + else + local.get $7 + i32.const -1021968384 + i32.eq + i32.const 0 + local.get $1 + local.get $0 + local.get $2 + f32.sub + f32.le + select + br_if $folding-inner1 + end end - local.get $4 - f64.const -150 - f64.le + local.get $7 + i32.const 2147483647 + i32.and + local.tee $12 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $5 + i32.const 0 + local.set $6 + local.get $12 + i32.const 1056964608 + i32.gt_s if - f32.const -2.524354896707238e-29 - f32.const 2.524354896707238e-29 + i32.const 8388607 local.get $7 - select - f32.const 2.524354896707238e-29 - f32.mul + i32.const 8388608 + local.get $5 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.tee $12 + i32.const 2147483647 + i32.and + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.tee $5 + i32.shr_s + i32.const -1 + i32.xor + local.get $12 + i32.and + f32.reinterpret_i32 local.set $0 - br $~lib/util/math/powf_lut|inlined.0 + i32.const 0 + local.get $12 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + i32.const 23 + local.get $5 + i32.sub + i32.shr_s + local.tee $6 + i32.sub + local.get $6 + local.get $7 + i32.const 0 + i32.lt_s + select + local.set $6 + local.get $2 + local.get $0 + f32.sub + local.set $2 + end + local.get $1 + local.get $2 + f32.add + i32.reinterpret_f32 + i32.const -32768 + i32.and + f32.reinterpret_i32 + local.tee $0 + f32.const 0.693145751953125 + f32.mul + local.tee $3 + local.get $1 + local.get $0 + local.get $2 + f32.sub + f32.sub + f32.const 0.6931471824645996 + f32.mul + local.get $0 + f32.const 1.4286065379565116e-06 + f32.mul + f32.add + local.tee $1 + f32.add + local.tee $2 + local.get $2 + f32.mul + local.set $0 + local.get $11 + f32.const 1 + local.get $2 + local.get $2 + local.get $0 + f32.const 0.1666666716337204 + local.get $0 + f32.const -2.7777778450399637e-03 + local.get $0 + f32.const 6.61375597701408e-05 + local.get $0 + f32.const -1.6533901998627698e-06 + local.get $0 + f32.const 4.138136944220605e-08 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.sub + local.tee $0 + f32.mul + local.get $0 + f32.const 2 + f32.sub + f32.div + local.get $1 + local.get $2 + local.get $3 + f32.sub + f32.sub + local.tee $0 + local.get $2 + local.get $0 + f32.mul + f32.add + f32.sub + local.get $2 + f32.sub + f32.sub + local.tee $0 + i32.reinterpret_f32 + local.get $6 + i32.const 23 + i32.shl + i32.add + local.tee $5 + i32.const 23 + i32.shr_s + i32.const 0 + i32.le_s + if (result f32) + local.get $0 + local.get $6 + call $~lib/math/NativeMathf.scalbn + else + local.get $5 + f32.reinterpret_i32 end + f32.mul + return end - local.get $4 - f64.const 211106232532992 - f64.add - local.tee $6 - i64.reinterpret_f64 - local.tee $8 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl - i32.const 2400 - i32.add - i64.load - local.get $8 - local.get $7 - i64.extend_i32_u - i64.add - i64.const 47 - i64.shl - i64.add - local.set $8 - f64.const 0.6931471806916203 - local.get $4 - local.get $6 - f64.const 211106232532992 - f64.sub - f64.sub - local.tee $4 - f64.mul - f64.const 1 - f64.add - f64.const 0.05550361559341535 - local.get $4 - f64.mul - f64.const 0.2402284522445722 - f64.add - local.get $4 - local.get $4 - f64.mul - f64.mul - f64.add - local.get $8 - f64.reinterpret_i64 - f64.mul - f32.demote_f64 - local.set $0 + local.get $11 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + return end - local.get $0 + local.get $11 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul ) - (func $std/math/test_powf (; 132 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (result i32) + (func $std/math/test_powf (; 128 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.pow @@ -8566,7 +8615,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/murmurHash3 (; 133 ;) (param $0 i64) (result i64) + (func $~lib/math/murmurHash3 (; 129 ;) (param $0 i64) (result i64) local.get $0 local.get $0 i64.const 33 @@ -8587,7 +8636,7 @@ i64.shr_u i64.xor ) - (func $~lib/math/splitMix32 (; 134 ;) (param $0 i32) (result i32) + (func $~lib/math/splitMix32 (; 130 ;) (param $0 i32) (result i32) local.get $0 i32.const 1831565813 i32.add @@ -8619,7 +8668,7 @@ i32.shr_u i32.xor ) - (func $~lib/math/NativeMath.seedRandom (; 135 ;) (param $0 i64) + (func $~lib/math/NativeMath.seedRandom (; 131 ;) (param $0 i64) i32.const 1 global.set $~lib/math/random_seeded local.get $0 @@ -8656,22 +8705,22 @@ i32.eqz if i32.const 0 - i32.const 2944 - i32.const 1406 + i32.const 336 + i32.const 1411 i32.const 4 call $~lib/builtins/abort unreachable end ) - (func $~lib/math/NativeMath.random (; 136 ;) (result f64) + (func $~lib/math/NativeMath.random (; 132 ;) (result f64) (local $0 i64) (local $1 i64) global.get $~lib/math/random_seeded i32.eqz if - i32.const 2992 - i32.const 2944 - i32.const 1413 + i32.const 384 + i32.const 336 + i32.const 1418 i32.const 24 call $~lib/builtins/abort unreachable @@ -8707,15 +8756,15 @@ f64.const 1 f64.sub ) - (func $~lib/math/NativeMathf.random (; 137 ;) (result f32) + (func $~lib/math/NativeMathf.random (; 133 ;) (result f32) (local $0 i32) (local $1 i32) global.get $~lib/math/random_seeded i32.eqz if - i32.const 2992 - i32.const 2944 - i32.const 2606 + i32.const 384 + i32.const 336 + i32.const 2800 i32.const 24 call $~lib/builtins/abort unreachable @@ -8753,7 +8802,7 @@ f32.const 1 f32.sub ) - (func $std/math/test_round (; 138 ;) (param $0 f64) (param $1 f64) (result i32) + (func $std/math/test_round (; 134 ;) (param $0 f64) (param $1 f64) (result i32) local.get $0 f64.const 0.5 f64.add @@ -8764,7 +8813,7 @@ f64.const 0 call $std/math/check ) - (func $std/math/test_roundf (; 139 ;) (param $0 f32) (param $1 f32) (result i32) + (func $std/math/test_roundf (; 135 ;) (param $0 f32) (param $1 f32) (result i32) local.get $0 f32.const 0.5 f32.add @@ -8775,7 +8824,7 @@ f32.const 0 call $std/math/check ) - (func $std/math/test_sign (; 140 ;) (param $0 f64) (param $1 f64) (result i32) + (func $std/math/test_sign (; 136 ;) (param $0 f64) (param $1 f64) (result i32) f64.const 1 local.get $0 f64.copysign @@ -8798,7 +8847,7 @@ i32.const 0 end ) - (func $std/math/test_signf (; 141 ;) (param $0 f32) (param $1 f32) (result i32) + (func $std/math/test_signf (; 137 ;) (param $0 f32) (param $1 f32) (result i32) f32.const 1 local.get $0 f32.copysign @@ -8812,7 +8861,7 @@ f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.rem (; 142 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.rem (; 138 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 i64) (local $3 i64) (local $4 i64) @@ -9061,7 +9110,7 @@ end local.get $0 ) - (func $std/math/test_rem (; 143 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_rem (; 139 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.rem @@ -9069,7 +9118,7 @@ f64.const 0 call $std/math/check ) - (func $~lib/math/NativeMathf.rem (; 144 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.rem (; 140 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9310,7 +9359,7 @@ end local.get $0 ) - (func $std/math/test_remf (; 145 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_remf (; 141 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.rem @@ -9318,7 +9367,7 @@ f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.sin (; 146 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.sin (; 142 ;) (param $0 f64) (result f64) (local $1 f64) (local $2 f64) (local $3 f64) @@ -9638,7 +9687,7 @@ end local.get $0 ) - (func $std/math/test_sin (; 147 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_sin (; 143 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.sin local.get $1 @@ -9654,7 +9703,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.sin (; 148 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.sin (; 144 ;) (param $0 f32) (result f32) (local $1 f64) (local $2 i32) (local $3 f64) @@ -9924,14 +9973,14 @@ end local.get $0 ) - (func $std/math/test_sinf (; 149 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_sinf (; 145 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.sin local.get $1 local.get $2 call $std/math/check ) - (func $~lib/math/NativeMath.sinh (; 150 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.sinh (; 146 ;) (param $0 f64) (result f64) (local $1 f64) (local $2 f64) (local $3 i32) @@ -10008,7 +10057,7 @@ f64.mul f64.mul ) - (func $std/math/test_sinh (; 151 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_sinh (; 147 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.sinh local.get $1 @@ -10024,7 +10073,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.sinh (; 152 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.sinh (; 148 ;) (param $0 f32) (result f32) (local $1 f32) (local $2 i32) (local $3 f32) @@ -10096,14 +10145,14 @@ f32.mul f32.mul ) - (func $std/math/test_sinhf (; 153 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_sinhf (; 149 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.sinh local.get $1 local.get $2 call $std/math/check ) - (func $std/math/test_sqrt (; 154 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_sqrt (; 150 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 f64.sqrt local.get $1 @@ -10119,14 +10168,14 @@ i32.const 0 end ) - (func $std/math/test_sqrtf (; 155 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_sqrtf (; 151 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 f32.sqrt local.get $1 local.get $2 call $std/math/check ) - (func $~lib/math/tan_kern (; 156 ;) (param $0 f64) (param $1 f64) (param $2 i32) (result f64) + (func $~lib/math/tan_kern (; 152 ;) (param $0 f64) (param $1 f64) (param $2 i32) (result f64) (local $3 f64) (local $4 f64) (local $5 f64) @@ -10308,7 +10357,7 @@ f64.mul f64.add ) - (func $~lib/math/NativeMath.tan (; 157 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.tan (; 153 ;) (param $0 f64) (result f64) (local $1 f64) (local $2 i32) (local $3 f64) @@ -10485,7 +10534,7 @@ i32.sub call $~lib/math/tan_kern ) - (func $std/math/test_tan (; 158 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_tan (; 154 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.tan local.get $1 @@ -10501,7 +10550,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.tan (; 159 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.tan (; 155 ;) (param $0 f32) (result f32) (local $1 f64) (local $2 i32) (local $3 f64) @@ -10755,14 +10804,14 @@ local.get $1 f32.demote_f64 ) - (func $std/math/test_tanf (; 160 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_tanf (; 156 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.tan local.get $1 local.get $2 call $std/math/check ) - (func $~lib/math/NativeMath.tanh (; 161 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.tanh (; 157 ;) (param $0 f64) (result f64) (local $1 f64) (local $2 i32) (local $3 i64) @@ -10841,7 +10890,7 @@ local.get $0 f64.copysign ) - (func $std/math/test_tanh (; 162 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) + (func $std/math/test_tanh (; 158 ;) (param $0 f64) (param $1 f64) (param $2 f64) (result i32) local.get $0 call $~lib/math/NativeMath.tanh local.get $1 @@ -10857,7 +10906,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.tanh (; 163 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.tanh (; 159 ;) (param $0 f32) (result f32) (local $1 f32) (local $2 i32) local.get $0 @@ -10931,14 +10980,14 @@ local.get $0 f32.copysign ) - (func $std/math/test_tanhf (; 164 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) + (func $std/math/test_tanhf (; 160 ;) (param $0 f32) (param $1 f32) (param $2 f32) (result i32) local.get $0 call $~lib/math/NativeMathf.tanh local.get $1 local.get $2 call $std/math/check ) - (func $std/math/test_trunc (; 165 ;) (param $0 f64) (param $1 f64) (result i32) + (func $std/math/test_trunc (; 161 ;) (param $0 f64) (param $1 f64) (result i32) local.get $0 f64.trunc local.get $1 @@ -10954,14 +11003,14 @@ i32.const 0 end ) - (func $std/math/test_truncf (; 166 ;) (param $0 f32) (param $1 f32) (result i32) + (func $std/math/test_truncf (; 162 ;) (param $0 f32) (param $1 f32) (result i32) local.get $0 f32.trunc local.get $1 f32.const 0 call $std/math/check ) - (func $~lib/math/NativeMath.sincos (; 167 ;) (param $0 f64) + (func $~lib/math/NativeMath.sincos (; 163 ;) (param $0 f64) (local $1 f64) (local $2 f64) (local $3 f64) @@ -11356,7 +11405,7 @@ local.get $1 global.set $~lib/math/NativeMath.sincos_cos ) - (func $std/math/test_sincos (; 168 ;) (param $0 i64) (param $1 i64) (param $2 i64) (param $3 i64) (param $4 i64) + (func $std/math/test_sincos (; 164 ;) (param $0 i64) (param $1 i64) (param $2 i64) (param $3 i64) (param $4 i64) (local $5 f64) (local $6 f64) local.get $3 @@ -11382,7 +11431,7 @@ drop end ) - (func $~lib/math/dtoi32 (; 169 ;) (param $0 f64) (result i32) + (func $~lib/math/dtoi32 (; 165 ;) (param $0 f64) (result i32) local.get $0 f64.const 4294967296 local.get $0 @@ -11394,7 +11443,7 @@ i64.trunc_f64_s i32.wrap_i64 ) - (func $~lib/math/NativeMath.imul (; 170 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.imul (; 166 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) local.get $0 local.get $1 @@ -11415,7 +11464,7 @@ i32.mul f64.convert_i32_s ) - (func $~lib/math/NativeMath.clz32 (; 171 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.clz32 (; 167 ;) (param $0 f64) (result f64) local.get $0 local.get $0 f64.sub @@ -11430,7 +11479,7 @@ i32.clz f64.convert_i32_s ) - (func $~lib/math/ipow64 (; 172 ;) (param $0 i64) (param $1 i32) (result i64) + (func $~lib/math/ipow64 (; 168 ;) (param $0 i64) (param $1 i32) (result i64) (local $2 i64) i64.const 1 local.set $2 @@ -11461,7 +11510,7 @@ end local.get $2 ) - (func $~lib/math/ipow32f (; 173 ;) (param $0 f32) (param $1 i32) (result f32) + (func $~lib/math/ipow32f (; 169 ;) (param $0 f32) (param $1 i32) (result f32) (local $2 f32) (local $3 i32) local.get $1 @@ -11507,7 +11556,7 @@ end local.get $2 ) - (func $~lib/math/ipow64f (; 174 ;) (param $0 f64) (param $1 i32) (result f64) + (func $~lib/math/ipow64f (; 170 ;) (param $0 f64) (param $1 i32) (result f64) (local $2 f64) (local $3 i32) local.get $1 @@ -11553,7 +11602,7 @@ end local.get $2 ) - (func $start:std/math (; 175 ;) + (func $start:std/math (; 171 ;) (local $0 f64) (local $1 f32) (local $2 i32) @@ -23350,591 +23399,6 @@ unreachable end f64.const -8.06684839057968 - f64.const 0.003729380227666592 - f64.const 0.1281578093767166 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1548 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 4.345239849338305 - f64.const 20.32579462123892 - f64.const 0.03073759749531746 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1549 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -8.38143342755525 - f64.const 2.9987283924334954e-03 - f64.const -0.31000515818595886 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1550 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -6.531673581913484 - f64.const 0.010808622025681005 - f64.const -0.28607869148254395 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1551 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 9.267056966972586 - f64.const 616.1154770730207 - f64.const -0.08883064985275269 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1552 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0.6619858980995045 - f64.const 1.5822591361986904 - f64.const -0.1258980929851532 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1553 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -0.4066039223853553 - f64.const 0.7543971221632684 - f64.const -0.24229088425636292 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1554 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0.5617597462207241 - f64.const 1.4760685736993149 - f64.const 0.27173060178756714 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1555 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0.7741522965913037 - f64.const 1.710184880131433 - f64.const -0.0205493476241827 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1556 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -0.6787637026394024 - f64.const 0.6247003734030933 - f64.const -0.31195688247680664 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1557 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0 - f64.const 1 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1560 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0 - f64.const 1 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1561 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1 - f64.const 2 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1562 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1 - f64.const 0.5 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1563 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const inf - f64.const inf - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1564 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -inf - f64.const 0 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1565 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const nan:0x8000000000000 - f64.const nan:0x8000000000000 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1566 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1.998046875 - f64.const 3.9945884515638808 - f64.const 0.1476455181837082 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1567 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1021.9 - f64.const 2.384775113731291e-308 - f64.const -0.2217157781124115 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1568 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1022 - f64.const 2.2250738585072014e-308 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1569 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1022.1 - f64.const 2.0760673185932884e-308 - f64.const 0.198451966047287 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1570 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1023 - f64.const 1.1125369292536007e-308 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1571 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1023.9 - f64.const 1677307003485741635311718e284 - f64.const 0.396903932094574 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1572 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1024 - f64.const inf - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1573 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1024.1 - f64.const inf - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1574 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 3.14 - f64.const 8.815240927012887 - f64.const 0.39309585094451904 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1575 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1022.5 - f64.const 1.5733648139913585e-308 - f64.const -0.28231191635131836 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1576 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1023 - f64.const 1.1125369292536007e-308 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1577 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1023.5 - f64.const 7.866824069956793e-309 - f64.const -0.14115595817565918 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1578 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1024 - f64.const 5.562684646268003e-309 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1579 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1025 - f64.const 2.781342323134e-309 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1580 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1074 - f64.const 5e-324 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1581 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1074.5 - f64.const 5e-324 - f64.const 0.2928932309150696 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1582 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1075 - f64.const 0 - f64.const -0.5 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1583 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -2048 - f64.const 0 - f64.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1584 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -8.066848754882812 - f32.const 3.7293792702257633e-03 - f32.const -0.0674908235669136 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1595 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 4.345239639282227 - f32.const 20.32579231262207 - f32.const 0.34121403098106384 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1596 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -8.381433486938477 - f32.const 2.9987283051013947e-03 - f32.const 0.15504619479179382 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1597 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -6.531673431396484 - f32.const 0.010808623395860195 - f32.const 0.2603940963745117 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1598 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 9.267057418823242 - f32.const 616.1156616210938 - f32.const -0.1379322111606598 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1599 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 0.6619858741760254 - f32.const 1.5822590589523315 - f32.const -0.427890807390213 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1600 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -0.40660393238067627 - f32.const 0.7543970942497253 - f32.const -0.38062313199043274 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1601 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 0.5617597699165344 - f32.const 1.4760686159133911 - f32.const 0.1507442593574524 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1602 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 0.7741522789001465 - f32.const 1.7101848125457764 - f32.const -0.39102980494499207 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1603 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -0.6787636876106262 - f32.const 0.6247003674507141 - f32.const -0.20904375612735748 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1604 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -8.06684839057968 f64.const -9 call $std/math/test_floor i32.eqz @@ -47254,7 +46718,7 @@ unreachable end ) - (func $~start (; 176 ;) + (func $~start (; 172 ;) call $start:std/math ) ) diff --git a/tests/compiler/std/math.ts b/tests/compiler/std/math.ts index 2ba0a2806a..7b7e44f1bf 100644 --- a/tests/compiler/std/math.ts +++ b/tests/compiler/std/math.ts @@ -1538,7 +1538,7 @@ assert(test_expm1f(NaN, NaN, 0.0, 0)); //////////////////////////////////////////////////////////////////////////////////////////////////// // Math.exp2 //////////////////////////////////////////////////////////////////////////////////////////////////// - +/* function test_exp2(value: f64, expected: f64, error: f64, flags: i32): bool { return check(NativeMath.exp2(value), expected, error, flags) && (!js || check( JSMath.pow(2, value), expected, error, flags)); @@ -1602,7 +1602,7 @@ assert(test_exp2f(reinterpret(0xBFDA05CC80000000), reinterpretreinterpret(0x3FE1F9EFA0000000), reinterpret(0x3FF79DFA20000000), reinterpret(0x3FC34B9680000000), INEXACT)); assert(test_exp2f(reinterpret(0x3FE8C5DB00000000), reinterpret(0x3FFB5CEAC0000000), reinterpret(0xBFD906A1E0000000), INEXACT)); assert(test_exp2f(reinterpret(0xBFE5B86EA0000000), reinterpret(0x3FE3FD8BA0000000), reinterpret(0xBFCAC1F220000000), INEXACT)); - +*/ //////////////////////////////////////////////////////////////////////////////////////////////////// // Math.floor //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/tests/compiler/std/math.untouched.wat b/tests/compiler/std/math.untouched.wat index 2d59bac122..59e9b16cdb 100644 --- a/tests/compiler/std/math.untouched.wat +++ b/tests/compiler/std/math.untouched.wat @@ -49,7 +49,6 @@ (import "Math" "cosh" (func $~lib/bindings/Math/cosh (param f64) (result f64))) (import "Math" "exp" (func $~lib/bindings/Math/exp (param f64) (result f64))) (import "Math" "expm1" (func $~lib/bindings/Math/expm1 (param f64) (result f64))) - (import "Math" "pow" (func $~lib/bindings/Math/pow (param f64 f64) (result f64))) (import "Math" "floor" (func $~lib/bindings/Math/floor (param f64) (result f64))) (import "Math" "log" (func $~lib/bindings/Math/log (param f64) (result f64))) (import "Math" "log10" (func $~lib/bindings/Math/log10 (param f64) (result f64))) @@ -58,6 +57,7 @@ (import "Math" "max" (func $~lib/bindings/Math/max (param f64 f64) (result f64))) (import "Math" "min" (func $~lib/bindings/Math/min (param f64 f64) (result f64))) (import "math" "mod" (func $std/math/mod (param f64 f64) (result f64))) + (import "Math" "pow" (func $~lib/bindings/Math/pow (param f64 f64) (result f64))) (import "Math" "random" (func $~lib/bindings/Math/random (result f64))) (import "Math" "sign" (func $~lib/bindings/Math/sign (param f64) (result f64))) (import "Math" "sin" (func $~lib/bindings/Math/sin (param f64) (result f64))) @@ -68,19 +68,10 @@ (import "Math" "trunc" (func $~lib/bindings/Math/trunc (param f64) (result f64))) (memory $0 1) (data (i32.const 16) "\16\00\00\00\01\00\00\00\01\00\00\00\16\00\00\00s\00t\00d\00/\00m\00a\00t\00h\00.\00t\00s\00") - (data (i32.const 64) "\00\08\00\00\01\00\00\00\03\00\00\00\00\08\00\00\9f\de\e0\c3\f04\f7?\00\90\e6y\7f\cc\d7\bf\1f\e9,jx\13\f7?\00\00\0d\c2\eeo\d7\bf\a0\b5\fa\08`\f2\f6?\00\e0Q\13\e3\13\d7\bf}\8c\13\1f\a6\d1\f6?\00x(8[\b8\d6\bf\d1\b4\c5\0bI\b1\f6?\00x\80\90U]\d6\bf\ba\0c/3G\91\f6?\00\00\18v\d0\02\d6\bf#B\"\18\9fq\f6?\00\90\90\86\ca\a8\d5\bf\d9\1e\a5\99OR\f6?\00P\03VCO\d5\bf\c4$\8f\aaV3\f6?\00@k\c37\f6\d4\bf\14\dc\9dk\b3\14\f6?\00P\a8\fd\a7\9d\d4\bfL\\\c6Rd\f6\f5?\00\a8\899\92E\d4\bfO,\91\b5g\d8\f5?\00\b8\b09\f4\ed\d3\bf\de\90[\cb\bc\ba\f5?\00p\8fD\ce\96\d3\bfx\1a\d9\f2a\9d\f5?\00\a0\bd\17\1e@\d3\bf\87VF\12V\80\f5?\00\80F\ef\e2\e9\d2\bf\d3k\e7\ce\97c\f5?\00\e008\1b\94\d2\bf\93\7f\a7\e2%G\f5?\00\88\da\8c\c5>\d2\bf\83E\06B\ff*\f5?\00\90\')\e1\e9\d1\bf\df\bd\b2\db\"\0f\f5?\00\f8H+m\95\d1\bf\d7\de4G\8f\f3\f4?\00\f8\b9\9agA\d1\bf@(\de\cfC\d8\f4?\00\98\ef\94\d0\ed\d0\bf\c8\a3x\c0>\bd\f4?\00\10\db\18\a5\9a\d0\bf\8a%\e0\c3\7f\a2\f4?\00\b8cR\e6G\d0\bf4\84\d4$\05\88\f4?\00\f0\86E\"\eb\cf\bf\0b-\19\1b\cem\f4?\00\b0\17uJG\cf\bfT\189\d3\d9S\f4?\000\10=D\a4\ce\bfZ\84\b4D\':\f4?\00\b0\e9D\0d\02\ce\bf\fb\f8\15A\b5 \f4?\00\f0w)\a2`\cd\bf\b1\f4>\da\82\07\f4?\00\90\95\04\01\c0\cc\bf\8f\feW]\8f\ee\f3?\00\10\89V) \cc\bf\e9L\0b\a0\d9\d5\f3?\00\10\81\8d\17\81\cb\bf+\c1\10\c0`\bd\f3?\00\d0\d3\cc\c9\e2\ca\bf\b8\dau+$\a5\f3?\00\90\12.@E\ca\bf\02\d0\9f\cd\"\8d\f3?\00\f0\1dhw\a8\c9\bf\1cz\84\c5[u\f3?\000Him\0c\c9\bf\e26\adI\ce]\f3?\00\c0E\a6 q\c8\bf@\d4M\98yF\f3?\000\14\b4\8f\d6\c7\bf$\cb\ff\ce\\/\f3?\00pb<\b8<\c7\bfI\0d\a1uw\18\f3?\00`7\9b\9a\a3\c6\bf\909>7\c8\01\f3?\00\a0\b7T1\0b\c6\bfA\f8\95\bbN\eb\f2?\000$v}s\c5\bf\d1\a9\19\02\n\d5\f2?\000\c2\8f{\dc\c4\bf*\fd\b7\a8\f9\be\f2?\00\00\d2Q,F\c4\bf\ab\1b\0cz\1c\a9\f2?\00\00\83\bc\8a\b0\c3\bf0\b5\14`r\93\f2?\00\00Ik\99\1b\c3\bf\f5\a1WW\fa}\f2?\00@\a4\90T\87\c2\bf\bf;\1d\9b\b3h\f2?\00\a0y\f8\b9\f3\c1\bf\bd\f5\8f\83\9dS\f2?\00\a0,%\c8`\c1\bf;\08\c9\aa\b7>\f2?\00 \f7W\7f\ce\c0\bf\b6@\a9+\01*\f2?\00\a0\feI\dc<\c0\bf2A\cc\96y\15\f2?\00\80K\bc\bdW\bf\bf\9b\fc\d2\1d \01\f2?\00@@\96\087\be\bf\0bHMI\f4\ec\f1?\00@\f9>\98\17\bd\bfie\8fR\f5\d8\f1?\00\a0\d8Ng\f9\bb\bf|~W\11#\c5\f1?\00`/ y\dc\ba\bf\e9&\cbt|\b1\f1?\00\80(\e7\c3\c0\b9\bf\b6\1a,\0c\01\9e\f1?\00\c0r\b3F\a6\b8\bf\bdp\b6{\b0\8a\f1?\00\00\ac\b3\01\8d\b7\bf\b6\bc\ef%\8aw\f1?\00\008E\f1t\b6\bf\da1L5\8dd\f1?\00\80\87m\0e^\b5\bf\dd_\'\90\b9Q\f1?\00\e0\a1\de\\H\b4\bfL\d22\a4\0e?\f1?\00\a0jM\d93\b3\bf\da\f9\10r\8b,\f1?\00`\c5\f8y \b2\bf1\b5\ec(0\1a\f1?\00 b\98F\0e\b1\bf\af4\84\da\fb\07\f1?\00\00\d2jl\fa\af\bf\b3kN\0f\ee\f5\f0?\00@wJ\8d\da\ad\bf\ce\9f*]\06\e4\f0?\00\00\85\e4\ec\bc\ab\bf!\a5,cD\d2\f0?\00\c0\12@\89\a1\a9\bf\1a\98\e2|\a7\c0\f0?\00\c0\023X\88\a7\bf\d16\c6\83/\af\f0?\00\80\d6g^q\a5\bf9\13\a0\98\db\9d\f0?\00\80eI\8a\\\a3\bf\df\e7R\af\ab\8c\f0?\00@\15d\e3I\a1\bf\fb(N/\9f{\f0?\00\80\eb\82\c0r\9e\bf\19\8f5\8c\b5j\f0?\00\80RR\f1U\9a\bf,\f9\ec\a5\eeY\f0?\00\80\81\cfb=\96\bf\90,\d1\cdII\f0?\00\00\aa\8c\fb(\92\bf\a9\ad\f0\c6\c68\f0?\00\00\f9 {1\8c\bf\a92y\13e(\f0?\00\00\aa]5\19\84\bfHs\ea\'$\18\f0?\00\00\ec\c2\03\12x\bf\95\b1\14\06\04\08\f0?\00\00$y\t\04`\bf\1a\fa&\f7\1f\e0\ef?\00\00\90\84\f3\efo?t\eaa\c2\1c\a1\ef?\00\00=5A\dc\87?.\99\81\b0\10c\ef?\00\80\c2\c4\a3\ce\93?\cd\ad\ee<\f6%\ef?\00\00\89\14\c1\9f\9b?\e7\13\91\03\c8\e9\ee?\00\00\11\ce\d8\b0\a1?\ab\b1\cbx\80\ae\ee?\00\c0\01\d0[\8a\a5?\9b\0c\9d\a2\1at\ee?\00\80\d8@\83\\\a9?\b5\99\n\83\91:\ee?\00\80W\efj\'\ad?V\9a`\t\e0\01\ee?\00\c0\98\e5\98u\b0?\98\bbw\e5\01\ca\ed?\00 \0d\e3\f5S\b2?\03\91|\0b\f2\92\ed?\00\008\8b\dd.\b4?\ce\\\fbf\ac\\\ed?\00\c0W\87Y\06\b6?\9d\de^\aa,\'\ed?\00\00j5v\da\b7?\cd,k>n\f2\ec?\00`\1cNC\ab\b9?\02y\a7\a2m\be\ec?\00`\0d\bb\c7x\bb?m\087m&\8b\ec?\00 \e72\13C\bd?\04X]\bd\94X\ec?\00`\deq1\n\bf?\8c\9f\bb3\b5&\ec?\00@\91+\15g\c0??\e7\ec\ee\83\f5\eb?\00\b0\92\82\85G\c1?\c1\96\dbu\fd\c4\eb?\000\ca\cdn&\c2?(J\86\0c\1e\95\eb?\00P\c5\a6\d7\03\c3?,>\ef\c5\e2e\eb?\00\103<\c3\df\c3?\8b\88\c9gH7\eb?\00\80zk6\ba\c4?J0\1d!K\t\eb?\00\f0\d1(9\93\c5?~\ef\f2\85\e8\db\ea?\00\f0\18$\cdj\c6?\a2=`1\1d\af\ea?\00\90f\ec\f8@\c7?\a7X\d3?\e6\82\ea?\00\f0\1a\f5\c0\15\c8?\8bs\t\ef@W\ea?\00\80\f6T)\e9\c8?\'K\ab\90*,\ea?\00@\f8\026\bb\c9?\d1\f2\93\13\a0\01\ea?\00\00,\1c\ed\8b\ca?\1b<\db$\9f\d7\e9?\00\d0\01\\Q[\cb?\90\b1\c7\05%\ae\e9?\00\c0\bc\ccg)\cc?/\ce\97\f2.\85\e9?\00`H\d55\f6\cc?uK\a4\ee\ba\\\e9?\00\c0F4\bd\c1\cd?8H\e7\9d\c64\e9?\00\e0\cf\b8\01\8c\ce?\e6Rg/O\0d\e9?\00\90\17\c0\tU\cf?\9d\d7\ff\8eR\e6\e8?\00\b8\1f\12l\0e\d0?|\00\cc\9f\ce\bf\e8?\00\d0\93\0e\b8q\d0?\0e\c3\be\da\c0\99\e8?\00p\86\9ek\d4\d0?\fb\17#\aa\'t\e8?\00\d0K3\876\d1?\08\9a\b3\ac\00O\e8?\00H#g\0d\98\d1?U>e\e8I*\e8?\00\80\cc\e0\ff\f8\d1?`\02\f4\95\01\06\e8?\00hc\d7_Y\d2?)\a3\e0c%\e2\e7?\00\a8\14\t0\b9\d2?\ad\b5\dcw\b3\be\e7?\00`C\10r\18\d3?\c2%\97g\aa\9b\e7?\00\18\ecm&w\d3?W\06\17\f2\07y\e7?\000\af\fbO\d5\d3?\0c\13\d6\db\caV\e7?\00\e0/\e3\ee2\d4?") - (data (i32.const 2128) "\00\08\00\00\01\00\00\00\03\00\00\00\00\08\00\00k\b6O\01\00\10\e6?<[B\91l\02~<\95\b4M\03\000\e6?A]\00H\ea\bf\8d\f6\05\eb\ff\ef\e6?S-\e2\1a\04\80~\bc\80\97\86\0e\00\10\e7?Ry\tqf\ff{<\12\e9g\fc\ff/\e7?$\87\bd&\e2\00\8c\89<\b9{F\13\000\e9?v\02\98KN\80\7f.\98\dd\ff\af\e9?7\93Z\8a\e0@\87\bcf\fbI\ed\ff\cf\e9?\00\e0\9b\c1\08\ce?O*\00\b0\ea?_?\ff<\04\fdi\bc\d1\1e\ae\d7\ff\cf\ea?\b4p\90\12\e7>\82\bcx\04Q\ee\ff\ef\ea?\a3\de\0e\e0>\06j<[\0de\db\ff\0f\eb?\b9\n\1f8\c8\06ZO\86\d0E\ff\8a<@\16\87\f9\ff\8f\eb?\f9\c3\c2\96w\fe|\f0\0f\00\f0\f4?\1cS\85\0b\89\7f\97<\d1K\dc\12\00\10\f5?6\a4fqe\04`\c9\03\00\b0\f5?\c0\0c\bf\n\08A\9f\bc\bc\19I\1d\00\d0\f5?)G%\fb*\81\98\bc\89z\b8\e7\ff\ef\f5?\04i\ed\80\b7~\94\bc") - (data (i32.const 4192) "\00\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\de\aa\8c\80\f7{\d5\bf=\88\afJ\edq\f5?\dbm\c0\a7\f0\be\d2\bf\b0\10\f0\f09\95\f4?g:Q\7f\ae\1e\d0\bf\85\03\b8\b0\95\c9\f3?\e9$\82\a6\d81\cb\bf\a5d\88\0c\19\0d\f3?Xw\c0\nOW\c6\bf\a0\8e\0b{\"^\f2?\00\81\9c\c7+\aa\c1\bf?4\1aJJ\bb\f1?^\0e\8c\cevN\ba\bf\ba\e5\8a\f0X#\f1?\cc\1caZ<\97\b1\bf\a7\00\99A?\95\f0?\1e\0c\e18\f4R\a2\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?\84Y\f2]\aa\a5\aa?\a0j\02\1f\b3\a4\ec?\b4.6\aaS^\bc?\e6\fcjW6 \eb?\08\db w\e5&\c5?-\aa\a1c\d1\c2\e9?pG\"\0d\86\c2\cb?\edAx\03\e6\86\e8?\e1~\a0\c8\8b\05\d1?bHS\f5\dcg\e7?\t\ee\b6W0\04\d4?") - (data (i32.const 4464) "\c0\00\00\00\01\00\00\00\04\00\00\00\c0\00\00\00n\83\f9\a2\00\00\00\00\d1W\'\fc)\15DN\99\95b\db\c0\dd4\f5\abcQ\feA\90C<:n$\b7a\c5\bb\de\ea.I\06\e0\d2MB\1c\eb\1d\fe\1c\92\d1\t\f55\82\e8>\a7)\b1&p\9c\e9\84D\bb.9\d6\919A~_\b4\8b_\84\9c\f49S\83\ff\97\f8\1f;(\f9\bd\8b\11/\ef\0f\98\05\de\cf~6m\1fm\nZf?FO\b7\t\cb\'\c7\ba\'u-\ea_\9e\f79\07={\f1\e5\eb\b1_\fbk\ea\92R\8aF0\03V\08]\8d\1f \bc\cf\f0\abk{\fca\91\e3\a9\1d6\f4\9a_\85\99e\08\1b\e6^\80\d8\ff\8d@h\a0\14W\15\06\061\'sM") - (data (i32.const 4672) " \00\00\00\01\00\00\00\04\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") - (data (i32.const 4720) "\00\08\00\00\01\00\00\00\04\00\00\00\00\08\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\f0?n\bf\88\1aO;\9b<53\fb\a9=\f6\ef?]\dc\d8\9c\13`q\bca\80w>\9a\ec\ef?\d1f\87\10z^\90\bc\85\7fn\e8\15\e3\ef?\13\f6g5R\d2\8c\be\ef?m{\83]\a6\9a\97<\0f\89\f9lX\b5\ef?\fc\ef\fd\92\1a\b5\8e<\f7Gr+\92\ac\ef?\d1\9c/p=\be><\a2\d1\d32\ec\a3\ef?\0bn\90\894\03j\bc\1b\d3\fe\aff\9b\ef?\0e\bd/*RV\95\bcQ[\12\d0\01\93\ef?U\eaN\8c\ef\80P\bc\cc1l\c0\bd\8a\ef?\16\f4\d5\b9#\c9\91\bc\e0-\a9\ae\9a\82\ef?\afU\\\e9\e3\d3\80\f7\ec\9a<\aa\b9h1\87T\ef?\9d8\86\cb\82\e7\8f\bc\1d\d9\fc\"PM\ef?\8d\c3\a6DAo\8a<\d6\8cb\88;F\ef?}\04\e4\b0\05z\80<\96\dc}\91I?\ef?\94\a8\a8\e3\fd\8e\96<8bunz8\ef?}Ht\f2\18^\87\a9\af\0c\ef?\b6\ab\b0MuM\83<\15\b71\n\fe\06\ef?Lt\ac\e2\01B\86<1\d8L\fcp\01\ef?J\f8\d3]9\dd\8f<\ff\16d\b2\08\fc\ee?\04[\8e;\80\a3\86\bc\f1\9f\92_\c5\f6\ee?hPK\cc\edJ\92\bc\cb\a9:7\a7\f1\ee?\8e-Q\1b\f8\07\99\bcf\d8\05m\ae\ec\ee?\d26\94>\e8\d1q\bc\f7\9f\e54\db\e7\ee?\15\1b\ce\b3\19\19\99\bc\e5\a8\13\c3-\e3\ee?mL*\a7H\9f\85<\"4\12L\a6\de\ee?\8ai(z`\12\93\bc\1c\80\ac\04E\da\ee?[\89\17H\8f\a7X\bc*.\f7!\n\d6\ee?\1b\9aIg\9b,|\bc\97\a8P\d9\f5\d1\ee?\11\ac\c2`\edcC<-\89a`\08\ce\ee?\efd\06;\tf\96Z~d\1fx\bct_\ec\e8u\9f\ee?\b0}\8b\c0J\ee\86\bct\81\a5H\9a\9f\ee?\8a\e6U\1e2\19\86\bc\c9gBV\eb\9f\ee?\d3\d4\t^\cb\9c\90T\'\a4\ee?47;\f1\b6i\93\bc\13\ceL\99\89\a5\ee?\1e\ff\19:\84^\80\bc\ad\c7#F\1a\a7\ee?nWr\d8P\d4\94\bc\ed\92D\9b\d9\a8\ee?\00\8a\0e[g\ad\90<\99f\8a\d9\c7\aa\ee?\b4\ea\f0\c1/\b7\8d<\db\a0*B\e5\ac\ee?\ff\e7\c5\9c`\b6e\bc\8cD\b5\162\af\ee?D_\f3Y\83\f6{<6w\15\99\ae\b1\ee?\83=\1e\a7\1f\t\93\bc\c6\ff\91\0b[\b4\ee?)\1el\8b\b8\a9]\bc\e5\c5\cd\b07\b7\ee?Y\b9\90|\f9#l\bc\0fR\c8\cbD\ba\ee?\aa\f9\f4\"CC\92\bcPN\de\9f\82\bd\ee?K\8ef\d7l\ca\85\bc\ba\07\cap\f1\c0\ee?\'\ce\91+\fc\afq<\90\f0\a3\82\91\c4\ee?\bbs\n\e15\d2m<##\e3\19c\c8\ee?c\"b\"\04\c5\87\bce\e5]{f\cc\ee?\d51\e2\e3\86\1c\8b<3-J\ec\9b\d0\ee?\15\bb\bc\d3\d1\bb\91\bc]%>\b2\03\d5\ee?\d21\ee\9c1\cc\90\b4\07!\d5\82\bc_\9b{3\97|\ef?\c9\0dG;\b9*\89\bc)\a1\f5\14F\86\ef?\d3\88:`\04\b6t<\f6?\8b\e7.\90\ef?qr\9dQ\ec\c5\83<\83L\c7\fbQ\9a\ef?\f0\91\d3\8f\12\f7\8f\bc\da\90\a4\a2\af\a4\ef?}t#\e2\98\ae\8d\bc\f1g\8e-H\af\ef?\08 \aaA\bc\c3\8e<\'Za\ee\1b\ba\ef?2\eb\a9\c3\94+\84<\97\bak7+\c5\ef?\ee\85\d11\a9d\8a<@En[v\d0\ef?\ed\e3;\e4\ba7\8e\bc\14\be\9c\ad\fd\db\ef?\9d\cd\91M;\89w<\d8\90\9e\81\c1\e7\ef?\89\cc`A\c1\05S<\f1q\8f+\c2\f3\ef?") - (data (i32.const 6784) "\00\01\00\00\01\00\00\00\04\00\00\00\00\01\00\00\00\00\00\00\00\00\f0?t\85\15\d3\b0\d9\ef?\0f\89\f9lX\b5\ef?Q[\12\d0\01\93\ef?{Q}<\b8r\ef?\aa\b9h1\87T\ef?8bunz8\ef?\e1\de\1f\f5\9d\1e\ef?\15\b71\n\fe\06\ef?\cb\a9:7\a7\f1\ee?\"4\12L\a6\de\ee?-\89a`\08\ce\ee?\'*6\d5\da\bf\ee?\82O\9dV+\b4\ee?)TH\dd\07\ab\ee?\85U:\b0~\a4\ee?\cd;\7ff\9e\a0\ee?t_\ec\e8u\9f\ee?\87\01\ebs\14\a1\ee?\13\ceL\99\89\a5\ee?\db\a0*B\e5\ac\ee?\e5\c5\cd\b07\b7\ee?\90\f0\a3\82\91\c4\ee?]%>\b2\03\d5\ee?\ad\d3Z\99\9f\e8\ee?G^\fb\f2v\ff\ee?\9cR\85\dd\9b\19\ef?i\90\ef\dc 7\ef?\87\a4\fb\dc\18X\ef?_\9b{3\97|\ef?\da\90\a4\a2\af\a4\ef?@En[v\d0\ef?") - (data (i32.const 7056) "\00\04\00\00\01\00\00\00\03\00\00\00\00\04\00\00\f8\ac\b1k($\f7?\00\b0\cd\ee_\t\e1\bf\a1\cc\d2f\f7\e1\f6?\00\d0v\bd\94\84\e0\bf\8a\d40\0e=\a1\f6?\00\f8\e8\aeC\01\e0\bf\85l\d02\eca\f6?\00@\0b6\c5\fe\de\bf\f8\98\11\95\fa#\f6?\00\e0\b7\1a\d9\fd\dd\bfl\02\cf\a4[\e7\f5?\00\90\c7\0c\ae\ff\dc\bf\b8O!Z\05\ac\f5?\00\a0\fd\118\04\dc\bf\1en\16\0f\edq\f5?\00\e0:2g\0b\db\bf5\f8\0bY\t9\f5?\00\b0-Z/\15\da\bf\dd\ada\edO\01\f5?\00`\f8Z\7f!\d9\bf\d0{H\8e\b8\ca\f4?\00\90q\b0M0\d8\bf\eeO3\b49\95\f4?\00\e0\a9\f9\89A\d7\bfi\d5\af\df\cb`\f4?\00\90\19\b5+U\d6\bfS\b9\e4Nf-\f4?\00\10\9b\a2#k\d5\bf\a6\d8\1d\11\01\fb\f3?\00\a0_\0fe\83\d4\bf6X\0c\b7\95\c9\f3?\00\a0\f67\e9\9d\d3\bfJ\fd\b6J\1c\99\f3?\00`\8dS\a1\ba\d2\bf\b5\99\e0\0c\8ei\f3?\00@\ca@\83\d9\d1\bf\b2\e7\13\82\e4:\f3?\00\e0@:\85\fa\d0\bf\b1\bd\85\19\19\0d\f3?\000\e72\9c\1d\d0\bf\d7q\b2\ca%\e0\f2?\00`\fa\a2}\85\ce\bf\82\cd\13\cf\04\b4\f2?\00\80=c\c8\d3\cc\bfP\cb|,\b0\88\f2?\00\a0\14L\03&\cb\bf\e5M\94c\"^\f2?\00\e0O/\1c|\c9\bf\b1\15\86=V4\f2?\00\00\80?\02\d6\c7\bf8\af>\e3F\0b\f2?\00\e0\05\1a\a73\c6\bf\dd\a3\cd\fd\ee\e2\f1?\00\00W\e9\f5\94\c4\bf09\0bXJ\bb\f1?\00\a0\e0$\e4\f9\c2\bf\00\"\7f\84S\94\f1?\00\c0\fdZYb\c1\bf<\d7\d5\c0\06n\f1?\00\80\bdu\9a\9c\bf\bf\c2\e4\b7G_H\f1?\00\c0\f9[W{\bc\bf\d1\85\00\adX#\f1?\00\80\f4\0f\c6`\b9\bf\'\"S\0f\f0\fe\f0?\00\00\b6G\e2L\b6\bf\8f:\d0w \db\f0?\00@\01\b2x?\b3\bf\d9\80Y\d6\e6\b7\f0?\00\c0B\1a}8\b0\bf\8d@{\fe>\95\f0?\00\00\b5\08\92o\aa\bf\83;\c5\ca%s\f0?\00\00wO\95z\a4\bf\\\1b\0d\e4\97Q\f0?\00\00\0c\c5\a8#\9d\bf\a2\8e \c1\910\f0?\00\00x)&j\91\bf!~\b3%\10\10\f0?\00\00\e8\d8\f8 w\bfk\a7\ca\f9~\c0\ef?\00\00P\b1S\fe\86?\84\f1\f6\d3eD\ef?\00\80\0f\e1\cc\1c\a1?\7f\10\84\9f\07\cc\ee?\00\80\8b\8c\fcM\ac?\e8Z\97\99:W\ee?\00@W\1e2\aa\b3?\e6=\bd\f0\d6\e5\ed?\00\80\8b\d0\a0\18\b9?\b38\ff\81\b6w\ed?\00@\04\da\e9r\be?C\e9Mr\b5\0c\ed?\00`\7fP\d2\dc\c1?cu\0e\dc\b2\a4\ec?\00\a0\de\03\abv\c4?Q\cb\d6\e8\8e?\ec?\00 \e2wC\07\c7?L\0c\02O+\dd\eb?\00@\a9\8b\de\8e\c9?\ca\15`\00l}\eb?\00\e0\d2j\b8\0d\cc?\8f3.n6 \eb?\00\e0\ce\af\n\84\ce?9P)&p\c5\ea?\00\80g\b4\ny\d0?\dd1\'\bc\01m\ea?\00\c0\01h\05\ac\d1?\8b\f1?\bc\d3\16\ea?\00\e0\fe\d4\11\db\d2?\ad\fegI\d1\c2\e9?\00\80\c5NF\06\d4?\02\99|\f4\e4p\e9?\00\f0:\t\be-\d5?\f2\bc\829\fb \e9?\00\d0P \90Q\d6?\f1Y\f7\87\01\d3\e8?\00\f0\ea\cd\d2q\d7?m\f6\b9\eb\e5\86\e8?\00\90}\85\9c\8e\d8?\94\b9X\b6\97<\e8?\00`\e1U\01\a8\d9?\"\10\c6\ff\05\f4\e7?\00\d0\d3n\18\be\da?\ca\15\14\18\"\ad\e7?\00\e0\a0\ae\f2\d0\db?\8c\ff\9e\f9\dcg\e7?\00@\bf=\a4\e0\dc?") - (data (i32.const 8096) "\00\04\00\00\01\00\00\00\03\00\00\00\00\04\00\00\8e\n\b9\12\00 \e6?\05\b6D\06\ab\04\89<\a64W\04\00`\e6?\a9\f7b\ea\9b\ffa<\c5\f2%\c3\ff\9f\e6?\ba\90<\cb\cf~\82<\04Z\b98\00\e0\e6?&\93sV\88\ff\88<\e3\94\99\e0\ff\1f\e7?\b1\82_\'@\fd\8a<\10\0eY\15\00`\e7?A\83#\b4u\fdr\bc\d5[e\12\00\a0\e7?v+$|\e6\08x<\a6\e9Y2\00\e0\e7?\b7\"\f6&\e4\08b\bc\d2\b2\b4\ed\ff\1f\e8?/\c9\a5\1eF\02\84\bc\c3\fc\fa-\00`\e8?\1f\9a\f2\a2\f4\f7m)\e0\ff\df\f2?\f9\a6\b2\da9|\9b<\82\f0\dc\f7\ff\1f\f3?TR\dcn3\f1}<`\8bZ\f0\ff_\f3?\eb1\cdLV\03\9e\bc\cc\ae\0e.\00\a0\f3?w\a4\d3K\e7\f0u<6\b2;\04\00\e0\f3?3\88\9d\14\cb}\9c<\ff\87\d1\02\00 \f4?(=-\cf\af\08~<\b1|8\0d\00`\f4?\a6\99e\857\08\82<\89\9fV\04\00\a0\f4?\d2\bcO\90\\\fa\89\bc\f3C5\04\00\e0\f4?)S\17\ed%\11x\bc\0f\7f\02\cc\ff\1f\f5?\dcTw\84\d8\83\98\e90.\90\80\91\bc") - (data (i32.const 9136) "\00\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\190\96[\c6\fe\de\bf=\88\afJ\edq\f5?\a4\fc\d42h\0b\db\bf\b0\10\f0\f09\95\f4?{\b7\1f\n\8bA\d7\bf\85\03\b8\b0\95\c9\f3?{\cfm\1a\e9\9d\d3\bf\a5d\88\0c\19\0d\f3?1\b6\f2\f3\9b\1d\d0\bf\a0\8e\0b{\"^\f2?\f0z;\1b\1d|\c9\bf?4\1aJJ\bb\f1?\9f<\af\93\e3\f9\c2\bf\ba\e5\8a\f0X#\f1?\\\8dx\bf\cb`\b9\bf\a7\00\99A?\95\f0?\ce_G\b6\9do\aa\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?=\f5$\9f\ca8\b3?\a0j\02\1f\b3\a4\ec?\ba\918T\a9v\c4?\e6\fcjW6 \eb?\d2\e4\c4J\0b\84\ce?-\aa\a1c\d1\c2\e9?\1ce\c6\f0E\06\d4?\edAx\03\e6\86\e8?\f8\9f\1b,\9c\8e\d8?bHS\f5\dcg\e7?\cc{\b1N\a4\e0\dc?") - (data (i32.const 9408) "\00\10\00\00\01\00\00\00\03\00\00\00\00\10\00\00\00\00\00\00\00\a0\f6?\00\00\00\00\00\00\00\00\00\c8\b9\f2\82,\d6\bf\80V7($\b4\fa<\00\00\00\00\00\80\f6?\00\00\00\00\00\00\00\00\00\08X\bf\bd\d1\d5\bf \f7\e0\d8\08\a5\1c\bd\00\00\00\00\00`\f6?\00\00\00\00\00\00\00\00\00XE\17wv\d5\bfmP\b6\d5\a4b#\bd\00\00\00\00\00@\f6?\00\00\00\00\00\00\00\00\00\f8-\87\ad\1a\d5\bf\d5g\b0\9e\e4\84\e6\bc\00\00\00\00\00 \f6?\00\00\00\00\00\00\00\00\00xw\95_\be\d4\bf\e0>)\93i\1b\04\bd\00\00\00\00\00\00\f6?\00\00\00\00\00\00\00\00\00`\1c\c2\8ba\d4\bf\cc\84LH/\d8\13=\00\00\00\00\00\e0\f5?\00\00\00\00\00\00\00\00\00\a8\86\860\04\d4\bf:\0b\82\ed\f3B\dc<\00\00\00\00\00\c0\f5?\00\00\00\00\00\00\00\00\00HiUL\a6\d3\bf`\94Q\86\c6\b1 =\00\00\00\00\00\a0\f5?\00\00\00\00\00\00\00\00\00\80\98\9a\ddG\d3\bf\92\80\c5\d4MY%=\00\00\00\00\00\80\f5?\00\00\00\00\00\00\00\00\00 \e1\ba\e2\e8\d2\bf\d8+\b7\99\1e{&=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00@\f5?\00\00\00\00\00\00\00\00\00x\cf\fbA)\d2\bfv\daS($Z\16\bd\00\00\00\00\00 \f5?\00\00\00\00\00\00\00\00\00\98i\c1\98\c8\d1\bf\04T\e7h\bc\af\1f\bd\00\00\00\00\00\00\f5?\00\00\00\00\00\00\00\00\00\a8\ab\ab\\g\d1\bf\f0\a8\823\c6\1f\1f=\00\00\00\00\00\e0\f4?\00\00\00\00\00\00\00\00\00H\ae\f9\8b\05\d1\bffZ\05\fd\c4\a8&\bd\00\00\00\00\00\c0\f4?\00\00\00\00\00\00\00\00\00\90s\e2$\a3\d0\bf\0e\03\f4~\eek\0c\bd\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\80\f4?\00\00\00\00\00\00\00\00\00@^m\18\b9\cf\bf\87<\99\ab*W\0d=\00\00\00\00\00`\f4?\00\00\00\00\00\00\00\00\00`\dc\cb\ad\f0\ce\bf$\af\86\9c\b7&+=\00\00\00\00\00@\f4?\00\00\00\00\00\00\00\00\00\f0*n\07\'\ce\bf\10\ff?TO/\17\bd\00\00\00\00\00 \f4?\00\00\00\00\00\00\00\00\00\c0Ok!\\\cd\bf\1bh\ca\bb\91\ba!=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\e0\f3?\00\00\00\00\00\00\00\00\00\90-t\86\c2\cb\bf\8f\b7\8b1\b0N\19=\00\00\00\00\00\c0\f3?\00\00\00\00\00\00\00\00\00\c0\80N\c9\f3\ca\bff\90\cd?cN\ba<\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\80\f3?\00\00\00\00\00\00\00\00\00P\f4\9cZR\c9\bf\e3\d4\c1\04\d9\d1*\bd\00\00\00\00\00`\f3?\00\00\00\00\00\00\00\00\00\d0 e\a0\7f\c8\bf\t\fa\db\7f\bf\bd+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00 \f3?\00\00\00\00\00\00\00\00\00\d0\19\e7\0f\d6\c6\bff\e2\b2\a3j\e4\10\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\e0\f2?\00\00\00\00\00\00\00\00\00\b0\a1\e3\e5&\c5\bf\8f[\07\90\8b\de \bd\00\00\00\00\00\c0\f2?\00\00\00\00\00\00\00\00\00\80\cbl+M\c4\bf\11\0e\bd\00\00\00\00\00\e0\ed?\00\00\00\00\00\00\00\00\00`F\d1;\97\b1?\9b\9e\0dV]2%\bd\00\00\00\00\00\a0\ed?\00\00\00\00\00\00\00\00\00\e0\d1\a7\f5\bd\b3?\d7N\db\a5^\c8,=\00\00\00\00\00`\ed?\00\00\00\00\00\00\00\00\00\a0\97MZ\e9\b5?\1e\1d]<\06i,\bd\00\00\00\00\00@\ed?\00\00\00\00\00\00\00\00\00\c0\ea\n\d3\00\b7?2\ed\9d\a9\8d\1e\ec<\00\00\00\00\00\00\ed?\00\00\00\00\00\00\00\00\00@Y]^3\b9?\daG\bd:\\\11#=\00\00\00\00\00\c0\ec?\00\00\00\00\00\00\00\00\00`\ad\8d\c8j\bb?\e5h\f7+\80\90\13\bd\00\00\00\00\00\a0\ec?\00\00\00\00\00\00\00\00\00@\bc\01X\88\bc?\d3\acZ\c6\d1F&=\00\00\00\00\00`\ec?\00\00\00\00\00\00\00\00\00 \n\839\c7\be?\e0E\e6\afh\c0-\bd\00\00\00\00\00@\ec?\00\00\00\00\00\00\00\00\00\e0\db9\91\e8\bf?\fd\n\a1O\d64%\bd\00\00\00\00\00\00\ec?\00\00\00\00\00\00\00\00\00\e0\'\82\8e\17\c1?\f2\07-\cex\ef!=\00\00\00\00\00\e0\eb?\00\00\00\00\00\00\00\00\00\f0#~+\aa\c1?4\998D\8e\a7,=\00\00\00\00\00\a0\eb?\00\00\00\00\00\00\00\00\00\80\86\0ca\d1\c2?\a1\b4\81\cbl\9d\03=\00\00\00\00\00\80\eb?\00\00\00\00\00\00\00\00\00\90\15\b0\fce\c3?\89rK#\a8/\c6<\00\00\00\00\00@\eb?\00\00\00\00\00\00\00\00\00\b03\83=\91\c4?x\b6\fdTy\83%=\00\00\00\00\00 \eb?\00\00\00\00\00\00\00\00\00\b0\a1\e4\e5\'\c5?\c7}i\e5\e83&=\00\00\00\00\00\e0\ea?\00\00\00\00\00\00\00\00\00\10\8c\beNW\c6?x.<,\8b\cf\19=\00\00\00\00\00\c0\ea?\00\00\00\00\00\00\00\00\00pu\8b\12\f0\c6?\e1!\9c\e5\8d\11%\bd\00\00\00\00\00\a0\ea?\00\00\00\00\00\00\00\00\00PD\85\8d\89\c7?\05C\91p\10f\1c\bd\00\00\00\00\00`\ea?\00\00\00\00\00\00\00\00\00\009\eb\af\be\c8?\d1,\e9\aaT=\07\bd\00\00\00\00\00@\ea?\00\00\00\00\00\00\00\00\00\00\f7\dcZZ\c9?o\ff\a0X(\f2\07=\00\00\00\00\00\00\ea?\00\00\00\00\00\00\00\00\00\e0\8a<\ed\93\ca?i!VPCr(\bd\00\00\00\00\00\e0\e9?\00\00\00\00\00\00\00\00\00\d0[W\d81\cb?\aa\e1\acN\8d5\0c\bd\00\00\00\00\00\c0\e9?\00\00\00\00\00\00\00\00\00\e0;8\87\d0\cb?\b6\12TY\c4K-\bd\00\00\00\00\00\a0\e9?\00\00\00\00\00\00\00\00\00\10\f0\c6\fbo\cc?\d2+\96\c5r\ec\f1\bc\00\00\00\00\00`\e9?\00\00\00\00\00\00\00\00\00\90\d4\b0=\b1\cd?5\b0\15\f7*\ff*\bd\00\00\00\00\00@\e9?\00\00\00\00\00\00\00\00\00\10\e7\ff\0eS\ce?0\f4A`\'\12\c2<\00\00\00\00\00 \e9?\00\00\00\00\00\00\00\00\00\00\dd\e4\ad\f5\ce?\11\8e\bbe\15!\ca\bc\00\00\00\00\00\00\e9?\00\00\00\00\00\00\00\00\00\b0\b3l\1c\99\cf?0\df\0c\ca\ec\cb\1b=\00\00\00\00\00\c0\e8?\00\00\00\00\00\00\00\00\00XM`8q\d0?\91N\ed\16\db\9c\f8<\00\00\00\00\00\a0\e8?\00\00\00\00\00\00\00\00\00`ag-\c4\d0?\e9\ea<\16\8b\18\'=\00\00\00\00\00\80\e8?\00\00\00\00\00\00\00\00\00\e8\'\82\8e\17\d1?\1c\f0\a5c\0e!,\bd\00\00\00\00\00`\e8?\00\00\00\00\00\00\00\00\00\f8\ac\cb\\k\d1?\81\16\a5\f7\cd\9a+=\00\00\00\00\00@\e8?\00\00\00\00\00\00\00\00\00hZc\99\bf\d1?\b7\bdGQ\ed\a6,=\00\00\00\00\00 \e8?\00\00\00\00\00\00\00\00\00\b8\0emE\14\d2?\ea\baF\ba\de\87\n=\00\00\00\00\00\e0\e7?\00\00\00\00\00\00\00\00\00\90\dc|\f0\be\d2?\f4\04PJ\fa\9c*=\00\00\00\00\00\c0\e7?\00\00\00\00\00\00\00\00\00`\d3\e1\f1\14\d3?\b8\a7)\b1&p\9c\e9\84D\bb.9\d6\919A~_\b4\8b_\84\9c\f49S\83\ff\97\f8\1f;(\f9\bd\8b\11/\ef\0f\98\05\de\cf~6m\1fm\nZf?FO\b7\t\cb\'\c7\ba\'u-\ea_\9e\f79\07={\f1\e5\eb\b1_\fbk\ea\92R\8aF0\03V\08]\8d\1f \bc\cf\f0\abk{\fca\91\e3\a9\1d6\f4\9a_\85\99e\08\1b\e6^\80\d8\ff\8d@h\a0\14W\15\06\061\'sM") + (data (i32.const 272) " \00\00\00\01\00\00\00\03\00\00\00 \00\00\00)\15DNn\83\f9\a2\c0\dd4\f5\d1W\'\fcA\90C<\99\95b\dba\c5\bb\de\abcQ\fe") + (data (i32.const 320) "\18\00\00\00\01\00\00\00\01\00\00\00\18\00\00\00~\00l\00i\00b\00/\00m\00a\00t\00h\00.\00t\00s\00") + (data (i32.const 368) "(\00\00\00\01\00\00\00\01\00\00\00(\00\00\00P\00R\00N\00G\00 \00m\00u\00s\00t\00 \00b\00e\00 \00s\00e\00e\00d\00e\00d\00.\00") (table $0 1 funcref) (global $std/math/js i32 (i32.const 1)) (global $std/math/INEXACT i32 (i32.const 1)) @@ -111,7 +102,6 @@ (global $~lib/math/rempio2f_y (mut f64) (f64.const 0)) (global $~lib/builtins/f32.MAX_VALUE f32 (f32.const 3402823466385288598117041e14)) (global $~lib/builtins/f64.MIN_VALUE f64 (f64.const 5e-324)) - (global $~lib/util/math/log_tail (mut f64) (f64.const 0)) (global $~lib/math/random_seeded (mut i32) (i32.const 0)) (global $~lib/math/random_state0_64 (mut i64) (i64.const 0)) (global $~lib/math/random_state1_64 (mut i64) (i64.const 0)) @@ -1282,9 +1272,9 @@ f64.add ) (func $~lib/math/NativeMath.log (; 51 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 f64) + (local $1 i64) + (local $2 i32) + (local $3 i32) (local $4 f64) (local $5 f64) (local $6 f64) @@ -1293,310 +1283,202 @@ (local $9 f64) (local $10 f64) (local $11 f64) - (local $12 i32) - (local $13 i64) - (local $14 i32) - (local $15 i64) - (local $16 i64) - (local $17 f64) - (local $18 f64) - block $~lib/util/math/log_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $12 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + i32.const 0 + local.set $3 + local.get $2 + i32.const 1048576 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $2 - i64.const 4606619468846596096 - i64.sub - i64.const 854320534781952 - i64.lt_u + i32.const 31 + i32.shr_u + end + if + local.get $1 + i64.const 1 + i64.shl + i64.const 0 + i64.eq if - local.get $1 - f64.const 1 - f64.sub - local.set $3 - local.get $3 - local.get $3 - f64.mul - local.set $4 - local.get $4 - local.get $3 - f64.mul - local.set $5 - local.get $5 - f64.const 0.3333333333333352 - local.get $3 - f64.const -0.24999999999998432 - f64.mul - f64.add - local.get $4 - f64.const 0.19999999999320328 - f64.mul - f64.add - local.get $5 - f64.const -0.16666666669929706 - local.get $3 - f64.const 0.14285715076560868 - f64.mul - f64.add - local.get $4 - f64.const -0.12499997863982555 - f64.mul - f64.add - local.get $5 - f64.const 0.11110712032936046 - local.get $3 - f64.const -0.10000486757818193 - f64.mul - f64.add - local.get $4 - f64.const 0.09181994006195467 - f64.mul - f64.add - local.get $5 - f64.const -0.08328363062289341 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - f64.mul - local.set $6 - local.get $3 - f64.const 134217728 - f64.mul - local.set $7 - local.get $3 - local.get $7 - f64.add - local.get $7 - f64.sub - local.set $8 - local.get $3 - local.get $8 - f64.sub - local.set $9 - local.get $8 - local.get $8 - f64.mul - f64.const -0.5 - f64.mul - local.set $7 - local.get $3 - local.get $7 - f64.add - local.set $10 - local.get $3 - local.get $10 - f64.sub - local.get $7 - f64.add - local.set $11 - local.get $11 - f64.const -0.5 - local.get $9 - f64.mul - local.get $8 - local.get $3 - f64.add + f64.const -1 + local.get $0 + local.get $0 f64.mul - f64.add - local.set $11 - local.get $6 - local.get $11 - f64.add - local.get $10 - f64.add - br $~lib/util/math/log_lut|inlined.0 + f64.div + return end local.get $2 - i64.const 48 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.div + return + end + local.get $3 + i32.const 54 + i32.sub + local.set $3 + local.get $0 + f64.const 18014398509481984 + f64.mul + local.set $0 + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 i64.shr_u i32.wrap_i64 - local.set $12 - local.get $12 - i32.const 16 - i32.sub - i32.const 32736 + local.set $2 + else + local.get $2 + i32.const 2146435072 i32.ge_u if + local.get $0 + return + else local.get $2 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const -1 - local.get $1 - local.get $1 - f64.mul - f64.div - br $~lib/util/math/log_lut|inlined.0 - end - local.get $2 - i64.const 9218868437227405312 - i64.eq - if - local.get $1 - br $~lib/util/math/log_lut|inlined.0 - end - local.get $12 - i32.const 32768 - i32.and + i32.const 1072693248 + i32.eq if (result i32) - i32.const 1 + local.get $1 + i64.const 32 + i64.shl + i64.const 0 + i64.eq else - local.get $12 - i32.const 32752 - i32.and - i32.const 32752 - i32.eq + i32.const 0 end if - local.get $1 - local.get $1 - f64.sub - local.get $1 - local.get $1 - f64.sub - f64.div - br $~lib/util/math/log_lut|inlined.0 + f64.const 0 + return end - local.get $1 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $2 end - local.get $2 - i64.const 4604367669032910848 - i64.sub - local.set $13 - local.get $13 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $14 - local.get $13 - i64.const 52 - i64.shr_s - local.set $15 - local.get $2 - local.get $13 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $16 - i32.const 80 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $11 - i32.const 80 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $10 - local.get $16 - f64.reinterpret_i64 - local.set $9 - i32.const 2144 - local.get $14 - i32.const 4 - i32.shl - i32.add - f64.load - local.set $8 - i32.const 2144 - local.get $14 - i32.const 4 - i32.shl - i32.add - f64.load offset=8 - local.set $7 - local.get $9 - local.get $8 - f64.sub - local.get $7 - f64.sub - local.get $11 - f64.mul - local.set $6 - local.get $15 - f64.convert_i64_s - local.set $5 - local.get $5 - f64.const 0.6931471805598903 - f64.mul - local.get $10 - f64.add - local.set $4 - local.get $4 - local.get $6 - f64.add - local.set $3 - local.get $4 - local.get $3 - f64.sub - local.get $6 - f64.add - local.get $5 - f64.const 5.497923018708371e-14 - f64.mul - f64.add - local.set $17 - local.get $6 - local.get $6 - f64.mul - local.set $18 - local.get $17 - local.get $18 - f64.const -0.5000000000000001 - f64.mul - f64.add - local.get $6 - local.get $18 - f64.mul - f64.const 0.33333333331825593 - local.get $6 - f64.const -0.2499999999622955 - f64.mul - f64.add - local.get $18 - f64.const 0.20000304511814496 - local.get $6 - f64.const -0.16667054827627667 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - local.get $3 - f64.add end + local.get $2 + i32.const 1072693248 + i32.const 1072079006 + i32.sub + i32.add + local.set $2 + local.get $3 + local.get $2 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $3 + local.get $2 + i32.const 1048575 + i32.and + i32.const 1072079006 + i32.add + local.set $2 + local.get $2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get $1 + i64.const 4294967295 + i64.and + i64.or + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $0 + f64.const 1 + f64.sub + local.set $4 + f64.const 0.5 + local.get $4 + f64.mul + local.get $4 + f64.mul + local.set $5 + local.get $4 + f64.const 2 + local.get $4 + f64.add + f64.div + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $7 + local.get $7 + f64.mul + local.set $8 + local.get $8 + f64.const 0.3999999999940942 + local.get $8 + f64.const 0.22222198432149784 + local.get $8 + f64.const 0.15313837699209373 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $9 + local.get $7 + f64.const 0.6666666666666735 + local.get $8 + f64.const 0.2857142874366239 + local.get $8 + f64.const 0.1818357216161805 + local.get $8 + f64.const 0.14798198605116586 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $10 + local.get $10 + local.get $9 + f64.add + local.set $11 + local.get $3 + f64.convert_i32_s + local.set $12 + local.get $6 + local.get $5 + local.get $11 + f64.add + f64.mul + local.get $12 + f64.const 1.9082149292705877e-10 + f64.mul + f64.add + local.get $5 + f64.sub + local.get $4 + f64.add + local.get $12 + f64.const 0.6931471803691238 + f64.mul + f64.add return ) (func $~lib/math/NativeMath.acosh (; 52 ;) (param $0 f64) (result f64) @@ -1893,168 +1775,172 @@ f32.add ) (func $~lib/math/NativeMathf.log (; 55 ;) (param $0 f32) (result f32) - (local $1 f32) + (local $1 i32) (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 f64) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (local $12 f64) - (local $13 f64) - block $~lib/util/math/logf_lut|inlined.0 (result f32) - local.get $0 - local.set $1 + (local $3 f32) + (local $4 f32) + (local $5 f32) + (local $6 f32) + (local $7 f32) + (local $8 f32) + (local $9 f32) + (local $10 f32) + (local $11 f32) + local.get $0 + i32.reinterpret_f32 + local.set $1 + i32.const 0 + local.set $2 + local.get $1 + i32.const 8388608 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $1 - i32.reinterpret_f32 - local.set $2 + i32.const 31 + i32.shr_u + end + if + local.get $1 + i32.const 1 + i32.shl + i32.const 0 + i32.eq + if + f32.const -1 + local.get $0 + local.get $0 + f32.mul + f32.div + return + end + local.get $1 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f32.sub + f32.const 0 + f32.div + return + end local.get $2 - i32.const 8388608 + i32.const 25 i32.sub - i32.const 2130706432 + local.set $2 + local.get $0 + f32.const 33554432 + f32.mul + local.set $0 + local.get $0 + i32.reinterpret_f32 + local.set $1 + else + local.get $1 + i32.const 2139095040 i32.ge_u if - local.get $2 - i32.const 1 - i32.shl - i32.const 0 - i32.eq - if - f32.const inf - f32.neg - br $~lib/util/math/logf_lut|inlined.0 - end - local.get $2 - i32.const 2139095040 + local.get $0 + return + else + local.get $1 + i32.const 1065353216 i32.eq if - local.get $1 - br $~lib/util/math/logf_lut|inlined.0 - end - local.get $2 - i32.const 31 - i32.shr_u - if (result i32) - i32.const 1 - else - local.get $2 - i32.const 1 - i32.shl - i32.const -16777216 - i32.ge_u - end - if - local.get $1 - local.get $1 - f32.sub - local.get $1 - local.get $1 - f32.sub - f32.div - br $~lib/util/math/logf_lut|inlined.0 + f32.const 0 + return end - local.get $1 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - local.set $2 - local.get $2 - i32.const 23 - i32.const 23 - i32.shl - i32.sub - local.set $2 end - local.get $2 - i32.const 1060306944 - i32.sub - local.set $3 - local.get $3 - i32.const 23 - i32.const 4 - i32.sub - i32.shr_u - i32.const 15 - i32.and - local.set $4 - local.get $3 - i32.const 23 - i32.shr_s - local.set $5 - local.get $2 - local.get $3 - i32.const 511 - i32.const 23 - i32.shl - i32.and - i32.sub - local.set $6 - i32.const 4208 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $7 - i32.const 4208 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $8 - local.get $6 - f32.reinterpret_i32 - f64.promote_f32 - local.set $9 - local.get $9 - local.get $7 - f64.mul - f64.const 1 - f64.sub - local.set $10 - local.get $8 - local.get $5 - f64.convert_i32_s - f64.const 0.6931471805599453 - f64.mul - f64.add - local.set $11 - local.get $10 - local.get $10 - f64.mul - local.set $12 - f64.const 0.333456765744066 - local.get $10 - f64.mul - f64.const -0.4999997485802103 - f64.add - local.set $13 - f64.const -0.25089342214237154 - local.get $12 - f64.mul - local.get $13 - f64.add - local.set $13 - local.get $13 - local.get $12 - f64.mul - local.get $11 - local.get $10 - f64.add - f64.add - local.set $13 - local.get $13 - f32.demote_f64 end + local.get $1 + i32.const 1065353216 + i32.const 1060439283 + i32.sub + i32.add + local.set $1 + local.get $2 + local.get $1 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + i32.add + local.set $2 + local.get $1 + i32.const 8388607 + i32.and + i32.const 1060439283 + i32.add + local.set $1 + local.get $1 + f32.reinterpret_i32 + local.set $0 + local.get $0 + f32.const 1 + f32.sub + local.set $3 + local.get $3 + f32.const 2 + local.get $3 + f32.add + f32.div + local.set $4 + local.get $4 + local.get $4 + f32.mul + local.set $5 + local.get $5 + local.get $5 + f32.mul + local.set $6 + local.get $6 + f32.const 0.40000972151756287 + local.get $6 + f32.const 0.24279078841209412 + f32.mul + f32.add + f32.mul + local.set $7 + local.get $5 + f32.const 0.6666666269302368 + local.get $6 + f32.const 0.2849878668785095 + f32.mul + f32.add + f32.mul + local.set $8 + local.get $8 + local.get $7 + f32.add + local.set $9 + f32.const 0.5 + local.get $3 + f32.mul + local.get $3 + f32.mul + local.set $10 + local.get $2 + f32.convert_i32_s + local.set $11 + local.get $4 + local.get $10 + local.get $9 + f32.add + f32.mul + local.get $11 + f32.const 9.05800061445916e-06 + f32.mul + f32.add + local.get $10 + f32.sub + local.get $3 + f32.add + local.get $11 + f32.const 0.6931381225585938 + f32.mul + f32.add return ) (func $~lib/math/NativeMathf.acosh (; 56 ;) (param $0 f32) (result f32) @@ -4230,7 +4116,7 @@ i64.const 63 i64.and local.set $4 - i32.const 4480 + i32.const 80 local.get $3 i64.const 6 i64.shr_s @@ -5543,7 +5429,7 @@ i32.and i64.extend_i32_s local.set $14 - i32.const 4688 + i32.const 288 local.get $13 i32.const 6 i32.shr_s @@ -6056,280 +5942,169 @@ f64.mul ) (func $~lib/math/NativeMath.exp (; 90 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 i32) + (local $1 i32) + (local $2 i32) + (local $3 f64) (local $4 f64) - (local $5 f64) - (local $6 i64) + (local $5 i32) + (local $6 f64) (local $7 f64) - (local $8 i32) - (local $9 i64) - (local $10 f64) - (local $11 i64) - (local $12 f64) - (local $13 f64) - (local $14 i64) - (local $15 i64) - (local $16 f64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - block $~lib/util/math/exp_lut|inlined.0 (result f64) + (local $8 f64) + (local $9 f64) + local.get $0 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $1 + local.get $1 + i32.const 31 + i32.shr_u + local.set $2 + local.get $1 + i32.const 2147483647 + i32.and + local.set $1 + local.get $1 + i32.const 1082532651 + i32.ge_u + if local.get $0 - local.set $1 + local.get $0 + f64.ne + if + local.get $0 + return + end + local.get $0 + f64.const 709.782712893384 + f64.gt + if + local.get $0 + f64.const 8988465674311579538646525e283 + f64.mul + return + end + local.get $0 + f64.const -745.1332191019411 + f64.lt + if + f64.const 0 + return + end + end + f64.const 0 + local.set $4 + i32.const 0 + local.set $5 + local.get $1 + i32.const 1071001154 + i32.gt_u + if local.get $1 - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - i32.wrap_i64 - local.set $3 - local.get $3 - i32.const 969 - i32.sub - i32.const 63 + i32.const 1072734898 i32.ge_u if - local.get $3 - i32.const 969 + f64.const 1.4426950408889634 + local.get $0 + f64.mul + f64.const 0.5 + local.get $0 + f64.copysign + f64.add + i32.trunc_f64_s + local.set $5 + else + i32.const 1 + local.get $2 + i32.const 1 + i32.shl i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const 1 - br $~lib/util/math/exp_lut|inlined.0 - end - local.get $3 - i32.const 1033 - i32.ge_u - if - local.get $2 - i64.const -4503599627370496 - i64.eq - if - f64.const 0 - br $~lib/util/math/exp_lut|inlined.0 - end - local.get $3 - i32.const 2047 - i32.ge_u - if - f64.const 1 - local.get $1 - f64.add - br $~lib/util/math/exp_lut|inlined.0 - end - f64.const 0 - f64.const inf - local.get $2 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - select - br $~lib/util/math/exp_lut|inlined.0 - end - i32.const 0 - local.set $3 + local.set $5 end - f64.const 184.6649652337873 - local.get $1 - f64.mul - local.set $4 - local.get $4 - f64.const 6755399441055744 - f64.add - local.set $5 - local.get $5 - i64.reinterpret_f64 - local.set $6 - local.get $5 - f64.const 6755399441055744 - f64.sub - local.set $5 - local.get $1 + local.get $0 local.get $5 - f64.const -0.005415212348111709 + f64.convert_i32_s + f64.const 0.6931471803691238 f64.mul - f64.add + f64.sub + local.set $3 local.get $5 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $7 - local.get $6 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $8 - local.get $6 - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $9 - i32.const 4736 - local.get $8 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $10 - i32.const 4736 - local.get $8 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $9 - i64.add - local.set $11 - local.get $7 - local.get $7 - f64.mul - local.set $12 - local.get $10 - local.get $7 - f64.add - local.get $12 - f64.const 0.49999999999996786 - local.get $7 - f64.const 0.16666666666665886 - f64.mul - f64.add - f64.mul - f64.add - local.get $12 - local.get $12 - f64.mul - f64.const 0.0416666808410674 - local.get $7 - f64.const 0.008333335853059549 - f64.mul - f64.add + f64.convert_i32_s + f64.const 1.9082149292705877e-10 f64.mul - f64.add - local.set $13 + local.set $4 local.get $3 - i32.const 0 - i32.eq + local.get $4 + f64.sub + local.set $0 + else + local.get $1 + i32.const 1043333120 + i32.gt_u if - block $~lib/util/math/specialcase|inlined.0 (result f64) - local.get $13 - local.set $16 - local.get $11 - local.set $15 - local.get $6 - local.set $14 - local.get $14 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $15 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $15 - local.get $15 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $16 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.0 - end - local.get $15 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $15 - local.get $15 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $16 - f64.mul - f64.add - local.set $18 - local.get $18 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $18 - f64.copysign - local.set $19 - local.get $17 - local.get $18 - f64.sub - local.get $17 - local.get $16 - f64.mul - f64.add - local.set $20 - local.get $19 - local.get $18 - f64.add - local.set $21 - local.get $19 - local.get $21 - f64.sub - local.get $18 - f64.add - local.get $20 - f64.add - local.set $20 - local.get $21 - local.get $20 - f64.add - local.get $19 - f64.sub - local.set $18 - local.get $18 - f64.const 0 - f64.eq - if - local.get $15 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $18 - end - end - local.get $18 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp_lut|inlined.0 + local.get $0 + local.set $3 + else + f64.const 1 + local.get $0 + f64.add + return end - local.get $11 - f64.reinterpret_i64 - local.set $18 - local.get $18 - local.get $18 - local.get $13 - f64.mul - f64.add + end + local.get $0 + local.get $0 + f64.mul + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $0 + local.get $6 + f64.const 0.16666666666666602 + f64.mul + local.get $7 + f64.const -2.7777777777015593e-03 + local.get $6 + f64.const 6.613756321437934e-05 + f64.mul + f64.add + local.get $7 + f64.const -1.6533902205465252e-06 + local.get $6 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.sub + local.set $8 + f64.const 1 + local.get $0 + local.get $8 + f64.mul + f64.const 2 + local.get $8 + f64.sub + f64.div + local.get $4 + f64.sub + local.get $3 + f64.add + f64.add + local.set $9 + local.get $5 + i32.const 0 + i32.eq + if (result f64) + local.get $9 + else + local.get $9 + local.get $5 + call $~lib/math/NativeMath.scalbn end return ) @@ -6740,133 +6515,154 @@ f32.mul ) (func $~lib/math/NativeMathf.exp (; 94 ;) (param $0 f32) (result f32) - (local $1 f32) - (local $2 f64) - (local $3 i32) - (local $4 i32) - (local $5 f64) - (local $6 f64) - (local $7 i64) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 i64) - block $~lib/util/math/expf_lut|inlined.0 (result f32) - local.get $0 - local.set $1 + (local $1 i32) + (local $2 i32) + (local $3 f32) + (local $4 f32) + (local $5 i32) + (local $6 f32) + (local $7 f32) + (local $8 f32) + local.get $0 + i32.reinterpret_f32 + local.set $1 + local.get $1 + i32.const 31 + i32.shr_u + local.set $2 + local.get $1 + i32.const 2147483647 + i32.and + local.set $1 + local.get $1 + i32.const 1118743632 + i32.ge_u + if local.get $1 - f64.promote_f32 - local.set $2 + i32.const 2139095040 + i32.gt_u + if + local.get $0 + return + end local.get $1 - i32.reinterpret_f32 - local.set $3 - local.get $3 - i32.const 20 - i32.shr_u - i32.const 2047 - i32.and - local.set $4 - local.get $4 - i32.const 1067 + i32.const 1118925336 i32.ge_u if - local.get $3 - i32.const -8388608 - i32.eq - if - f32.const 0 - br $~lib/util/math/expf_lut|inlined.0 - end - local.get $4 - i32.const 2040 - i32.ge_u - if - local.get $1 - local.get $1 - f32.add - br $~lib/util/math/expf_lut|inlined.0 - end - local.get $1 - f32.const 88.72283172607422 - f32.gt + local.get $2 + i32.eqz if - local.get $1 + local.get $0 f32.const 1701411834604692317316873e14 f32.mul - br $~lib/util/math/expf_lut|inlined.0 - end - local.get $1 - f32.const -103.97207641601562 - f32.lt - if - f32.const 0 - br $~lib/util/math/expf_lut|inlined.0 + return + else + local.get $1 + i32.const 1120924085 + i32.ge_u + if + f32.const 0 + return + end end end - f64.const 46.16624130844683 - local.get $2 - f64.mul - local.set $5 + end + local.get $1 + i32.const 1051816472 + i32.gt_u + if + local.get $1 + i32.const 1065686418 + i32.gt_u + if + f32.const 1.4426950216293335 + local.get $0 + f32.mul + f32.const 0.5 + local.get $0 + f32.copysign + f32.add + i32.trunc_f32_s + local.set $5 + else + i32.const 1 + local.get $2 + i32.const 1 + i32.shl + i32.sub + local.set $5 + end + local.get $0 local.get $5 - f64.const 6755399441055744 - f64.add - local.set $6 - local.get $6 - i64.reinterpret_f64 - local.set $7 + f32.convert_i32_s + f32.const 0.693145751953125 + f32.mul + f32.sub + local.set $3 local.get $5 - local.get $6 - f64.const 6755399441055744 - f64.sub - f64.sub - local.set $8 - i32.const 6800 - local.get $7 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl - i32.add - i64.load - local.set $11 - local.get $11 - local.get $7 - i64.const 52 - i64.const 5 - i64.sub - i64.shl - i64.add - local.set $11 - local.get $11 - f64.reinterpret_i64 - local.set $9 - f64.const 1.6938359250920212e-06 + f32.convert_i32_s + f32.const 1.428606765330187e-06 + f32.mul + local.set $4 + local.get $3 + local.get $4 + f32.sub + local.set $0 + else + local.get $1 + i32.const 956301312 + i32.gt_u + if + i32.const 0 + local.set $5 + local.get $0 + local.set $3 + f32.const 0 + local.set $4 + else + f32.const 1 + local.get $0 + f32.add + return + end + end + local.get $0 + local.get $0 + f32.mul + local.set $6 + local.get $0 + local.get $6 + f32.const 0.16666625440120697 + local.get $6 + f32.const -2.7667332906275988e-03 + f32.mul + f32.add + f32.mul + f32.sub + local.set $7 + f32.const 1 + local.get $0 + local.get $7 + f32.mul + f32.const 2 + local.get $7 + f32.sub + f32.div + local.get $4 + f32.sub + local.get $3 + f32.add + f32.add + local.set $8 + local.get $5 + i32.const 0 + i32.eq + if (result f32) local.get $8 - f64.mul - f64.const 2.3459809789509004e-04 - f64.add - local.set $5 - f64.const 0.021660849396613134 + else local.get $8 - f64.mul - f64.const 1 - f64.add - local.set $10 - local.get $10 local.get $5 - local.get $8 - local.get $8 - f64.mul - f64.mul - f64.add - local.set $10 - local.get $10 - local.get $9 - f64.mul - local.set $10 - local.get $10 - f32.demote_f64 + call $~lib/math/NativeMathf.scalbn end return ) @@ -7019,276 +6815,12 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.exp2 (; 101 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 i32) + (func $std/math/test_floor (; 101 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) (local $4 f64) - (local $5 i64) - (local $6 f64) - (local $7 i32) - (local $8 i64) - (local $9 f64) - (local $10 i64) - (local $11 f64) - (local $12 f64) - (local $13 i64) - (local $14 i64) - (local $15 f64) - (local $16 f64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - block $~lib/util/math/exp2_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - i32.wrap_i64 - local.set $3 - local.get $3 - i32.const 969 - i32.sub - i32.const 63 - i32.ge_u - if - local.get $3 - i32.const 969 - i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const 1 - br $~lib/util/math/exp2_lut|inlined.0 - end - local.get $3 - i32.const 1033 - i32.ge_u - if - local.get $2 - i64.const -4503599627370496 - i64.eq - if - f64.const 0 - br $~lib/util/math/exp2_lut|inlined.0 - end - local.get $3 - i32.const 2047 - i32.ge_u - if - f64.const 1 - local.get $1 - f64.add - br $~lib/util/math/exp2_lut|inlined.0 - end - local.get $2 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - i32.eqz - if - f64.const inf - br $~lib/util/math/exp2_lut|inlined.0 - else - local.get $2 - i64.const -4570929321408987136 - i64.ge_u - if - f64.const 0 - br $~lib/util/math/exp2_lut|inlined.0 - end - end - end - local.get $2 - i64.const 1 - i64.shl - i64.const -9143996093422370816 - i64.gt_u - if - i32.const 0 - local.set $3 - end - end - local.get $1 - f64.const 52776558133248 - f64.add - local.set $4 - local.get $4 - i64.reinterpret_f64 - local.set $5 - local.get $4 - f64.const 52776558133248 - f64.sub - local.set $4 - local.get $1 - local.get $4 - f64.sub - local.set $6 - local.get $5 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $7 - local.get $5 - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $8 - i32.const 4736 - local.get $7 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $9 - i32.const 4736 - local.get $7 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $8 - i64.add - local.set $10 - local.get $6 - local.get $6 - f64.mul - local.set $11 - local.get $9 - local.get $6 - f64.const 0.6931471805599453 - f64.mul - f64.add - local.get $11 - f64.const 0.24022650695909065 - local.get $6 - f64.const 0.0555041086686087 - f64.mul - f64.add - f64.mul - f64.add - local.get $11 - local.get $11 - f64.mul - f64.const 0.009618131975721055 - local.get $6 - f64.const 1.3332074570119598e-03 - f64.mul - f64.add - f64.mul - f64.add - local.set $12 - local.get $3 - i32.const 0 - i32.eq - if - block $~lib/util/math/specialcase2|inlined.0 (result f64) - local.get $12 - local.set $15 - local.get $10 - local.set $14 - local.get $5 - local.set $13 - local.get $13 - i64.const 2147483648 - i64.and - i64.const 0 - i64.eq - if - local.get $14 - i64.const 1 - i64.const 52 - i64.shl - i64.sub - local.set $14 - local.get $14 - f64.reinterpret_i64 - local.set $16 - f64.const 2 - local.get $16 - local.get $15 - f64.mul - local.get $16 - f64.add - f64.mul - br $~lib/util/math/specialcase2|inlined.0 - end - local.get $14 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $14 - local.get $14 - f64.reinterpret_i64 - local.set $16 - local.get $16 - local.get $15 - f64.mul - local.get $16 - f64.add - local.set $17 - local.get $17 - f64.const 1 - f64.lt - if - local.get $16 - local.get $17 - f64.sub - local.get $16 - local.get $15 - f64.mul - f64.add - local.set $19 - f64.const 1 - local.get $17 - f64.add - local.set $18 - f64.const 1 - local.get $18 - f64.sub - local.get $17 - f64.add - local.get $19 - f64.add - local.set $19 - local.get $18 - local.get $19 - f64.add - f64.const 1 - f64.sub - local.set $17 - end - local.get $17 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp2_lut|inlined.0 - end - local.get $10 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $12 - f64.mul - local.get $17 - f64.add - end - ) - (func $std/math/test_exp2 (; 102 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 - call $~lib/math/NativeMath.exp2 + local.set $4 + local.get $4 + f64.floor local.get $1 local.get $2 local.get $3 @@ -7299,9 +6831,8 @@ if (result i32) i32.const 1 else - f64.const 2 local.get $0 - call $~lib/bindings/Math/pow + call $~lib/bindings/Math/floor local.get $1 local.get $2 local.get $3 @@ -7311,243 +6842,85 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.exp2 (; 103 ;) (param $0 f32) (result f32) - (local $1 f32) - (local $2 f64) - (local $3 i32) - (local $4 i32) - (local $5 f64) - (local $6 i64) + (func $std/math/test_floorf (; 102 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (local $4 f32) + local.get $0 + local.set $4 + local.get $4 + f32.floor + local.get $1 + local.get $2 + local.get $3 + call $std/math/check + ) + (func $~lib/math/NativeMath.hypot (; 103 ;) (param $0 f64) (param $1 f64) (result f64) + (local $2 i64) + (local $3 i64) + (local $4 i64) + (local $5 i32) + (local $6 i32) (local $7 f64) - (local $8 i64) + (local $8 f64) (local $9 f64) (local $10 f64) - block $~lib/util/math/exp2f_lut|inlined.0 (result f32) - local.get $0 - local.set $1 - local.get $1 - f64.promote_f32 + (local $11 f64) + (local $12 f64) + (local $13 f64) + (local $14 f64) + local.get $0 + i64.reinterpret_f64 + local.set $2 + local.get $1 + i64.reinterpret_f64 + local.set $3 + local.get $2 + i64.const 9223372036854775807 + i64.and + local.set $2 + local.get $3 + i64.const 9223372036854775807 + i64.and + local.set $3 + local.get $2 + local.get $3 + i64.lt_u + if + local.get $2 + local.set $4 + local.get $3 local.set $2 - local.get $1 - i32.reinterpret_f32 + local.get $4 local.set $3 - local.get $3 - i32.const 20 - i32.shr_u - i32.const 2047 - i32.and - local.set $4 - local.get $4 - i32.const 1072 - i32.ge_u - if - local.get $3 - i32.const -8388608 - i32.eq - if - f32.const 0 - br $~lib/util/math/exp2f_lut|inlined.0 - end - local.get $4 - i32.const 2040 - i32.ge_u - if - local.get $1 - local.get $1 - f32.add - br $~lib/util/math/exp2f_lut|inlined.0 - end - local.get $1 - f32.const 0 - f32.gt - if - local.get $1 - f32.const 1701411834604692317316873e14 - f32.mul - br $~lib/util/math/exp2f_lut|inlined.0 - end - local.get $1 - f32.const -150 - f32.le - if - f32.const 0 - br $~lib/util/math/exp2f_lut|inlined.0 - end - end - local.get $2 - f64.const 211106232532992 - f64.add - local.set $5 - local.get $5 - i64.reinterpret_f64 - local.set $6 - local.get $2 - local.get $5 - f64.const 211106232532992 - f64.sub - f64.sub - local.set $7 - i32.const 6800 - local.get $6 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl - i32.add - i64.load - local.set $8 - local.get $8 - local.get $6 - i64.const 52 - i64.const 5 - i64.sub - i64.shl - i64.add - local.set $8 - local.get $8 - f64.reinterpret_i64 - local.set $10 - f64.const 0.6931471806916203 - local.get $7 - f64.mul - f64.const 1 - f64.add - local.set $9 - local.get $9 - f64.const 0.05550361559341535 - local.get $7 - f64.mul - f64.const 0.2402284522445722 - f64.add - local.get $7 - local.get $7 - f64.mul - f64.mul - f64.add - local.set $9 - local.get $9 - local.get $10 - f64.mul - local.set $9 - local.get $9 - f32.demote_f64 - end - ) - (func $std/math/test_exp2f (; 104 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) - local.get $0 - call $~lib/math/NativeMathf.exp2 - local.get $1 - local.get $2 - local.get $3 - call $std/math/check - ) - (func $std/math/test_floor (; 105 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) - (local $4 f64) - local.get $0 - local.set $4 - local.get $4 - f64.floor - local.get $1 - local.get $2 - local.get $3 - call $std/math/check - if (result i32) - global.get $std/math/js - i32.eqz - if (result i32) - i32.const 1 - else - local.get $0 - call $~lib/bindings/Math/floor - local.get $1 - local.get $2 - local.get $3 - call $std/math/check - end - else - i32.const 0 - end - ) - (func $std/math/test_floorf (; 106 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) - (local $4 f32) - local.get $0 - local.set $4 - local.get $4 - f32.floor - local.get $1 - local.get $2 - local.get $3 - call $std/math/check - ) - (func $~lib/math/NativeMath.hypot (; 107 ;) (param $0 f64) (param $1 f64) (result f64) - (local $2 i64) - (local $3 i64) - (local $4 i64) - (local $5 i32) - (local $6 i32) - (local $7 f64) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (local $12 f64) - (local $13 f64) - (local $14 f64) - local.get $0 - i64.reinterpret_f64 - local.set $2 - local.get $1 - i64.reinterpret_f64 - local.set $3 - local.get $2 - i64.const 9223372036854775807 - i64.and - local.set $2 - local.get $3 - i64.const 9223372036854775807 - i64.and - local.set $3 - local.get $2 - local.get $3 - i64.lt_u - if - local.get $2 - local.set $4 - local.get $3 - local.set $2 - local.get $4 - local.set $3 - end - local.get $2 - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $5 - local.get $3 - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $6 - local.get $3 - f64.reinterpret_i64 - local.set $1 - local.get $6 - i32.const 2047 - i32.eq - if - local.get $1 - return - end - local.get $2 - f64.reinterpret_i64 - local.set $0 - local.get $5 - i32.const 2047 - i32.eq - if (result i32) - i32.const 1 - else + end + local.get $2 + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $3 + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $6 + local.get $3 + f64.reinterpret_i64 + local.set $1 + local.get $6 + i32.const 2047 + i32.eq + if + local.get $1 + return + end + local.get $2 + f64.reinterpret_i64 + local.set $0 + local.get $5 + i32.const 2047 + i32.eq + if (result i32) + i32.const 1 + else local.get $3 i64.const 0 i64.eq @@ -7675,7 +7048,7 @@ f64.sqrt f64.mul ) - (func $std/math/test_hypot (; 108 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) + (func $std/math/test_hypot (; 104 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.hypot @@ -7684,7 +7057,7 @@ local.get $4 call $std/math/check ) - (func $~lib/math/NativeMathf.hypot (; 109 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.hypot (; 105 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -7801,7 +7174,7 @@ f32.sqrt f32.mul ) - (func $std/math/test_hypotf (; 110 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) + (func $std/math/test_hypotf (; 106 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.hypot @@ -7810,7 +7183,7 @@ local.get $4 call $std/math/check ) - (func $std/math/test_log (; 111 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_log (; 107 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.log local.get $1 @@ -7834,7 +7207,7 @@ i32.const 0 end ) - (func $std/math/test_logf (; 112 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_logf (; 108 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.log local.get $1 @@ -7842,7 +7215,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.log10 (; 113 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.log10 (; 109 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -8102,7 +7475,7 @@ local.get $8 f64.add ) - (func $std/math/test_log10 (; 114 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_log10 (; 110 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.log10 local.get $1 @@ -8126,7 +7499,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.log10 (; 115 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.log10 (; 111 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f32) @@ -8326,7 +7699,7 @@ f32.mul f32.add ) - (func $std/math/test_log10f (; 116 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_log10f (; 112 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.log10 local.get $1 @@ -8334,7 +7707,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_log1p (; 117 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_log1p (; 113 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.log1p local.get $1 @@ -8358,7 +7731,7 @@ i32.const 0 end ) - (func $std/math/test_log1pf (; 118 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_log1pf (; 114 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.log1p local.get $1 @@ -8366,10 +7739,10 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.log2 (; 119 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 f64) + (func $~lib/math/NativeMath.log2 (; 115 ;) (param $0 f64) (result f64) + (local $1 i64) + (local $2 i32) + (local $3 i32) (local $4 f64) (local $5 f64) (local $6 f64) @@ -8378,338 +7751,249 @@ (local $9 f64) (local $10 f64) (local $11 f64) - (local $12 i32) - (local $13 i64) - (local $14 i32) - (local $15 i64) - (local $16 i64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - (local $22 f64) - (local $23 f64) - block $~lib/util/math/log2_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $12 f64) + (local $13 f64) + (local $14 f64) + (local $15 f64) + (local $16 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + i32.const 0 + local.set $3 + local.get $2 + i32.const 1048576 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $2 - i64.const 4606800540372828160 - i64.sub - i64.const 581272283906048 - i64.lt_u + i32.const 31 + i32.shr_u + end + if + local.get $1 + i64.const 1 + i64.shl + i64.const 0 + i64.eq if - local.get $1 - f64.const 1 - f64.sub - local.set $3 - local.get $3 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $4 - local.get $3 - local.get $4 - f64.sub - local.set $5 - local.get $4 - f64.const 1.4426950407214463 - f64.mul - local.set $6 - local.get $5 - f64.const 1.4426950407214463 - f64.mul - local.get $3 - f64.const 1.6751713164886512e-10 - f64.mul - f64.add - local.set $7 - local.get $3 - local.get $3 - f64.mul - local.set $8 - local.get $8 - local.get $8 - f64.mul - local.set $9 - local.get $8 - f64.const -0.7213475204444817 - local.get $3 - f64.const 0.48089834696298744 - f64.mul - f64.add - f64.mul - local.set $10 - local.get $6 - local.get $10 - f64.add - local.set $11 - local.get $7 - local.get $6 - local.get $11 - f64.sub - local.get $10 - f64.add - f64.add - local.set $7 - local.get $7 - local.get $9 - f64.const -0.360673760222145 - local.get $3 - f64.const 0.2885390081805197 - f64.mul - f64.add - local.get $8 - f64.const -0.24044917405728863 - local.get $3 - f64.const 0.2060992861022954 - f64.mul - f64.add - f64.mul - f64.add - local.get $9 - f64.const -0.18033596705327856 - local.get $3 - f64.const 0.1603032746063156 - f64.mul - f64.add - local.get $8 - f64.const -0.14483316576701266 - local.get $3 - f64.const 0.13046826811283835 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add + f64.const -1 + local.get $0 + local.get $0 f64.mul - f64.add - local.set $7 - local.get $11 - local.get $7 - f64.add - br $~lib/util/math/log2_lut|inlined.0 + f64.div + return end local.get $2 - i64.const 48 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.div + return + end + local.get $3 + i32.const 54 + i32.sub + local.set $3 + local.get $0 + f64.const 18014398509481984 + f64.mul + local.set $0 + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 i64.shr_u i32.wrap_i64 - local.set $12 - local.get $12 - i32.const 16 - i32.sub - i32.const 32736 + local.set $2 + else + local.get $2 + i32.const 2146435072 i32.ge_u if + local.get $0 + return + else local.get $2 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const -1 - local.get $1 - local.get $1 - f64.mul - f64.div - br $~lib/util/math/log2_lut|inlined.0 - end - local.get $2 - i64.const 9218868437227405312 - i64.eq - if - local.get $1 - br $~lib/util/math/log2_lut|inlined.0 - end - local.get $12 - i32.const 32768 - i32.and + i32.const 1072693248 + i32.eq if (result i32) - i32.const 1 + local.get $1 + i64.const 32 + i64.shl + i64.const 0 + i64.eq else - local.get $12 - i32.const 32752 - i32.and - i32.const 32752 - i32.eq + i32.const 0 end if - local.get $1 - local.get $1 - f64.sub - local.get $1 - local.get $1 - f64.sub - f64.div - br $~lib/util/math/log2_lut|inlined.0 + f64.const 0 + return end - local.get $1 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $2 end - local.get $2 - i64.const 4604367669032910848 - i64.sub - local.set $13 - local.get $13 - i64.const 52 - i64.const 6 - i64.sub - i64.shr_u - i64.const 63 - i64.and - i32.wrap_i64 - local.set $14 - local.get $13 - i64.const 52 - i64.shr_s - local.set $15 - local.get $2 - local.get $13 - i64.const -4503599627370496 - i64.and - i64.sub - local.set $16 - i32.const 7072 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $11 - i32.const 7072 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $10 - local.get $16 - f64.reinterpret_i64 - local.set $9 - local.get $15 - f64.convert_i64_s - local.set $8 - i32.const 8112 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $7 - i32.const 8112 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $6 - local.get $9 - local.get $7 - f64.sub - local.get $6 - f64.sub - local.get $11 - f64.mul - local.set $5 - local.get $5 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $4 - local.get $5 - local.get $4 - f64.sub - local.set $3 - local.get $4 - f64.const 1.4426950407214463 - f64.mul - local.set $17 - local.get $3 - f64.const 1.4426950407214463 - f64.mul - local.get $5 - f64.const 1.6751713164886512e-10 - f64.mul - f64.add - local.set $18 - local.get $8 - local.get $10 - f64.add - local.set $19 - local.get $19 - local.get $17 - f64.add - local.set $20 - local.get $19 - local.get $20 - f64.sub - local.get $17 - f64.add - local.get $18 - f64.add - local.set $21 - local.get $5 - local.get $5 - f64.mul - local.set $22 - f64.const -0.7213475204444882 - local.get $5 - f64.const 0.4808983469629985 - f64.mul - f64.add - local.get $22 - f64.const -0.36067375954075914 - local.get $5 - f64.const 0.2885390073180969 - f64.mul - f64.add - f64.mul - f64.add - local.get $22 - local.get $22 - f64.mul - f64.const -0.2404693555628422 - local.get $5 - f64.const 0.2061202382173603 - f64.mul - f64.add - f64.mul - f64.add - local.set $23 - local.get $21 - local.get $22 - local.get $23 - f64.mul - f64.add - local.get $20 - f64.add end + local.get $2 + i32.const 1072693248 + i32.const 1072079006 + i32.sub + i32.add + local.set $2 + local.get $3 + local.get $2 + i32.const 20 + i32.shr_u + i32.const 1023 + i32.sub + i32.add + local.set $3 + local.get $2 + i32.const 1048575 + i32.and + i32.const 1072079006 + i32.add + local.set $2 + local.get $2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get $1 + i64.const 4294967295 + i64.and + i64.or + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $0 + f64.const 1 + f64.sub + local.set $4 + f64.const 0.5 + local.get $4 + f64.mul + local.get $4 + f64.mul + local.set $5 + local.get $4 + f64.const 2 + local.get $4 + f64.add + f64.div + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $7 + local.get $7 + f64.mul + local.set $8 + local.get $8 + f64.const 0.3999999999940942 + local.get $8 + f64.const 0.22222198432149784 + local.get $8 + f64.const 0.15313837699209373 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $9 + local.get $7 + f64.const 0.6666666666666735 + local.get $8 + f64.const 0.2857142874366239 + local.get $8 + f64.const 0.1818357216161805 + local.get $8 + f64.const 0.14798198605116586 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $10 + local.get $10 + local.get $9 + f64.add + local.set $11 + local.get $4 + local.get $5 + f64.sub + local.set $12 + local.get $12 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const -4294967296 + i64.and + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $12 + local.get $4 + local.get $12 + f64.sub + local.get $5 + f64.sub + local.get $6 + local.get $5 + local.get $11 + f64.add + f64.mul + f64.add + local.set $13 + local.get $12 + f64.const 1.4426950407214463 + f64.mul + local.set $14 + local.get $13 + local.get $12 + f64.add + f64.const 1.6751713164886512e-10 + f64.mul + local.get $13 + f64.const 1.4426950407214463 + f64.mul + f64.add + local.set $15 + local.get $3 + f64.convert_i32_s + local.set $16 + local.get $16 + local.get $14 + f64.add + local.set $8 + local.get $15 + local.get $16 + local.get $8 + f64.sub + local.get $14 + f64.add + f64.add + local.set $15 + local.get $8 + local.set $14 + local.get $15 + local.get $14 + f64.add return ) - (func $std/math/test_log2 (; 120 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_log2 (; 116 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.log2 local.get $1 @@ -8733,176 +8017,203 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.log2 (; 121 ;) (param $0 f32) (result f32) - (local $1 f32) + (func $~lib/math/NativeMathf.log2 (; 117 ;) (param $0 f32) (result f32) + (local $1 i32) (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (local $12 f64) - (local $13 f64) - (local $14 f64) - (local $15 f64) - block $~lib/util/math/log2f_lut|inlined.0 (result f32) - local.get $0 - local.set $1 + (local $3 f32) + (local $4 f32) + (local $5 f32) + (local $6 f32) + (local $7 f32) + (local $8 f32) + (local $9 f32) + (local $10 f32) + (local $11 f32) + (local $12 i32) + (local $13 f32) + (local $14 f32) + local.get $0 + i32.reinterpret_f32 + local.set $1 + i32.const 0 + local.set $2 + local.get $1 + i32.const 8388608 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $1 - i32.reinterpret_f32 - local.set $2 + i32.const 31 + i32.shr_u + end + if + local.get $1 + i32.const 1 + i32.shl + i32.const 0 + i32.eq + if + f32.const -1 + local.get $0 + local.get $0 + f32.mul + f32.div + return + end + local.get $1 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f32.sub + f32.const 0 + f32.div + return + end local.get $2 - i32.const 8388608 + i32.const 25 i32.sub - i32.const 2130706432 + local.set $2 + local.get $0 + f32.const 33554432 + f32.mul + local.set $0 + local.get $0 + i32.reinterpret_f32 + local.set $1 + else + local.get $1 + i32.const 2139095040 i32.ge_u if - local.get $2 - i32.const 1 - i32.shl - i32.const 0 - i32.eq - if - f32.const inf - f32.neg - br $~lib/util/math/log2f_lut|inlined.0 - end - local.get $2 - i32.const 2139095040 + local.get $0 + return + else + local.get $1 + i32.const 1065353216 i32.eq if - local.get $1 - br $~lib/util/math/log2f_lut|inlined.0 - end - local.get $2 - i32.const 31 - i32.shr_u - if (result i32) - i32.const 1 - else - local.get $2 - i32.const 1 - i32.shl - i32.const -16777216 - i32.ge_u - end - if - local.get $1 - local.get $1 - f32.sub - local.get $1 - local.get $1 - f32.sub - f32.div - br $~lib/util/math/log2f_lut|inlined.0 + f32.const 0 + return end - local.get $1 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - local.set $2 - local.get $2 - i32.const 23 - i32.const 23 - i32.shl - i32.sub - local.set $2 end - local.get $2 - i32.const 1060306944 - i32.sub - local.set $3 - local.get $3 - i32.const 23 - i32.const 4 - i32.sub - i32.shr_u - i32.const 15 - i32.and - local.set $4 - local.get $3 - i32.const -8388608 - i32.and - local.set $5 - local.get $2 - local.get $5 - i32.sub - local.set $6 - local.get $3 - i32.const 23 - i32.shr_s - local.set $7 - i32.const 9152 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $8 - i32.const 9152 - local.get $4 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $9 - local.get $6 - f32.reinterpret_i32 - f64.promote_f32 - local.set $10 - local.get $10 - local.get $8 - f64.mul - f64.const 1 - f64.sub - local.set $11 - local.get $9 - local.get $7 - f64.convert_i32_s - f64.add - local.set $12 - local.get $11 - local.get $11 - f64.mul - local.set $13 - f64.const 0.4811247078767291 - local.get $11 - f64.mul - f64.const -0.7213476299867769 - f64.add - local.set $14 - f64.const 1.4426950186867042 - local.get $11 - f64.mul - local.get $12 - f64.add - local.set $15 - f64.const -0.36051725506874704 - local.get $13 - f64.mul - local.get $14 - f64.add - local.set $14 - local.get $14 - local.get $13 - f64.mul - local.get $15 - f64.add - local.set $14 - local.get $14 - f32.demote_f64 end + local.get $1 + i32.const 1065353216 + i32.const 1060439283 + i32.sub + i32.add + local.set $1 + local.get $2 + local.get $1 + i32.const 23 + i32.shr_u + i32.const 127 + i32.sub + i32.add + local.set $2 + local.get $1 + i32.const 8388607 + i32.and + i32.const 1060439283 + i32.add + local.set $1 + local.get $1 + f32.reinterpret_i32 + local.set $0 + local.get $0 + f32.const 1 + f32.sub + local.set $3 + local.get $3 + f32.const 2 + local.get $3 + f32.add + f32.div + local.set $4 + local.get $4 + local.get $4 + f32.mul + local.set $5 + local.get $5 + local.get $5 + f32.mul + local.set $6 + local.get $6 + f32.const 0.40000972151756287 + local.get $6 + f32.const 0.24279078841209412 + f32.mul + f32.add + f32.mul + local.set $7 + local.get $5 + f32.const 0.6666666269302368 + local.get $6 + f32.const 0.2849878668785095 + f32.mul + f32.add + f32.mul + local.set $8 + local.get $8 + local.get $7 + f32.add + local.set $9 + f32.const 0.5 + local.get $3 + f32.mul + local.get $3 + f32.mul + local.set $10 + local.get $3 + local.get $10 + f32.sub + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $12 + local.get $12 + i32.const -4096 + i32.and + local.set $12 + local.get $12 + f32.reinterpret_i32 + local.set $11 + local.get $3 + local.get $11 + f32.sub + local.get $10 + f32.sub + local.get $4 + local.get $10 + local.get $9 + f32.add + f32.mul + f32.add + local.set $13 + local.get $2 + f32.convert_i32_s + local.set $14 + local.get $13 + local.get $11 + f32.add + f32.const -1.7605285393074155e-04 + f32.mul + local.get $13 + f32.const 1.44287109375 + f32.mul + f32.add + local.get $11 + f32.const 1.44287109375 + f32.mul + f32.add + local.get $14 + f32.add return ) - (func $std/math/test_log2f (; 122 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_log2f (; 118 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.log2 local.get $1 @@ -8910,7 +8221,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_max (; 123 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) + (func $std/math/test_max (; 119 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) (local $5 f64) (local $6 f64) local.get $0 @@ -8942,7 +8253,7 @@ i32.const 0 end ) - (func $std/math/test_maxf (; 124 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) + (func $std/math/test_maxf (; 120 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) (local $5 f32) (local $6 f32) local.get $0 @@ -8957,7 +8268,7 @@ local.get $4 call $std/math/check ) - (func $std/math/test_min (; 125 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) + (func $std/math/test_min (; 121 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) (local $5 f64) (local $6 f64) local.get $0 @@ -8989,7 +8300,7 @@ i32.const 0 end ) - (func $std/math/test_minf (; 126 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) + (func $std/math/test_minf (; 122 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) (local $5 f32) (local $6 f32) local.get $0 @@ -9004,7 +8315,7 @@ local.get $4 call $std/math/check ) - (func $~lib/math/NativeMath.mod (; 127 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.mod (; 123 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 i64) (local $3 i64) (local $4 i64) @@ -9258,7 +8569,7 @@ local.get $2 f64.reinterpret_i64 ) - (func $std/math/test_mod (; 128 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) + (func $std/math/test_mod (; 124 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.mod @@ -9284,7 +8595,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.mod (; 129 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.mod (; 125 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9532,7 +8843,7 @@ local.get $2 f32.reinterpret_i32 ) - (func $std/math/test_modf (; 130 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) + (func $std/math/test_modf (; 126 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.mod @@ -9541,20 +8852,20 @@ local.get $4 call $std/math/check ) - (func $~lib/math/NativeMath.pow (; 131 ;) (param $0 f64) (param $1 f64) (result f64) - (local $2 f64) - (local $3 f64) + (func $~lib/math/NativeMath.pow (; 127 ;) (param $0 f64) (param $1 f64) (result f64) + (local $2 i64) + (local $3 i32) (local $4 i32) - (local $5 i64) - (local $6 i64) - (local $7 i64) - (local $8 i64) - (local $9 i64) - (local $10 f64) - (local $11 i64) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) (local $12 i32) - (local $13 i64) - (local $14 i64) + (local $13 i32) + (local $14 f64) (local $15 f64) (local $16 f64) (local $17 f64) @@ -9577,14 +8888,6 @@ (local $34 f64) (local $35 f64) (local $36 f64) - (local $37 f64) - (local $38 f64) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i64) - (local $44 i64) local.get $1 f64.abs f64.const 2 @@ -9638,1481 +8941,2060 @@ return end end - block $~lib/util/math/pow_lut|inlined.0 (result f64) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i64.reinterpret_f64 - local.set $5 - local.get $2 - i64.reinterpret_f64 - local.set $6 - local.get $5 - i64.const 52 - i64.shr_u - local.set $7 - local.get $6 - i64.const 52 - i64.shr_u - local.set $8 + local.get $0 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $3 + local.get $2 + i32.wrap_i64 + local.set $4 + local.get $1 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $2 + i32.wrap_i64 + local.set $6 + local.get $3 + i32.const 2147483647 + i32.and + local.set $7 + local.get $5 + i32.const 2147483647 + i32.and + local.set $8 + local.get $8 + local.get $6 + i32.or + i32.const 0 + i32.eq + if + f64.const 1 + return + end + local.get $7 + i32.const 2146435072 + i32.gt_s + if (result i32) + i32.const 1 + else local.get $7 - i64.const 1 - i64.sub - i64.const 2046 - i64.ge_u + i32.const 2146435072 + i32.eq if (result i32) - i32.const 1 + local.get $4 + i32.const 0 + i32.ne else - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + i32.const 0 end - if + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.gt_s + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.eq + if (result i32) local.get $6 + i32.const 0 + i32.ne + else + i32.const 0 + end + end + if + local.get $0 + local.get $1 + f64.add + return + end + i32.const 0 + local.set $9 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $8 + i32.const 1128267776 + i32.ge_s + if + i32.const 2 local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + else + local.get $8 + i32.const 1072693248 + i32.ge_s if + local.get $8 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 52 + i32.const 20 + local.get $10 + i32.const 20 + i32.gt_s + select + local.get $10 + i32.sub + local.set $11 local.get $6 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - end - if - local.get $3 - local.get $2 - f64.add - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.lt_u - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - i32.eqz + local.get $8 + local.get $10 + i32.const 20 + i32.gt_s + select + local.set $12 + local.get $12 + local.get $11 + i32.shr_u + local.set $13 + local.get $13 + local.get $11 + i32.shl + local.get $12 i32.eq if - f64.const 0 - br $~lib/util/math/pow_lut|inlined.0 + i32.const 2 + local.get $13 + i32.const 1 + i32.and + i32.sub + local.set $9 end - local.get $2 - local.get $2 - f64.mul - br $~lib/util/math/pow_lut|inlined.0 end - local.get $5 - local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + end + end + local.get $6 + i32.const 0 + i32.eq + if + local.get $8 + i32.const 2146435072 + i32.eq + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $4 + i32.or + i32.const 0 + i32.eq if - local.get $3 - local.get $3 - f64.mul - local.set $10 - local.get $5 - i64.const 63 - i64.shr_u - i32.wrap_i64 - if (result i32) - block $~lib/util/math/checkint|inlined.0 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.0 - end - i64.const 1 - i64.const 1075 - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.0 - end - i32.const 2 + f64.const nan:0x8000000000000 + return + else + local.get $7 + i32.const 1072693248 + i32.ge_s + if + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + local.get $1 + else + f64.const 0 end - i32.const 1 - i32.eq + return else + local.get $5 i32.const 0 + i32.ge_s + if (result f64) + f64.const 0 + else + local.get $1 + f64.neg + end + return end - if - local.get $10 - f64.neg - local.set $10 - end - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - f64.const 1 - local.get $10 - f64.div - else - local.get $10 - end - br $~lib/util/math/pow_lut|inlined.0 + unreachable end + unreachable + end + local.get $8 + i32.const 1072693248 + i32.eq + if local.get $5 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne + i32.const 0 + i32.ge_s if - block $~lib/util/math/checkint|inlined.1 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.1 - end - i64.const 1 - i64.const 1023 - i64.const 52 - i64.add - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.1 - end - i32.const 2 - end - local.set $12 - local.get $12 + local.get $0 + return + end + f64.const 1 + local.get $0 + f64.div + return + end + local.get $5 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f64.mul + return + end + local.get $5 + i32.const 1071644672 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if + local.get $0 + f64.sqrt + return + end + end + end + local.get $0 + f64.abs + local.set $14 + local.get $4 + i32.const 0 + i32.eq + if + local.get $7 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 2146435072 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 1072693248 + i32.eq + end + if + local.get $14 + local.set $15 + local.get $5 + i32.const 0 + i32.lt_s + if + f64.const 1 + local.get $15 + f64.div + local.set $15 + end + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $9 + i32.or i32.const 0 i32.eq if - local.get $3 - local.get $3 - f64.sub - local.get $3 - local.get $3 + local.get $15 + local.get $15 f64.sub + local.set $16 + local.get $16 + local.get $16 f64.div - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $12 - i32.const 1 - i32.eq - if - i32.const 262144 - local.set $4 + local.set $15 + else + local.get $9 + i32.const 1 + i32.eq + if + local.get $15 + f64.neg + local.set $15 + end end - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $7 - i64.const 2047 - i64.and - local.set $7 end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + local.get $15 + return + end + end + f64.const 1 + local.set $16 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $9 + i32.const 0 + i32.eq + if + local.get $0 + local.get $0 + f64.sub + local.set $17 + local.get $17 + local.get $17 + f64.div + return + end + local.get $9 + i32.const 1 + i32.eq + if + f64.const -1 + local.set $16 + end + end + local.get $8 + i32.const 1105199104 + i32.gt_s + if + local.get $8 + i32.const 1139802112 + i32.gt_s + if + local.get $7 + i32.const 1072693247 + i32.le_s if local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.lt_u - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.gt_u - local.get $8 - i64.const 2048 - i64.lt_u - i32.eq + i32.const 0 + i32.lt_s if (result f64) - f64.const inf + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul else - f64.const 0 + f64.const 1e-300 + f64.const 1e-300 + f64.mul end - br $~lib/util/math/pow_lut|inlined.0 + return end local.get $7 - i64.const 0 - i64.eq + i32.const 1072693248 + i32.ge_s if - local.get $3 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $5 - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 local.get $5 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $5 + i32.const 0 + i32.gt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return end end - local.get $5 - local.set $9 - local.get $9 - i64.const 4604531861337669632 - i64.sub - local.set $11 - local.get $11 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $12 - local.get $11 - i64.const 52 - i64.shr_s - local.set $13 - local.get $9 - local.get $11 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $14 + local.get $7 + i32.const 1072693247 + i32.lt_s + if + local.get $5 + i32.const 0 + i32.lt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.gt_s + if + local.get $5 + i32.const 0 + i32.gt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end local.get $14 + f64.const 1 + f64.sub + local.set $22 + local.get $22 + local.get $22 + f64.mul + f64.const 0.5 + local.get $22 + f64.const 0.3333333333333333 + local.get $22 + f64.const 0.25 + f64.mul + f64.sub + f64.mul + f64.sub + f64.mul + local.set $25 + f64.const 1.4426950216293335 + local.get $22 + f64.mul + local.set $23 + local.get $22 + f64.const 1.9259629911266175e-08 + f64.mul + local.get $25 + f64.const 1.4426950408889634 + f64.mul + f64.sub + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and f64.reinterpret_i64 - local.set $10 - local.get $13 - f64.convert_i64_s - local.set $15 - i32.const 9424 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $16 - i32.const 9424 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=16 local.set $17 - i32.const 9424 + local.get $24 + local.get $17 + local.get $23 + f64.sub + f64.sub + local.set $18 + else + i32.const 0 + local.set $12 + local.get $7 + i32.const 1048576 + i32.lt_s + if + local.get $14 + f64.const 9007199254740992 + f64.mul + local.set $14 + local.get $12 + i32.const 53 + i32.sub + local.set $12 + local.get $14 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $7 + end local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl + local.get $7 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub i32.add - f64.load offset=24 - local.set $18 + local.set $12 + local.get $7 + i32.const 1048575 + i32.and + local.set $13 + local.get $13 + i32.const 1072693248 + i32.or + local.set $7 + local.get $13 + i32.const 235662 + i32.le_s + if + i32.const 0 + local.set $10 + else + local.get $13 + i32.const 767610 + i32.lt_s + if + i32.const 1 + local.set $10 + else + i32.const 0 + local.set $10 + local.get $12 + i32.const 1 + i32.add + local.set $12 + local.get $7 + i32.const 1048576 + i32.sub + local.set $7 + end + end local.get $14 - i64.const 2147483648 - i64.add - i64.const -4294967296 + i64.reinterpret_f64 + i64.const 4294967295 i64.and + local.get $7 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or f64.reinterpret_i64 - local.set $19 - local.get $10 - local.get $19 - f64.sub - local.set $20 - local.get $19 - local.get $16 - f64.mul + local.set $14 + f64.const 1.5 f64.const 1 + local.get $10 + select + local.set $32 + local.get $14 + local.get $32 f64.sub - local.set $21 - local.get $20 - local.get $16 - f64.mul - local.set $22 - local.get $21 - local.get $22 - f64.add local.set $23 - local.get $15 - f64.const 0.6931471805598903 - f64.mul - local.get $17 + f64.const 1 + local.get $14 + local.get $32 f64.add + f64.div local.set $24 - local.get $24 local.get $23 - f64.add - local.set $25 - local.get $15 - f64.const 5.497923018708371e-14 + local.get $24 f64.mul - local.get $18 - f64.add local.set $26 - local.get $24 - local.get $25 + local.get $26 + local.set $28 + local.get $28 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $28 + local.get $7 + i32.const 1 + i32.shr_s + i32.const 536870912 + i32.or + i32.const 524288 + i32.add + local.get $10 + i32.const 18 + i32.shl + i32.add + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $30 + local.get $14 + local.get $30 + local.get $32 f64.sub + f64.sub + local.set $31 + local.get $24 local.get $23 - f64.add - local.set $27 - f64.const -0.5 - local.get $23 + local.get $28 + local.get $30 f64.mul - local.set $28 - local.get $23 + f64.sub local.get $28 + local.get $31 + f64.mul + f64.sub f64.mul local.set $29 - local.get $23 - local.get $29 + local.get $26 + local.get $26 f64.mul - local.set $30 - f64.const -0.5 - local.get $21 + local.set $27 + local.get $27 + local.get $27 f64.mul - local.set $31 - local.get $21 - local.get $31 + f64.const 0.5999999999999946 + local.get $27 + f64.const 0.4285714285785502 + local.get $27 + f64.const 0.33333332981837743 + local.get $27 + f64.const 0.272728123808534 + local.get $27 + f64.const 0.23066074577556175 + local.get $27 + f64.const 0.20697501780033842 f64.mul - local.set $32 - local.get $25 - local.get $32 f64.add - local.set $33 - local.get $22 - local.get $28 - local.get $31 + f64.mul f64.add f64.mul - local.set $34 - local.get $25 - local.get $33 - f64.sub - local.get $32 f64.add - local.set $35 - local.get $30 - f64.const -0.6666666666666679 - local.get $23 - f64.const 0.5000000000000007 f64.mul f64.add - local.get $29 - f64.const 0.7999999995323976 - local.get $23 - f64.const -0.6666666663487739 f64.mul f64.add - local.get $29 - f64.const -1.142909628459501 - local.get $23 - f64.const 1.0000415263675542 f64.mul + local.set $21 + local.get $21 + local.get $29 + local.get $28 + local.get $26 f64.add f64.mul f64.add + local.set $21 + local.get $28 + local.get $28 f64.mul + local.set $27 + f64.const 3 + local.get $27 + f64.add + local.get $21 f64.add + local.set $30 + local.get $30 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $30 + local.get $21 + local.get $30 + f64.const 3 + f64.sub + local.get $27 + f64.sub + f64.sub + local.set $31 + local.get $28 + local.get $30 f64.mul - local.set $36 + local.set $23 + local.get $29 + local.get $30 + f64.mul + local.get $31 local.get $26 - local.get $27 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $19 + local.get $19 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $19 + local.get $24 + local.get $19 + local.get $23 + f64.sub + f64.sub + local.set $20 + f64.const 0.9617967009544373 + local.get $19 + f64.mul + local.set $33 + f64.const 1.350039202129749e-08 + f64.const 0 + local.get $10 + select + local.set $34 + f64.const -7.028461650952758e-09 + local.get $19 + f64.mul + local.get $20 + f64.const 0.9617966939259756 + f64.mul f64.add local.get $34 f64.add + local.set $35 + local.get $12 + f64.convert_i32_s + local.set $22 + f64.const 0.5849624872207642 + f64.const 0 + local.get $10 + select + local.set $36 + local.get $33 local.get $35 f64.add local.get $36 f64.add - local.set $37 - local.get $33 - local.get $37 + local.get $22 f64.add - local.set $38 + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $17 + local.get $35 + local.get $17 + local.get $22 + f64.sub + local.get $36 + f64.sub local.get $33 - local.get $38 f64.sub - local.get $37 + f64.sub + local.set $18 + end + local.get $1 + local.set $36 + local.get $36 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $36 + local.get $1 + local.get $36 + f64.sub + local.get $17 + f64.mul + local.get $1 + local.get $18 + f64.mul + f64.add + local.set $20 + local.get $36 + local.get $17 + f64.mul + local.set $19 + local.get $20 + local.get $19 + f64.add + local.set $15 + local.get $15 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $2 + i32.wrap_i64 + local.set $11 + local.get $13 + i32.const 1083179008 + i32.ge_s + if + local.get $13 + i32.const 1083179008 + i32.sub + local.get $11 + i32.or + i32.const 0 + i32.ne + if + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + return + end + local.get $20 + f64.const 8.008566259537294e-17 f64.add - global.set $~lib/util/math/log_tail - local.get $38 - local.set $38 - global.get $~lib/util/math/log_tail - local.set $37 - local.get $6 - i64.const -134217728 - i64.and + local.get $15 + local.get $19 + f64.sub + f64.gt + if + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + return + end + else + local.get $13 + i32.const 2147483647 + i32.and + i32.const 1083231232 + i32.ge_s + if + local.get $13 + i32.const -1064252416 + i32.sub + local.get $11 + i32.or + i32.const 0 + i32.ne + if + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return + end + local.get $20 + local.get $15 + local.get $19 + f64.sub + f64.le + if + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return + end + end + end + local.get $13 + i32.const 2147483647 + i32.and + local.set $11 + local.get $11 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 0 + local.set $12 + local.get $11 + i32.const 1071644672 + i32.gt_s + if + local.get $13 + i32.const 1048576 + local.get $10 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.set $12 + local.get $12 + i32.const 2147483647 + i32.and + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + f64.const 0 + local.set $22 + local.get $12 + i32.const 1048575 + local.get $10 + i32.shr_s + i32.const -1 + i32.xor + i32.and + i64.extend_i32_s + i64.const 32 + i64.shl f64.reinterpret_i64 - local.set $34 - local.get $2 - local.get $34 + local.set $22 + local.get $12 + i32.const 1048575 + i32.and + i32.const 1048576 + i32.or + i32.const 20 + local.get $10 + i32.sub + i32.shr_s + local.set $12 + local.get $13 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $12 + i32.sub + local.set $12 + end + local.get $19 + local.get $22 f64.sub - local.set $33 - local.get $38 + local.set $19 + end + local.get $20 + local.get $19 + f64.add + local.set $22 + local.get $22 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $22 + local.get $22 + f64.const 0.6931471824645996 + f64.mul + local.set $23 + local.get $20 + local.get $22 + local.get $19 + f64.sub + f64.sub + f64.const 0.6931471805599453 + f64.mul + local.get $22 + f64.const -1.904654299957768e-09 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $15 + local.get $24 + local.get $15 + local.get $23 + f64.sub + f64.sub + local.set $25 + local.get $15 + local.get $15 + f64.mul + local.set $22 + local.get $15 + local.get $22 + f64.const 0.16666666666666602 + local.get $22 + f64.const -2.7777777777015593e-03 + local.get $22 + f64.const 6.613756321437934e-05 + local.get $22 + f64.const -1.6533902205465252e-06 + local.get $22 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.sub + local.set $17 + local.get $15 + local.get $17 + f64.mul + local.get $17 + f64.const 2 + f64.sub + f64.div + local.get $25 + local.get $15 + local.get $25 + f64.mul + f64.add + f64.sub + local.set $21 + f64.const 1 + local.get $21 + local.get $15 + f64.sub + f64.sub + local.set $15 + local.get $15 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $13 + local.get $12 + i32.const 20 + i32.shl + i32.add + local.set $13 + local.get $13 + i32.const 20 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $15 + local.get $12 + call $~lib/math/NativeMath.scalbn + local.set $15 + else + local.get $15 i64.reinterpret_f64 - i64.const -134217728 + i64.const 4294967295 i64.and + local.get $13 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or f64.reinterpret_i64 - local.set $32 - local.get $38 - local.get $32 - f64.sub - local.get $37 - f64.add - local.set $31 - local.get $34 - local.get $32 - f64.mul - local.set $36 - local.get $33 - local.get $32 - f64.mul - local.get $2 - local.get $31 - f64.mul - f64.add - local.set $35 - block $~lib/util/math/exp_inline|inlined.0 (result f64) - local.get $36 - local.set $15 - local.get $35 - local.set $10 + local.set $15 + end + local.get $16 + local.get $15 + f64.mul + return + ) + (func $std/math/test_pow (; 128 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) + local.get $0 + local.get $1 + call $~lib/math/NativeMath.pow + local.get $2 + local.get $3 + local.get $4 + call $std/math/check + if (result i32) + global.get $std/math/js + i32.eqz + if (result i32) + i32.const 1 + else + local.get $0 + local.get $1 + call $~lib/bindings/Math/pow + local.get $2 + local.get $3 local.get $4 - local.set $12 - local.get $15 - i64.reinterpret_f64 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i32.wrap_i64 - i32.const 2047 - i32.and - local.set $39 - local.get $39 - i32.const 969 - i32.sub - i32.const 63 - i32.ge_u + call $std/math/check + end + else + i32.const 0 + end + ) + (func $~lib/math/NativeMathf.pow (; 129 ;) (param $0 f32) (param $1 f32) (result f32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 f32) + (local $11 f32) + (local $12 f32) + (local $13 f32) + (local $14 f32) + (local $15 f32) + (local $16 f32) + (local $17 f32) + (local $18 f32) + (local $19 f32) + (local $20 f32) + (local $21 f32) + (local $22 f32) + (local $23 f32) + (local $24 i32) + (local $25 i32) + (local $26 f32) + (local $27 f32) + (local $28 f32) + (local $29 f32) + (local $30 f32) + (local $31 f32) + (local $32 f32) + (local $33 f32) + (local $34 f32) + (local $35 f32) + (local $36 i32) + local.get $1 + f32.abs + f32.const 2 + f32.le + if + local.get $1 + f32.const 2 + f32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $1 + f32.const 0.5 + f32.eq + if + local.get $0 + f32.sqrt + f32.abs + f32.const inf + local.get $0 + f32.const inf + f32.neg + f32.ne + select + return + end + local.get $1 + f32.const -1 + f32.eq + if + f32.const 1 + local.get $0 + f32.div + return + end + local.get $1 + f32.const 1 + f32.eq + if + local.get $0 + return + end + local.get $1 + f32.const 0 + f32.eq + if + f32.const 1 + return + end + end + local.get $0 + i32.reinterpret_f32 + local.set $2 + local.get $1 + i32.reinterpret_f32 + local.set $3 + local.get $2 + i32.const 2147483647 + i32.and + local.set $4 + local.get $3 + i32.const 2147483647 + i32.and + local.set $5 + local.get $5 + i32.const 0 + i32.eq + if + f32.const 1 + return + end + local.get $4 + i32.const 2139095040 + i32.gt_s + if (result i32) + i32.const 1 + else + local.get $5 + i32.const 2139095040 + i32.gt_s + end + if + local.get $0 + local.get $1 + f32.add + return + end + i32.const 0 + local.set $6 + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $5 + i32.const 1266679808 + i32.ge_s + if + i32.const 2 + local.set $6 + else + local.get $5 + i32.const 1065353216 + i32.ge_s if - local.get $39 - i32.const 969 + local.get $5 + i32.const 23 + i32.shr_s + i32.const 127 i32.sub - i32.const -2147483648 - i32.ge_u + local.set $8 + i32.const 23 + local.get $8 + i32.sub + local.set $9 + local.get $5 + local.get $9 + i32.shr_s + local.set $7 + local.get $7 + local.get $9 + i32.shl + local.get $5 + i32.eq if - f64.const -1 - f64.const 1 - local.get $12 - select - br $~lib/util/math/exp_inline|inlined.0 + i32.const 2 + local.get $7 + i32.const 1 + i32.and + i32.sub + local.set $6 end - local.get $39 - i32.const 1033 - i32.ge_u - if - local.get $9 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - local.get $12 - local.set $41 - local.get $41 - local.set $42 - i64.const 1152921504606846976 - f64.reinterpret_i64 - local.set $16 - local.get $16 - f64.neg - local.get $16 - local.get $42 - select - local.get $16 - f64.mul - else - local.get $12 - local.set $42 - local.get $42 - local.set $41 - i64.const 8070450532247928832 - f64.reinterpret_i64 - local.set $17 - local.get $17 - f64.neg - local.get $17 - local.get $41 - select - local.get $17 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 + end + end + end + local.get $5 + i32.const 2139095040 + i32.eq + if + local.get $4 + i32.const 1065353216 + i32.eq + if + f32.const nan:0x400000 + return + else + local.get $4 + i32.const 1065353216 + i32.gt_s + if + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + local.get $1 + else + f32.const 0 end + return + else + local.get $3 i32.const 0 - local.set $39 + i32.ge_s + if (result f32) + f32.const 0 + else + local.get $1 + f32.neg + end + return end - f64.const 184.6649652337873 - local.get $15 - f64.mul - local.set $29 - local.get $29 - f64.const 6755399441055744 - f64.add - local.set $30 - local.get $30 - i64.reinterpret_f64 - local.set $14 - local.get $30 - f64.const 6755399441055744 - f64.sub - local.set $30 - local.get $15 - local.get $30 - f64.const -0.005415212348111709 - f64.mul - f64.add - local.get $30 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $28 - local.get $28 - local.get $10 - f64.add - local.set $28 - local.get $14 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $40 - local.get $14 - local.get $12 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $13 - i32.const 4736 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $25 - i32.const 4736 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $13 - i64.add + unreachable + end + unreachable + end + local.get $5 + i32.const 1065353216 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + local.get $0 + else + f32.const 1 + local.get $0 + f32.div + end + return + end + local.get $3 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $3 + i32.const 1056964608 + i32.eq + if + local.get $2 + i32.const 0 + i32.ge_s + if + local.get $0 + f32.sqrt + return + end + end + local.get $0 + f32.abs + local.set $10 + local.get $4 + i32.const 2139095040 + i32.eq + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 0 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 1065353216 + i32.eq + end + if + local.get $10 + local.set $11 + local.get $3 + i32.const 0 + i32.lt_s + if + f32.const 1 + local.get $11 + f32.div local.set $11 - local.get $28 - local.get $28 - f64.mul - local.set $27 - local.get $25 - local.get $28 - f64.add - local.get $27 - f64.const 0.49999999999996786 - local.get $28 - f64.const 0.16666666666665886 - f64.mul - f64.add - f64.mul - f64.add - local.get $27 - local.get $27 - f64.mul - f64.const 0.0416666808410674 - local.get $28 - f64.const 0.008333335853059549 - f64.mul - f64.add - f64.mul - f64.add - local.set $24 - local.get $39 + end + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $4 + i32.const 1065353216 + i32.sub + local.get $6 + i32.or i32.const 0 i32.eq if - block $~lib/util/math/specialcase|inlined.1 (result f64) - local.get $24 - local.set $18 + local.get $11 + local.get $11 + f32.sub + local.set $12 + local.get $12 + local.get $12 + f32.div + local.set $11 + else + local.get $6 + i32.const 1 + i32.eq + if local.get $11 - local.set $44 - local.get $14 - local.set $43 - local.get $43 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $44 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.1 - end - local.get $44 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $16 - local.get $16 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $16 - f64.copysign - local.set $23 - local.get $17 - local.get $16 - f64.sub - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $22 - local.get $23 - local.get $16 - f64.add - local.set $21 - local.get $23 - local.get $21 - f64.sub - local.get $16 - f64.add - local.get $22 - f64.add - local.set $22 - local.get $21 - local.get $22 - f64.add - local.get $23 - f64.sub - local.set $16 - local.get $16 - f64.const 0 - f64.eq - if - local.get $44 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $16 - end - end - local.get $16 - f64.const 2.2250738585072014e-308 - f64.mul + f32.neg + local.set $11 end - br $~lib/util/math/exp_inline|inlined.0 end - local.get $11 - f64.reinterpret_i64 - local.set $26 - local.get $26 - local.get $26 - local.get $24 - f64.mul - f64.add end + local.get $11 + return end - return - ) - (func $std/math/test_pow (; 132 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) - local.get $0 - local.get $1 - call $~lib/math/NativeMath.pow + f32.const 1 + local.set $13 local.get $2 - local.get $3 - local.get $4 - call $std/math/check - if (result i32) - global.get $std/math/js - i32.eqz - if (result i32) - i32.const 1 - else - local.get $0 - local.get $1 - call $~lib/bindings/Math/pow - local.get $2 - local.get $3 - local.get $4 - call $std/math/check - end - else - i32.const 0 - end - ) - (func $~lib/math/NativeMathf.pow (; 133 ;) (param $0 f32) (param $1 f32) (result f32) - (local $2 f32) - (local $3 f32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 f32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 f64) - (local $16 f64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - (local $22 f64) - (local $23 i64) - (local $24 i64) - local.get $1 - f32.abs - f32.const 2 - f32.le + i32.const 0 + i32.lt_s if - local.get $1 - f32.const 2 - f32.eq - if - local.get $0 - local.get $0 - f32.mul - return - end - local.get $1 - f32.const 0.5 - f32.eq + local.get $6 + i32.const 0 + i32.eq if local.get $0 - f32.sqrt - f32.abs - f32.const inf local.get $0 - f32.const inf - f32.neg - f32.ne - select + f32.sub + local.set $12 + local.get $12 + local.get $12 + f32.div return end - local.get $1 - f32.const -1 - f32.eq + local.get $6 + i32.const 1 + i32.eq if - f32.const 1 - local.get $0 - f32.div - return + f32.const -1 + local.set $13 end - local.get $1 - f32.const 1 - f32.eq + end + local.get $5 + i32.const 1291845632 + i32.gt_s + if + local.get $4 + i32.const 1065353208 + i32.lt_s if - local.get $0 + local.get $3 + i32.const 0 + i32.lt_s + if (result f32) + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + else + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + end return end - local.get $1 - f32.const 0 - f32.eq + local.get $4 + i32.const 1065353223 + i32.gt_s if - f32.const 1 + local.get $3 + i32.const 0 + i32.gt_s + if (result f32) + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + else + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + end return end - end - block $~lib/util/math/powf_lut|inlined.0 (result f32) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i32.reinterpret_f32 - local.set $5 - local.get $2 + local.get $10 + f32.const 1 + f32.sub + local.set $18 + local.get $18 + local.get $18 + f32.mul + f32.const 0.5 + local.get $18 + f32.const 0.3333333432674408 + local.get $18 + f32.const 0.25 + f32.mul + f32.sub + f32.mul + f32.sub + f32.mul + local.set $21 + f32.const 1.44268798828125 + local.get $18 + f32.mul + local.set $19 + local.get $18 + f32.const 7.052607543300837e-06 + f32.mul + local.get $21 + f32.const 1.4426950216293335 + f32.mul + f32.sub + local.set $20 + local.get $19 + local.get $20 + f32.add + local.set $14 + local.get $14 i32.reinterpret_f32 - local.set $6 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $14 + local.get $20 + local.get $14 + local.get $19 + f32.sub + f32.sub + local.set $15 + else i32.const 0 - local.set $7 - local.get $5 + local.set $24 + local.get $4 i32.const 8388608 + i32.lt_s + if + local.get $10 + f32.const 16777216 + f32.mul + local.set $10 + local.get $24 + i32.const 24 + i32.sub + local.set $24 + local.get $10 + i32.reinterpret_f32 + local.set $4 + end + local.get $24 + local.get $4 + i32.const 23 + i32.shr_s + i32.const 127 i32.sub - i32.const 2130706432 - i32.ge_u - local.get $6 - local.set $8 - local.get $8 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - i32.const 0 - i32.ne - local.tee $7 + i32.add + local.set $24 + local.get $4 + i32.const 8388607 + i32.and + local.set $7 + local.get $7 + i32.const 1065353216 i32.or + local.set $4 + local.get $7 + i32.const 1885297 + i32.le_s if + i32.const 0 + local.set $8 + else local.get $7 + i32.const 6140887 + i32.lt_s if - local.get $6 - i32.const 1 - i32.shl - i32.const 0 - i32.eq - if - f32.const 1 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1065353216 - i32.eq - if - f32.const nan:0x400000 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - end - if - local.get $3 - local.get $2 - f32.add - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 i32.const 1 - i32.shl - i32.const 2130706432 - i32.eq - if - f32.const nan:0x400000 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const 2130706432 - i32.lt_u - local.get $6 - i32.const 31 - i32.shr_u - i32.eqz - i32.eq - if - f32.const 0 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $2 - local.get $2 - f32.mul - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - local.set $8 - local.get $8 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - if - local.get $3 - local.get $3 - f32.mul - local.set $9 - local.get $5 - i32.const 31 - i32.shr_u - if (result i32) - block $~lib/util/math/checkintf|inlined.0 (result i32) - local.get $6 - local.set $8 - local.get $8 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.set $10 - local.get $10 - i32.const 127 - i32.lt_u - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.0 - end - local.get $10 - i32.const 150 - i32.gt_u - if - i32.const 2 - br $~lib/util/math/checkintf|inlined.0 - end - i32.const 1 - i32.const 150 - local.get $10 - i32.sub - i32.shl - local.set $10 - local.get $8 - local.get $10 - i32.const 1 - i32.sub - i32.and - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.0 - end - local.get $8 - local.get $10 - i32.and - if - i32.const 1 - br $~lib/util/math/checkintf|inlined.0 - end - i32.const 2 - end - i32.const 1 - i32.eq - else - i32.const 0 - end - if - local.get $9 - f32.neg - local.set $9 - end - local.get $6 - i32.const 31 - i32.shr_u - if (result f32) - f32.const 1 - local.get $9 - f32.div - else - local.get $9 - end - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 31 - i32.shr_u - if - block $~lib/util/math/checkintf|inlined.1 (result i32) - local.get $6 - local.set $8 - local.get $8 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.set $10 - local.get $10 - i32.const 127 - i32.lt_u - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.1 - end - local.get $10 - i32.const 150 - i32.gt_u - if - i32.const 2 - br $~lib/util/math/checkintf|inlined.1 - end - i32.const 1 - i32.const 127 - i32.const 23 - i32.add - local.get $10 - i32.sub - i32.shl - local.set $10 - local.get $8 - local.get $10 - i32.const 1 - i32.sub - i32.and - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.1 - end - local.get $8 - local.get $10 - i32.and - if - i32.const 1 - br $~lib/util/math/checkintf|inlined.1 - end - i32.const 2 - end - local.set $10 - local.get $10 + local.set $8 + else i32.const 0 - i32.eq - if - local.get $3 - local.get $3 - f32.sub - local.get $3 - local.get $3 - f32.sub - f32.div - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $10 + local.set $8 + local.get $24 i32.const 1 - i32.eq - if - i32.const 65536 - local.set $4 - end - local.get $5 - i32.const 2147483647 - i32.and - local.set $5 - end - local.get $5 - i32.const 8388608 - i32.lt_u - if - local.get $3 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - local.set $5 - local.get $5 - i32.const 2147483647 - i32.and - local.set $5 - local.get $5 - i32.const 23 - i32.const 23 - i32.shl + i32.add + local.set $24 + local.get $4 + i32.const 8388608 i32.sub - local.set $5 + local.set $4 end end - local.get $5 - local.set $8 - local.get $8 - i32.const 1060306944 - i32.sub + local.get $4 + f32.reinterpret_i32 local.set $10 + f32.const 1.5 + f32.const 1 + local.get $8 + select + local.set $30 local.get $10 - i32.const 23 - i32.const 4 - i32.sub - i32.shr_u - i32.const 15 - i32.and - local.set $11 + local.get $30 + f32.sub + local.set $19 + f32.const 1 local.get $10 - i32.const -8388608 - i32.and - local.set $12 - local.get $8 - local.get $12 - i32.sub - local.set $13 - local.get $12 - i32.const 23 - i32.shr_s - local.set $14 - i32.const 9152 - local.get $11 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $15 - i32.const 9152 - local.get $11 + local.get $30 + f32.add + f32.div + local.set $20 + local.get $19 + local.get $20 + f32.mul + local.set $17 + local.get $17 + local.set $26 + local.get $26 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $26 + local.get $4 i32.const 1 - i32.const 3 + i32.shr_s + i32.const -4096 + i32.and + i32.const 536870912 + i32.or + local.set $25 + local.get $25 + i32.const 4194304 i32.add + local.get $8 + i32.const 21 i32.shl i32.add - f64.load offset=8 - local.set $16 - local.get $13 f32.reinterpret_i32 - f64.promote_f32 - local.set $17 + local.set $28 + local.get $10 + local.get $28 + local.get $30 + f32.sub + f32.sub + local.set $29 + local.get $20 + local.get $19 + local.get $26 + local.get $28 + f32.mul + f32.sub + local.get $26 + local.get $29 + f32.mul + f32.sub + f32.mul + local.set $27 local.get $17 - local.get $15 - f64.mul - f64.const 1 - f64.sub - local.set $18 + local.get $17 + f32.mul + local.set $12 + local.get $12 + local.get $12 + f32.mul + f32.const 0.6000000238418579 + local.get $12 + f32.const 0.4285714328289032 + local.get $12 + f32.const 0.3333333432674408 + local.get $12 + f32.const 0.2727281153202057 + local.get $12 + f32.const 0.23066075146198273 + local.get $12 + f32.const 0.20697501301765442 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + local.set $16 local.get $16 - local.get $14 - f64.convert_i32_s - f64.add + local.get $27 + local.get $26 + local.get $17 + f32.add + f32.mul + f32.add + local.set $16 + local.get $26 + local.get $26 + f32.mul + local.set $12 + f32.const 3 + local.get $12 + f32.add + local.get $16 + f32.add + local.set $28 + local.get $28 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $28 + local.get $16 + local.get $28 + f32.const 3 + f32.sub + local.get $12 + f32.sub + f32.sub + local.set $29 + local.get $26 + local.get $28 + f32.mul local.set $19 - f64.const 0.288457581109214 - local.get $18 - f64.mul - f64.const -0.36092606229713164 - f64.add + local.get $27 + local.get $28 + f32.mul + local.get $29 + local.get $17 + f32.mul + f32.add local.set $20 - f64.const 0.480898481472577 - local.get $18 - f64.mul - f64.const -0.7213474675006291 - f64.add - local.set $21 - f64.const 1.4426950408774342 - local.get $18 - f64.mul local.get $19 - f64.add + local.get $20 + f32.add local.set $22 - local.get $18 - local.get $18 - f64.mul - local.set $18 local.get $22 - local.get $21 - local.get $18 - f64.mul - f64.add + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 local.set $22 local.get $20 - local.get $18 - local.get $18 - f64.mul - f64.mul local.get $22 - f64.add - local.set $20 - local.get $20 - local.set $22 - local.get $2 - f64.promote_f32 + local.get $19 + f32.sub + f32.sub + local.set $23 + f32.const 0.9619140625 local.get $22 - f64.mul - local.set $21 - local.get $21 - i64.reinterpret_f64 - i64.const 47 - i64.shr_u - i64.const 65535 - i64.and - i64.const 32959 - i64.ge_u + f32.mul + local.set $31 + f32.const 1.5632208487659227e-06 + f32.const 0 + local.get $8 + select + local.set $32 + f32.const -1.1736857413779944e-04 + local.get $22 + f32.mul + local.get $23 + f32.const 0.9617967009544373 + f32.mul + f32.add + local.get $32 + f32.add + local.set $33 + local.get $24 + f32.convert_i32_s + local.set $18 + f32.const 0.5849609375 + f32.const 0 + local.get $8 + select + local.set $34 + local.get $31 + local.get $33 + f32.add + local.get $34 + f32.add + local.get $18 + f32.add + local.set $14 + local.get $14 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $14 + local.get $33 + local.get $14 + local.get $18 + f32.sub + local.get $34 + f32.sub + local.get $31 + f32.sub + f32.sub + local.set $15 + end + local.get $1 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $35 + local.get $1 + local.get $35 + f32.sub + local.get $14 + f32.mul + local.get $1 + local.get $15 + f32.mul + f32.add + local.set $23 + local.get $35 + local.get $14 + f32.mul + local.set $22 + local.get $23 + local.get $22 + f32.add + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $7 + local.get $7 + i32.const 1124073472 + i32.gt_s + if + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + return + else + local.get $7 + i32.const 1124073472 + i32.eq if - local.get $21 - f64.const 127.99999995700433 - f64.gt + local.get $23 + f32.const 4.299566569443414e-08 + f32.add + local.get $11 + local.get $22 + f32.sub + f32.gt if - local.get $4 - local.set $8 - local.get $8 - local.set $10 - i32.const 1879048192 - f32.reinterpret_i32 - local.set $9 - local.get $9 - f32.neg - local.get $9 - local.get $10 - select - local.get $9 + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 f32.mul - br $~lib/util/math/powf_lut|inlined.0 + return end - local.get $21 - f64.const -150 - f64.le + else + local.get $7 + i32.const 2147483647 + i32.and + i32.const 1125515264 + i32.gt_s if - local.get $4 - local.set $11 - local.get $11 - local.set $12 - i32.const 268435456 - f32.reinterpret_i32 - local.set $9 - local.get $9 - f32.neg - local.get $9 - local.get $12 - select - local.get $9 + local.get $13 + f32.const 1.0000000031710769e-30 f32.mul - br $~lib/util/math/powf_lut|inlined.0 + f32.const 1.0000000031710769e-30 + f32.mul + return + else + local.get $7 + i32.const -1021968384 + i32.eq + if + local.get $23 + local.get $11 + local.get $22 + f32.sub + f32.le + if + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + return + end + end end end - local.get $21 - local.set $15 - local.get $4 - local.set $13 - local.get $15 - f64.const 211106232532992 - f64.add - local.set $20 - local.get $20 - i64.reinterpret_f64 - local.set $23 - local.get $15 - local.get $20 - f64.const 211106232532992 - f64.sub - f64.sub - local.set $19 - i32.const 6800 - local.get $23 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl + end + local.get $7 + i32.const 2147483647 + i32.and + local.set $36 + local.get $36 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 + i32.const 0 + local.set $24 + local.get $36 + i32.const 1056964608 + i32.gt_s + if + local.get $7 + i32.const 8388608 + local.get $8 + i32.const 1 + i32.add + i32.shr_s i32.add - i64.load local.set $24 local.get $24 - local.get $23 - local.get $13 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 5 - i64.sub - i64.shl - i64.add - local.set $24 + i32.const 2147483647 + i32.and + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 local.get $24 - f64.reinterpret_i64 - local.set $16 - f64.const 0.05550361559341535 - local.get $19 - f64.mul - f64.const 0.2402284522445722 - f64.add + i32.const 8388607 + local.get $8 + i32.shr_s + i32.const -1 + i32.xor + i32.and + f32.reinterpret_i32 local.set $18 - f64.const 0.6931471806916203 - local.get $19 - f64.mul - f64.const 1 - f64.add - local.set $17 - local.get $17 + local.get $24 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + i32.const 23 + local.get $8 + i32.sub + i32.shr_s + local.set $24 + local.get $7 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $24 + i32.sub + local.set $24 + end + local.get $22 local.get $18 - local.get $19 - local.get $19 - f64.mul - f64.mul - f64.add - local.set $17 - local.get $17 - local.get $16 - f64.mul - local.set $17 - local.get $17 - f32.demote_f64 + f32.sub + local.set $22 + end + local.get $23 + local.get $22 + f32.add + local.set $18 + local.get $18 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -32768 + i32.and + f32.reinterpret_i32 + local.set $18 + local.get $18 + f32.const 0.693145751953125 + f32.mul + local.set $19 + local.get $23 + local.get $18 + local.get $22 + f32.sub + f32.sub + f32.const 0.6931471824645996 + f32.mul + local.get $18 + f32.const 1.4286065379565116e-06 + f32.mul + f32.add + local.set $20 + local.get $19 + local.get $20 + f32.add + local.set $11 + local.get $20 + local.get $11 + local.get $19 + f32.sub + f32.sub + local.set $21 + local.get $11 + local.get $11 + f32.mul + local.set $18 + local.get $11 + local.get $18 + f32.const 0.1666666716337204 + local.get $18 + f32.const -2.7777778450399637e-03 + local.get $18 + f32.const 6.61375597701408e-05 + local.get $18 + f32.const -1.6533901998627698e-06 + local.get $18 + f32.const 4.138136944220605e-08 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.sub + local.set $14 + local.get $11 + local.get $14 + f32.mul + local.get $14 + f32.const 2 + f32.sub + f32.div + local.get $21 + local.get $11 + local.get $21 + f32.mul + f32.add + f32.sub + local.set $16 + f32.const 1 + local.get $16 + local.get $11 + f32.sub + f32.sub + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $7 + local.get $7 + local.get $24 + i32.const 23 + i32.shl + i32.add + local.set $7 + local.get $7 + i32.const 23 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $11 + local.get $24 + call $~lib/math/NativeMathf.scalbn + local.set $11 + else + local.get $7 + f32.reinterpret_i32 + local.set $11 end + local.get $13 + local.get $11 + f32.mul ) - (func $std/math/test_powf (; 134 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) + (func $std/math/test_powf (; 130 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.pow @@ -11121,7 +11003,7 @@ local.get $4 call $std/math/check ) - (func $~lib/math/murmurHash3 (; 135 ;) (param $0 i64) (result i64) + (func $~lib/math/murmurHash3 (; 131 ;) (param $0 i64) (result i64) local.get $0 local.get $0 i64.const 33 @@ -11150,7 +11032,7 @@ local.set $0 local.get $0 ) - (func $~lib/math/splitMix32 (; 136 ;) (param $0 i32) (result i32) + (func $~lib/math/splitMix32 (; 132 ;) (param $0 i32) (result i32) local.get $0 i32.const 1831565813 i32.add @@ -11185,7 +11067,7 @@ i32.shr_u i32.xor ) - (func $~lib/math/NativeMath.seedRandom (; 137 ;) (param $0 i64) + (func $~lib/math/NativeMath.seedRandom (; 133 ;) (param $0 i64) i32.const 1 global.set $~lib/math/random_seeded local.get $0 @@ -11230,23 +11112,23 @@ i32.eqz if i32.const 0 - i32.const 13536 - i32.const 1406 + i32.const 336 + i32.const 1411 i32.const 4 call $~lib/builtins/abort unreachable end ) - (func $~lib/math/NativeMath.random (; 138 ;) (result f64) + (func $~lib/math/NativeMath.random (; 134 ;) (result f64) (local $0 i64) (local $1 i64) (local $2 i64) global.get $~lib/math/random_seeded i32.eqz if - i32.const 13584 - i32.const 13536 - i32.const 1413 + i32.const 384 + i32.const 336 + i32.const 1418 i32.const 24 call $~lib/builtins/abort unreachable @@ -11292,16 +11174,16 @@ f64.const 1 f64.sub ) - (func $~lib/math/NativeMathf.random (; 139 ;) (result f32) + (func $~lib/math/NativeMathf.random (; 135 ;) (result f32) (local $0 i32) (local $1 i32) (local $2 i32) global.get $~lib/math/random_seeded i32.eqz if - i32.const 13584 - i32.const 13536 - i32.const 2606 + i32.const 384 + i32.const 336 + i32.const 2800 i32.const 24 call $~lib/builtins/abort unreachable @@ -11347,7 +11229,7 @@ f32.const 1 f32.sub ) - (func $std/math/test_round (; 140 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_round (; 136 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) (local $4 f64) local.get $0 local.set $4 @@ -11362,7 +11244,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_roundf (; 141 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_roundf (; 137 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) (local $4 f32) local.get $0 local.set $4 @@ -11377,7 +11259,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_sign (; 142 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_sign (; 138 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) (local $4 f64) block $~lib/math/NativeMath.sign|inlined.0 (result f64) local.get $0 @@ -11420,7 +11302,7 @@ i32.const 0 end ) - (func $std/math/test_signf (; 143 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_signf (; 139 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) (local $4 f32) block $~lib/math/NativeMathf.sign|inlined.0 (result f32) local.get $0 @@ -11447,7 +11329,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.rem (; 144 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.rem (; 140 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 i64) (local $3 i64) (local $4 i64) @@ -11765,7 +11647,7 @@ local.get $0 end ) - (func $std/math/test_rem (; 145 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) + (func $std/math/test_rem (; 141 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMath.rem @@ -11774,7 +11656,7 @@ local.get $4 call $std/math/check ) - (func $~lib/math/NativeMathf.rem (; 146 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.rem (; 142 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -12085,7 +11967,7 @@ local.get $0 end ) - (func $std/math/test_remf (; 147 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) + (func $std/math/test_remf (; 143 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 f32) (param $4 i32) (result i32) local.get $0 local.get $1 call $~lib/math/NativeMathf.rem @@ -12094,7 +11976,7 @@ local.get $4 call $std/math/check ) - (func $~lib/math/NativeMath.sin (; 148 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.sin (; 144 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -12623,7 +12505,7 @@ local.get $0 end ) - (func $std/math/test_sin (; 149 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_sin (; 145 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.sin local.get $1 @@ -12647,7 +12529,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.sin (; 150 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.sin (; 146 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 f64) @@ -13064,7 +12946,7 @@ i32.and i64.extend_i32_s local.set $14 - i32.const 4688 + i32.const 288 local.get $13 i32.const 6 i32.shr_s @@ -13253,7 +13135,7 @@ local.get $26 end ) - (func $std/math/test_sinf (; 151 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_sinf (; 147 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.sin local.get $1 @@ -13261,7 +13143,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.sinh (; 152 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.sinh (; 148 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 f64) (local $3 i32) @@ -13359,7 +13241,7 @@ local.set $4 local.get $4 ) - (func $std/math/test_sinh (; 153 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_sinh (; 149 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.sinh local.get $1 @@ -13383,7 +13265,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.sinh (; 154 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.sinh (; 150 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -13472,7 +13354,7 @@ local.set $3 local.get $3 ) - (func $std/math/test_sinhf (; 155 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_sinhf (; 151 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.sinh local.get $1 @@ -13480,7 +13362,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_sqrt (; 156 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_sqrt (; 152 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) (local $4 f64) local.get $0 local.set $4 @@ -13507,7 +13389,7 @@ i32.const 0 end ) - (func $std/math/test_sqrtf (; 157 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_sqrtf (; 153 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) (local $4 f32) local.get $0 local.set $4 @@ -13518,7 +13400,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/tan_kern (; 158 ;) (param $0 f64) (param $1 f64) (param $2 i32) (result f64) + (func $~lib/math/tan_kern (; 154 ;) (param $0 f64) (param $1 f64) (param $2 i32) (result f64) (local $3 f64) (local $4 f64) (local $5 f64) @@ -13731,7 +13613,7 @@ f64.mul f64.add ) - (func $~lib/math/NativeMath.tan (; 159 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.tan (; 155 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -14043,7 +13925,7 @@ i32.sub call $~lib/math/tan_kern ) - (func $std/math/test_tan (; 160 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_tan (; 156 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.tan local.get $1 @@ -14067,7 +13949,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.tan (; 161 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.tan (; 157 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -14548,7 +14430,7 @@ i32.and i64.extend_i32_s local.set $16 - i32.const 4688 + i32.const 288 local.get $15 i32.const 6 i32.shr_s @@ -14714,7 +14596,7 @@ end f32.demote_f64 ) - (func $std/math/test_tanf (; 162 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_tanf (; 158 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.tan local.get $1 @@ -14722,7 +14604,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.tanh (; 163 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.tanh (; 159 ;) (param $0 f64) (result f64) (local $1 i64) (local $2 f64) (local $3 i32) @@ -14814,7 +14696,7 @@ local.get $0 f64.copysign ) - (func $std/math/test_tanh (; 164 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_tanh (; 160 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMath.tanh local.get $1 @@ -14838,7 +14720,7 @@ i32.const 0 end ) - (func $~lib/math/NativeMathf.tanh (; 165 ;) (param $0 f32) (result f32) + (func $~lib/math/NativeMathf.tanh (; 161 ;) (param $0 f32) (result f32) (local $1 i32) (local $2 f32) (local $3 f32) @@ -14924,7 +14806,7 @@ local.get $0 f32.copysign ) - (func $std/math/test_tanhf (; 166 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_tanhf (; 162 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 call $~lib/math/NativeMathf.tanh local.get $1 @@ -14932,7 +14814,7 @@ local.get $3 call $std/math/check ) - (func $std/math/test_trunc (; 167 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) + (func $std/math/test_trunc (; 163 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) (local $4 f64) local.get $0 local.set $4 @@ -14959,7 +14841,7 @@ i32.const 0 end ) - (func $std/math/test_truncf (; 168 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) + (func $std/math/test_truncf (; 164 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) (local $4 f32) local.get $0 local.set $4 @@ -14970,7 +14852,7 @@ local.get $3 call $std/math/check ) - (func $~lib/math/NativeMath.sincos (; 169 ;) (param $0 f64) + (func $~lib/math/NativeMath.sincos (; 165 ;) (param $0 f64) (local $1 i64) (local $2 i32) (local $3 i32) @@ -15589,7 +15471,7 @@ local.get $23 global.set $~lib/math/NativeMath.sincos_cos ) - (func $std/math/test_sincos (; 170 ;) (param $0 i64) (param $1 i64) (param $2 i64) (param $3 i64) (param $4 i64) (param $5 i32) (result i32) + (func $std/math/test_sincos (; 166 ;) (param $0 i64) (param $1 i64) (param $2 i64) (param $3 i64) (param $4 i64) (param $5 i32) (result i32) (local $6 f64) (local $7 f64) (local $8 f64) @@ -15627,7 +15509,7 @@ i32.const 0 end ) - (func $~lib/math/dtoi32 (; 171 ;) (param $0 f64) (result i32) + (func $~lib/math/dtoi32 (; 167 ;) (param $0 f64) (result i32) (local $1 i32) (local $2 i64) (local $3 i64) @@ -15698,7 +15580,7 @@ local.get $1 return ) - (func $~lib/math/NativeMath.imul (; 172 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.imul (; 168 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 f64) local.get $0 local.get $1 @@ -15720,7 +15602,7 @@ i32.mul f64.convert_i32_s ) - (func $~lib/math/NativeMath.clz32 (; 173 ;) (param $0 f64) (result f64) + (func $~lib/math/NativeMath.clz32 (; 169 ;) (param $0 f64) (result f64) local.get $0 local.get $0 f64.sub @@ -15736,7 +15618,7 @@ i32.clz f64.convert_i32_s ) - (func $~lib/math/ipow64 (; 174 ;) (param $0 i64) (param $1 i32) (result i64) + (func $~lib/math/ipow64 (; 170 ;) (param $0 i64) (param $1 i32) (result i64) (local $2 i64) (local $3 i32) (local $4 i32) @@ -15956,7 +15838,7 @@ end local.get $2 ) - (func $~lib/math/ipow32f (; 175 ;) (param $0 f32) (param $1 i32) (result f32) + (func $~lib/math/ipow32f (; 171 ;) (param $0 f32) (param $1 i32) (result f32) (local $2 i32) (local $3 f32) (local $4 i32) @@ -16006,7 +15888,7 @@ local.get $3 end ) - (func $~lib/math/ipow64f (; 176 ;) (param $0 f64) (param $1 i32) (result f64) + (func $~lib/math/ipow64f (; 172 ;) (param $0 f64) (param $1 i32) (result f64) (local $2 i32) (local $3 f64) (local $4 i32) @@ -16056,7 +15938,7 @@ local.get $3 end ) - (func $start:std/math (; 177 ;) + (func $start:std/math (; 173 ;) (local $0 f64) (local $1 i32) (local $2 i32) @@ -28970,636 +28852,6 @@ unreachable end f64.const -8.06684839057968 - f64.const 0.003729380227666592 - f64.const 0.1281578093767166 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1548 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 4.345239849338305 - f64.const 20.32579462123892 - f64.const 0.03073759749531746 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1549 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -8.38143342755525 - f64.const 2.9987283924334954e-03 - f64.const -0.31000515818595886 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1550 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -6.531673581913484 - f64.const 0.010808622025681005 - f64.const -0.28607869148254395 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1551 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 9.267056966972586 - f64.const 616.1154770730207 - f64.const -0.08883064985275269 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1552 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0.6619858980995045 - f64.const 1.5822591361986904 - f64.const -0.1258980929851532 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1553 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -0.4066039223853553 - f64.const 0.7543971221632684 - f64.const -0.24229088425636292 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1554 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0.5617597462207241 - f64.const 1.4760685736993149 - f64.const 0.27173060178756714 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1555 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0.7741522965913037 - f64.const 1.710184880131433 - f64.const -0.0205493476241827 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1556 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -0.6787637026394024 - f64.const 0.6247003734030933 - f64.const -0.31195688247680664 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1557 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0 - f64.const 1 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1560 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 0 - f64.const 1 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1561 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1 - f64.const 2 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1562 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1 - f64.const 0.5 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1563 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const inf - f64.const inf - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1564 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -inf - f64.const 0 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1565 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const nan:0x8000000000000 - f64.const nan:0x8000000000000 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1566 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1.998046875 - f64.const 3.9945884515638808 - f64.const 0.1476455181837082 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1567 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1021.9 - f64.const 2.384775113731291e-308 - f64.const -0.2217157781124115 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1568 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1022 - f64.const 2.2250738585072014e-308 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1569 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1022.1 - f64.const 2.0760673185932884e-308 - f64.const 0.198451966047287 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1570 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1023 - f64.const 1.1125369292536007e-308 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1571 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1023.9 - f64.const 1677307003485741635311718e284 - f64.const 0.396903932094574 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1572 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1024 - f64.const inf - f64.const 0 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1573 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 1024.1 - f64.const inf - f64.const 0 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1574 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const 3.14 - f64.const 8.815240927012887 - f64.const 0.39309585094451904 - i32.const 1 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1575 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1022.5 - f64.const 1.5733648139913585e-308 - f64.const -0.28231191635131836 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1576 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1023 - f64.const 1.1125369292536007e-308 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1577 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1023.5 - f64.const 7.866824069956793e-309 - f64.const -0.14115595817565918 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1578 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1024 - f64.const 5.562684646268003e-309 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1579 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1025 - f64.const 2.781342323134e-309 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1580 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1074 - f64.const 5e-324 - f64.const 0 - i32.const 0 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1581 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1074.5 - f64.const 5e-324 - f64.const 0.2928932309150696 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1582 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -1075 - f64.const 0 - f64.const -0.5 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1583 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -2048 - f64.const 0 - f64.const 0 - i32.const 9 - call $std/math/test_exp2 - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1584 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -8.066848754882812 - f32.const 3.7293792702257633e-03 - f32.const -0.0674908235669136 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1595 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 4.345239639282227 - f32.const 20.32579231262207 - f32.const 0.34121403098106384 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1596 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -8.381433486938477 - f32.const 2.9987283051013947e-03 - f32.const 0.15504619479179382 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1597 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -6.531673431396484 - f32.const 0.010808623395860195 - f32.const 0.2603940963745117 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1598 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 9.267057418823242 - f32.const 616.1156616210938 - f32.const -0.1379322111606598 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1599 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 0.6619858741760254 - f32.const 1.5822590589523315 - f32.const -0.427890807390213 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1600 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -0.40660393238067627 - f32.const 0.7543970942497253 - f32.const -0.38062313199043274 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1601 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 0.5617597699165344 - f32.const 1.4760686159133911 - f32.const 0.1507442593574524 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1602 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const 0.7741522789001465 - f32.const 1.7101848125457764 - f32.const -0.39102980494499207 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1603 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f32.const -0.6787636876106262 - f32.const 0.6247003674507141 - f32.const -0.20904375612735748 - i32.const 1 - call $std/math/test_exp2f - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 1604 - i32.const 0 - call $~lib/builtins/abort - unreachable - end - f64.const -8.06684839057968 f64.const -9 f64.const 0 i32.const 1 @@ -55932,7 +55184,7 @@ unreachable end ) - (func $~start (; 178 ;) + (func $~start (; 174 ;) call $start:std/math ) ) From ec1f2d6599b71581cf0aadc8608f245456f8134d Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 28 Feb 2020 02:18:10 +0200 Subject: [PATCH 3/6] also comment in exp2 in index.d.ts --- std/assembly/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 02af3d2ee7..d7bbe6c6cb 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1691,7 +1691,7 @@ interface INativeMath extends IMath { /** Returns sin and cos simultaneously for same angle. Results stored to `sincos_s32/64` and `sincos_c32/64` globals */ sincos(x: T): void; /** Returns 2 raised to the given power x. Equivalent to 2 ** x. */ - exp2(x: T): T; + // exp2(x: T): T; } /** Double precision math imported from JavaScript. */ From 8f07c8f9075a3b07f65c78d9768563ecf7fc9251 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 28 Feb 2020 02:38:10 +0200 Subject: [PATCH 4/6] rebuild rest --- tests/compiler/binary.optimized.wat | 4 +- tests/compiler/binary.untouched.wat | 3308 ++++++++++------- tests/compiler/mandelbrot.untouched.wat | 1020 ++--- tests/compiler/resolve-binary.untouched.wat | 2024 +++++----- tests/compiler/std/array.optimized.wat | 4 +- tests/compiler/std/array.untouched.wat | 4 +- .../std/operator-overloading.untouched.wat | 1903 ++++++---- 7 files changed, 4663 insertions(+), 3604 deletions(-) diff --git a/tests/compiler/binary.optimized.wat b/tests/compiler/binary.optimized.wat index 6961e182ef..1de5908b93 100644 --- a/tests/compiler/binary.optimized.wat +++ b/tests/compiler/binary.optimized.wat @@ -2,9 +2,7 @@ (type $none_=>_none (func)) (type $f32_=>_f32 (func (param f32) (result f32))) (type $f64_=>_f64 (func (param f64) (result f64))) - (memory $0 1) - (data (i32.const 17) "\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\190\96[\c6\fe\de\bf=\88\afJ\edq\f5?\a4\fc\d42h\0b\db\bf\b0\10\f0\f09\95\f4?{\b7\1f\n\8bA\d7\bf\85\03\b8\b0\95\c9\f3?{\cfm\1a\e9\9d\d3\bf\a5d\88\0c\19\0d\f3?1\b6\f2\f3\9b\1d\d0\bf\a0\8e\0b{\"^\f2?\f0z;\1b\1d|\c9\bf?4\1aJJ\bb\f1?\9f<\af\93\e3\f9\c2\bf\ba\e5\8a\f0X#\f1?\\\8dx\bf\cb`\b9\bf\a7\00\99A?\95\f0?\ce_G\b6\9do\aa\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?=\f5$\9f\ca8\b3?\a0j\02\1f\b3\a4\ec?\ba\918T\a9v\c4?\e6\fcjW6 \eb?\d2\e4\c4J\0b\84\ce?-\aa\a1c\d1\c2\e9?\1ce\c6\f0E\06\d4?\edAx\03\e6\86\e8?\f8\9f\1b,\9c\8e\d8?bHS\f5\dcg\e7?\cc{\b1N\a4\e0\dc?") - (data (i32.const 289) "\01\00\00\01\00\00\00\04\00\00\00\00\01\00\00\00\00\00\00\00\00\f0?t\85\15\d3\b0\d9\ef?\0f\89\f9lX\b5\ef?Q[\12\d0\01\93\ef?{Q}<\b8r\ef?\aa\b9h1\87T\ef?8bunz8\ef?\e1\de\1f\f5\9d\1e\ef?\15\b71\n\fe\06\ef?\cb\a9:7\a7\f1\ee?\"4\12L\a6\de\ee?-\89a`\08\ce\ee?\'*6\d5\da\bf\ee?\82O\9dV+\b4\ee?)TH\dd\07\ab\ee?\85U:\b0~\a4\ee?\cd;\7ff\9e\a0\ee?t_\ec\e8u\9f\ee?\87\01\ebs\14\a1\ee?\13\ceL\99\89\a5\ee?\db\a0*B\e5\ac\ee?\e5\c5\cd\b07\b7\ee?\90\f0\a3\82\91\c4\ee?]%>\b2\03\d5\ee?\ad\d3Z\99\9f\e8\ee?G^\fb\f2v\ff\ee?\9cR\85\dd\9b\19\ef?i\90\ef\dc 7\ef?\87\a4\fb\dc\18X\ef?_\9b{3\97|\ef?\da\90\a4\a2\af\a4\ef?@En[v\d0\ef?") + (memory $0 0) (global $binary/b (mut i32) (i32.const 0)) (global $binary/i (mut i32) (i32.const 0)) (global $binary/I (mut i64) (i64.const 0)) diff --git a/tests/compiler/binary.untouched.wat b/tests/compiler/binary.untouched.wat index 35b4803fc9..006f491026 100644 --- a/tests/compiler/binary.untouched.wat +++ b/tests/compiler/binary.untouched.wat @@ -2,35 +2,122 @@ (type $none_=>_none (func)) (type $f32_f32_=>_f32 (func (param f32 f32) (result f32))) (type $f64_f64_=>_f64 (func (param f64 f64) (result f64))) - (memory $0 1) - (data (i32.const 16) "\00\10\00\00\01\00\00\00\03\00\00\00\00\10\00\00\00\00\00\00\00\a0\f6?\00\00\00\00\00\00\00\00\00\c8\b9\f2\82,\d6\bf\80V7($\b4\fa<\00\00\00\00\00\80\f6?\00\00\00\00\00\00\00\00\00\08X\bf\bd\d1\d5\bf \f7\e0\d8\08\a5\1c\bd\00\00\00\00\00`\f6?\00\00\00\00\00\00\00\00\00XE\17wv\d5\bfmP\b6\d5\a4b#\bd\00\00\00\00\00@\f6?\00\00\00\00\00\00\00\00\00\f8-\87\ad\1a\d5\bf\d5g\b0\9e\e4\84\e6\bc\00\00\00\00\00 \f6?\00\00\00\00\00\00\00\00\00xw\95_\be\d4\bf\e0>)\93i\1b\04\bd\00\00\00\00\00\00\f6?\00\00\00\00\00\00\00\00\00`\1c\c2\8ba\d4\bf\cc\84LH/\d8\13=\00\00\00\00\00\e0\f5?\00\00\00\00\00\00\00\00\00\a8\86\860\04\d4\bf:\0b\82\ed\f3B\dc<\00\00\00\00\00\c0\f5?\00\00\00\00\00\00\00\00\00HiUL\a6\d3\bf`\94Q\86\c6\b1 =\00\00\00\00\00\a0\f5?\00\00\00\00\00\00\00\00\00\80\98\9a\ddG\d3\bf\92\80\c5\d4MY%=\00\00\00\00\00\80\f5?\00\00\00\00\00\00\00\00\00 \e1\ba\e2\e8\d2\bf\d8+\b7\99\1e{&=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00@\f5?\00\00\00\00\00\00\00\00\00x\cf\fbA)\d2\bfv\daS($Z\16\bd\00\00\00\00\00 \f5?\00\00\00\00\00\00\00\00\00\98i\c1\98\c8\d1\bf\04T\e7h\bc\af\1f\bd\00\00\00\00\00\00\f5?\00\00\00\00\00\00\00\00\00\a8\ab\ab\\g\d1\bf\f0\a8\823\c6\1f\1f=\00\00\00\00\00\e0\f4?\00\00\00\00\00\00\00\00\00H\ae\f9\8b\05\d1\bffZ\05\fd\c4\a8&\bd\00\00\00\00\00\c0\f4?\00\00\00\00\00\00\00\00\00\90s\e2$\a3\d0\bf\0e\03\f4~\eek\0c\bd\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\80\f4?\00\00\00\00\00\00\00\00\00@^m\18\b9\cf\bf\87<\99\ab*W\0d=\00\00\00\00\00`\f4?\00\00\00\00\00\00\00\00\00`\dc\cb\ad\f0\ce\bf$\af\86\9c\b7&+=\00\00\00\00\00@\f4?\00\00\00\00\00\00\00\00\00\f0*n\07\'\ce\bf\10\ff?TO/\17\bd\00\00\00\00\00 \f4?\00\00\00\00\00\00\00\00\00\c0Ok!\\\cd\bf\1bh\ca\bb\91\ba!=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\e0\f3?\00\00\00\00\00\00\00\00\00\90-t\86\c2\cb\bf\8f\b7\8b1\b0N\19=\00\00\00\00\00\c0\f3?\00\00\00\00\00\00\00\00\00\c0\80N\c9\f3\ca\bff\90\cd?cN\ba<\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\80\f3?\00\00\00\00\00\00\00\00\00P\f4\9cZR\c9\bf\e3\d4\c1\04\d9\d1*\bd\00\00\00\00\00`\f3?\00\00\00\00\00\00\00\00\00\d0 e\a0\7f\c8\bf\t\fa\db\7f\bf\bd+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00 \f3?\00\00\00\00\00\00\00\00\00\d0\19\e7\0f\d6\c6\bff\e2\b2\a3j\e4\10\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\e0\f2?\00\00\00\00\00\00\00\00\00\b0\a1\e3\e5&\c5\bf\8f[\07\90\8b\de \bd\00\00\00\00\00\c0\f2?\00\00\00\00\00\00\00\00\00\80\cbl+M\c4\bf\11\0e\bd\00\00\00\00\00\e0\ed?\00\00\00\00\00\00\00\00\00`F\d1;\97\b1?\9b\9e\0dV]2%\bd\00\00\00\00\00\a0\ed?\00\00\00\00\00\00\00\00\00\e0\d1\a7\f5\bd\b3?\d7N\db\a5^\c8,=\00\00\00\00\00`\ed?\00\00\00\00\00\00\00\00\00\a0\97MZ\e9\b5?\1e\1d]<\06i,\bd\00\00\00\00\00@\ed?\00\00\00\00\00\00\00\00\00\c0\ea\n\d3\00\b7?2\ed\9d\a9\8d\1e\ec<\00\00\00\00\00\00\ed?\00\00\00\00\00\00\00\00\00@Y]^3\b9?\daG\bd:\\\11#=\00\00\00\00\00\c0\ec?\00\00\00\00\00\00\00\00\00`\ad\8d\c8j\bb?\e5h\f7+\80\90\13\bd\00\00\00\00\00\a0\ec?\00\00\00\00\00\00\00\00\00@\bc\01X\88\bc?\d3\acZ\c6\d1F&=\00\00\00\00\00`\ec?\00\00\00\00\00\00\00\00\00 \n\839\c7\be?\e0E\e6\afh\c0-\bd\00\00\00\00\00@\ec?\00\00\00\00\00\00\00\00\00\e0\db9\91\e8\bf?\fd\n\a1O\d64%\bd\00\00\00\00\00\00\ec?\00\00\00\00\00\00\00\00\00\e0\'\82\8e\17\c1?\f2\07-\cex\ef!=\00\00\00\00\00\e0\eb?\00\00\00\00\00\00\00\00\00\f0#~+\aa\c1?4\998D\8e\a7,=\00\00\00\00\00\a0\eb?\00\00\00\00\00\00\00\00\00\80\86\0ca\d1\c2?\a1\b4\81\cbl\9d\03=\00\00\00\00\00\80\eb?\00\00\00\00\00\00\00\00\00\90\15\b0\fce\c3?\89rK#\a8/\c6<\00\00\00\00\00@\eb?\00\00\00\00\00\00\00\00\00\b03\83=\91\c4?x\b6\fdTy\83%=\00\00\00\00\00 \eb?\00\00\00\00\00\00\00\00\00\b0\a1\e4\e5\'\c5?\c7}i\e5\e83&=\00\00\00\00\00\e0\ea?\00\00\00\00\00\00\00\00\00\10\8c\beNW\c6?x.<,\8b\cf\19=\00\00\00\00\00\c0\ea?\00\00\00\00\00\00\00\00\00pu\8b\12\f0\c6?\e1!\9c\e5\8d\11%\bd\00\00\00\00\00\a0\ea?\00\00\00\00\00\00\00\00\00PD\85\8d\89\c7?\05C\91p\10f\1c\bd\00\00\00\00\00`\ea?\00\00\00\00\00\00\00\00\00\009\eb\af\be\c8?\d1,\e9\aaT=\07\bd\00\00\00\00\00@\ea?\00\00\00\00\00\00\00\00\00\00\f7\dcZZ\c9?o\ff\a0X(\f2\07=\00\00\00\00\00\00\ea?\00\00\00\00\00\00\00\00\00\e0\8a<\ed\93\ca?i!VPCr(\bd\00\00\00\00\00\e0\e9?\00\00\00\00\00\00\00\00\00\d0[W\d81\cb?\aa\e1\acN\8d5\0c\bd\00\00\00\00\00\c0\e9?\00\00\00\00\00\00\00\00\00\e0;8\87\d0\cb?\b6\12TY\c4K-\bd\00\00\00\00\00\a0\e9?\00\00\00\00\00\00\00\00\00\10\f0\c6\fbo\cc?\d2+\96\c5r\ec\f1\bc\00\00\00\00\00`\e9?\00\00\00\00\00\00\00\00\00\90\d4\b0=\b1\cd?5\b0\15\f7*\ff*\bd\00\00\00\00\00@\e9?\00\00\00\00\00\00\00\00\00\10\e7\ff\0eS\ce?0\f4A`\'\12\c2<\00\00\00\00\00 \e9?\00\00\00\00\00\00\00\00\00\00\dd\e4\ad\f5\ce?\11\8e\bbe\15!\ca\bc\00\00\00\00\00\00\e9?\00\00\00\00\00\00\00\00\00\b0\b3l\1c\99\cf?0\df\0c\ca\ec\cb\1b=\00\00\00\00\00\c0\e8?\00\00\00\00\00\00\00\00\00XM`8q\d0?\91N\ed\16\db\9c\f8<\00\00\00\00\00\a0\e8?\00\00\00\00\00\00\00\00\00`ag-\c4\d0?\e9\ea<\16\8b\18\'=\00\00\00\00\00\80\e8?\00\00\00\00\00\00\00\00\00\e8\'\82\8e\17\d1?\1c\f0\a5c\0e!,\bd\00\00\00\00\00`\e8?\00\00\00\00\00\00\00\00\00\f8\ac\cb\\k\d1?\81\16\a5\f7\cd\9a+=\00\00\00\00\00@\e8?\00\00\00\00\00\00\00\00\00hZc\99\bf\d1?\b7\bdGQ\ed\a6,=\00\00\00\00\00 \e8?\00\00\00\00\00\00\00\00\00\b8\0emE\14\d2?\ea\baF\ba\de\87\n=\00\00\00\00\00\e0\e7?\00\00\00\00\00\00\00\00\00\90\dc|\f0\be\d2?\f4\04PJ\fa\9c*=\00\00\00\00\00\c0\e7?\00\00\00\00\00\00\00\00\00`\d3\e1\f1\14\d3?\b8\9a\ec\ef?\d1f\87\10z^\90\bc\85\7fn\e8\15\e3\ef?\13\f6g5R\d2\8c\be\ef?m{\83]\a6\9a\97<\0f\89\f9lX\b5\ef?\fc\ef\fd\92\1a\b5\8e<\f7Gr+\92\ac\ef?\d1\9c/p=\be><\a2\d1\d32\ec\a3\ef?\0bn\90\894\03j\bc\1b\d3\fe\aff\9b\ef?\0e\bd/*RV\95\bcQ[\12\d0\01\93\ef?U\eaN\8c\ef\80P\bc\cc1l\c0\bd\8a\ef?\16\f4\d5\b9#\c9\91\bc\e0-\a9\ae\9a\82\ef?\afU\\\e9\e3\d3\80\f7\ec\9a<\aa\b9h1\87T\ef?\9d8\86\cb\82\e7\8f\bc\1d\d9\fc\"PM\ef?\8d\c3\a6DAo\8a<\d6\8cb\88;F\ef?}\04\e4\b0\05z\80<\96\dc}\91I?\ef?\94\a8\a8\e3\fd\8e\96<8bunz8\ef?}Ht\f2\18^\87\a9\af\0c\ef?\b6\ab\b0MuM\83<\15\b71\n\fe\06\ef?Lt\ac\e2\01B\86<1\d8L\fcp\01\ef?J\f8\d3]9\dd\8f<\ff\16d\b2\08\fc\ee?\04[\8e;\80\a3\86\bc\f1\9f\92_\c5\f6\ee?hPK\cc\edJ\92\bc\cb\a9:7\a7\f1\ee?\8e-Q\1b\f8\07\99\bcf\d8\05m\ae\ec\ee?\d26\94>\e8\d1q\bc\f7\9f\e54\db\e7\ee?\15\1b\ce\b3\19\19\99\bc\e5\a8\13\c3-\e3\ee?mL*\a7H\9f\85<\"4\12L\a6\de\ee?\8ai(z`\12\93\bc\1c\80\ac\04E\da\ee?[\89\17H\8f\a7X\bc*.\f7!\n\d6\ee?\1b\9aIg\9b,|\bc\97\a8P\d9\f5\d1\ee?\11\ac\c2`\edcC<-\89a`\08\ce\ee?\efd\06;\tf\96Z~d\1fx\bct_\ec\e8u\9f\ee?\b0}\8b\c0J\ee\86\bct\81\a5H\9a\9f\ee?\8a\e6U\1e2\19\86\bc\c9gBV\eb\9f\ee?\d3\d4\t^\cb\9c\90T\'\a4\ee?47;\f1\b6i\93\bc\13\ceL\99\89\a5\ee?\1e\ff\19:\84^\80\bc\ad\c7#F\1a\a7\ee?nWr\d8P\d4\94\bc\ed\92D\9b\d9\a8\ee?\00\8a\0e[g\ad\90<\99f\8a\d9\c7\aa\ee?\b4\ea\f0\c1/\b7\8d<\db\a0*B\e5\ac\ee?\ff\e7\c5\9c`\b6e\bc\8cD\b5\162\af\ee?D_\f3Y\83\f6{<6w\15\99\ae\b1\ee?\83=\1e\a7\1f\t\93\bc\c6\ff\91\0b[\b4\ee?)\1el\8b\b8\a9]\bc\e5\c5\cd\b07\b7\ee?Y\b9\90|\f9#l\bc\0fR\c8\cbD\ba\ee?\aa\f9\f4\"CC\92\bcPN\de\9f\82\bd\ee?K\8ef\d7l\ca\85\bc\ba\07\cap\f1\c0\ee?\'\ce\91+\fc\afq<\90\f0\a3\82\91\c4\ee?\bbs\n\e15\d2m<##\e3\19c\c8\ee?c\"b\"\04\c5\87\bce\e5]{f\cc\ee?\d51\e2\e3\86\1c\8b<3-J\ec\9b\d0\ee?\15\bb\bc\d3\d1\bb\91\bc]%>\b2\03\d5\ee?\d21\ee\9c1\cc\90\b4\07!\d5\82\bc_\9b{3\97|\ef?\c9\0dG;\b9*\89\bc)\a1\f5\14F\86\ef?\d3\88:`\04\b6t<\f6?\8b\e7.\90\ef?qr\9dQ\ec\c5\83<\83L\c7\fbQ\9a\ef?\f0\91\d3\8f\12\f7\8f\bc\da\90\a4\a2\af\a4\ef?}t#\e2\98\ae\8d\bc\f1g\8e-H\af\ef?\08 \aaA\bc\c3\8e<\'Za\ee\1b\ba\ef?2\eb\a9\c3\94+\84<\97\bak7+\c5\ef?\ee\85\d11\a9d\8a<@En[v\d0\ef?\ed\e3;\e4\ba7\8e\bc\14\be\9c\ad\fd\db\ef?\9d\cd\91M;\89w<\d8\90\9e\81\c1\e7\ef?\89\cc`A\c1\05S<\f1q\8f+\c2\f3\ef?") - (data (i32.const 6192) "\00\01\00\00\01\00\00\00\03\00\00\00\00\01\00\00\be\f3\f8y\eca\f6?\190\96[\c6\fe\de\bf=\88\afJ\edq\f5?\a4\fc\d42h\0b\db\bf\b0\10\f0\f09\95\f4?{\b7\1f\n\8bA\d7\bf\85\03\b8\b0\95\c9\f3?{\cfm\1a\e9\9d\d3\bf\a5d\88\0c\19\0d\f3?1\b6\f2\f3\9b\1d\d0\bf\a0\8e\0b{\"^\f2?\f0z;\1b\1d|\c9\bf?4\1aJJ\bb\f1?\9f<\af\93\e3\f9\c2\bf\ba\e5\8a\f0X#\f1?\\\8dx\bf\cb`\b9\bf\a7\00\99A?\95\f0?\ce_G\b6\9do\aa\bf\00\00\00\00\00\00\f0?\00\00\00\00\00\00\00\00\acG\9a\fd\8c`\ee?=\f5$\9f\ca8\b3?\a0j\02\1f\b3\a4\ec?\ba\918T\a9v\c4?\e6\fcjW6 \eb?\d2\e4\c4J\0b\84\ce?-\aa\a1c\d1\c2\e9?\1ce\c6\f0E\06\d4?\edAx\03\e6\86\e8?\f8\9f\1b,\9c\8e\d8?bHS\f5\dcg\e7?\cc{\b1N\a4\e0\dc?") - (data (i32.const 6464) "\00\01\00\00\01\00\00\00\04\00\00\00\00\01\00\00\00\00\00\00\00\00\f0?t\85\15\d3\b0\d9\ef?\0f\89\f9lX\b5\ef?Q[\12\d0\01\93\ef?{Q}<\b8r\ef?\aa\b9h1\87T\ef?8bunz8\ef?\e1\de\1f\f5\9d\1e\ef?\15\b71\n\fe\06\ef?\cb\a9:7\a7\f1\ee?\"4\12L\a6\de\ee?-\89a`\08\ce\ee?\'*6\d5\da\bf\ee?\82O\9dV+\b4\ee?)TH\dd\07\ab\ee?\85U:\b0~\a4\ee?\cd;\7ff\9e\a0\ee?t_\ec\e8u\9f\ee?\87\01\ebs\14\a1\ee?\13\ceL\99\89\a5\ee?\db\a0*B\e5\ac\ee?\e5\c5\cd\b07\b7\ee?\90\f0\a3\82\91\c4\ee?]%>\b2\03\d5\ee?\ad\d3Z\99\9f\e8\ee?G^\fb\f2v\ff\ee?\9cR\85\dd\9b\19\ef?i\90\ef\dc 7\ef?\87\a4\fb\dc\18X\ef?_\9b{3\97|\ef?\da\90\a4\a2\af\a4\ef?@En[v\d0\ef?") + (type $f32_i32_=>_f32 (func (param f32 i32) (result f32))) + (type $f64_i32_=>_f64 (func (param f64 i32) (result f64))) + (memory $0 0) (table $0 1 funcref) (global $binary/b (mut i32) (i32.const 0)) (global $binary/i (mut i32) (i32.const 0)) - (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/math/log_tail (mut f64) (f64.const 0)) (global $binary/I (mut i64) (i64.const 0)) (global $binary/f (mut f32) (f32.const 0)) (global $binary/F (mut f64) (f64.const 0)) (export "memory" (memory $0)) (start $~start) - (func $~lib/math/NativeMath.pow (; 0 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.scalbn (; 0 ;) (param $0 f64) (param $1 i32) (result f64) (local $2 f64) - (local $3 f64) + (local $3 i32) (local $4 i32) - (local $5 i64) - (local $6 i64) - (local $7 i64) - (local $8 i64) - (local $9 i64) - (local $10 f64) - (local $11 i64) + local.get $0 + local.set $2 + local.get $1 + i32.const 1023 + i32.gt_s + if + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 + i32.sub + local.set $1 + local.get $1 + i32.const 1023 + i32.gt_s + if + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 + i32.sub + local.tee $3 + i32.const 1023 + local.tee $4 + local.get $3 + local.get $4 + i32.lt_s + select + local.set $1 + end + else + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.const 53 + i32.sub + i32.add + local.set $1 + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.add + i32.const 53 + i32.sub + local.tee $3 + i32.const -1022 + local.tee $4 + local.get $3 + local.get $4 + i32.gt_s + select + local.set $1 + end + end + end + local.get $2 + i64.const 1023 + local.get $1 + i64.extend_i32_s + i64.add + i64.const 52 + i64.shl + f64.reinterpret_i64 + f64.mul + ) + (func $~lib/math/NativeMath.pow (; 1 ;) (param $0 f64) (param $1 f64) (result f64) + (local $2 i64) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) (local $12 i32) - (local $13 i64) - (local $14 i64) + (local $13 i32) + (local $14 f64) (local $15 f64) (local $16 f64) (local $17 f64) @@ -53,14 +140,6 @@ (local $34 f64) (local $35 f64) (local $36 f64) - (local $37 f64) - (local $38 f64) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i64) - (local $44 i64) local.get $1 f64.abs f64.const 2 @@ -114,521 +193,626 @@ return end end - block $~lib/util/math/pow_lut|inlined.0 (result f64) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i64.reinterpret_f64 - local.set $5 - local.get $2 - i64.reinterpret_f64 - local.set $6 - local.get $5 - i64.const 52 - i64.shr_u - local.set $7 - local.get $6 - i64.const 52 - i64.shr_u - local.set $8 + local.get $0 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $3 + local.get $2 + i32.wrap_i64 + local.set $4 + local.get $1 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $2 + i32.wrap_i64 + local.set $6 + local.get $3 + i32.const 2147483647 + i32.and + local.set $7 + local.get $5 + i32.const 2147483647 + i32.and + local.set $8 + local.get $8 + local.get $6 + i32.or + i32.const 0 + i32.eq + if + f64.const 1 + return + end + local.get $7 + i32.const 2146435072 + i32.gt_s + if (result i32) + i32.const 1 + else local.get $7 - i64.const 1 - i64.sub - i64.const 2046 - i64.ge_u + i32.const 2146435072 + i32.eq if (result i32) - i32.const 1 + local.get $4 + i32.const 0 + i32.ne else - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + i32.const 0 end - if + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.gt_s + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.eq + if (result i32) local.get $6 + i32.const 0 + i32.ne + else + i32.const 0 + end + end + if + local.get $0 + local.get $1 + f64.add + return + end + i32.const 0 + local.set $9 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $8 + i32.const 1128267776 + i32.ge_s + if + i32.const 2 local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + else + local.get $8 + i32.const 1072693248 + i32.ge_s if + local.get $8 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 52 + i32.const 20 + local.get $10 + i32.const 20 + i32.gt_s + select + local.get $10 + i32.sub + local.set $11 local.get $6 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - end - if - local.get $3 - local.get $2 - f64.add - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.lt_u - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - i32.eqz + local.get $8 + local.get $10 + i32.const 20 + i32.gt_s + select + local.set $12 + local.get $12 + local.get $11 + i32.shr_u + local.set $13 + local.get $13 + local.get $11 + i32.shl + local.get $12 i32.eq if - f64.const 0 - br $~lib/util/math/pow_lut|inlined.0 + i32.const 2 + local.get $13 + i32.const 1 + i32.and + i32.sub + local.set $9 end - local.get $2 - local.get $2 - f64.mul - br $~lib/util/math/pow_lut|inlined.0 end - local.get $5 - local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + end + end + local.get $6 + i32.const 0 + i32.eq + if + local.get $8 + i32.const 2146435072 + i32.eq + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $4 + i32.or + i32.const 0 + i32.eq if - local.get $3 - local.get $3 - f64.mul - local.set $10 - local.get $5 - i64.const 63 - i64.shr_u - i32.wrap_i64 - if (result i32) - block $~lib/util/math/checkint|inlined.0 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.0 - end - i64.const 1 - i64.const 1075 - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.0 - end - i32.const 2 + f64.const nan:0x8000000000000 + return + else + local.get $7 + i32.const 1072693248 + i32.ge_s + if + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + local.get $1 + else + f64.const 0 end - i32.const 1 - i32.eq + return else + local.get $5 i32.const 0 + i32.ge_s + if (result f64) + f64.const 0 + else + local.get $1 + f64.neg + end + return end - if - local.get $10 - f64.neg - local.set $10 - end - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - f64.const 1 - local.get $10 - f64.div - else - local.get $10 - end - br $~lib/util/math/pow_lut|inlined.0 + unreachable end + unreachable + end + local.get $8 + i32.const 1072693248 + i32.eq + if local.get $5 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne + i32.const 0 + i32.ge_s if - block $~lib/util/math/checkint|inlined.1 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.1 - end - i64.const 1 - i64.const 1023 - i64.const 52 - i64.add - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.1 - end - i32.const 2 - end - local.set $12 - local.get $12 + local.get $0 + return + end + f64.const 1 + local.get $0 + f64.div + return + end + local.get $5 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f64.mul + return + end + local.get $5 + i32.const 1071644672 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if + local.get $0 + f64.sqrt + return + end + end + end + local.get $0 + f64.abs + local.set $14 + local.get $4 + i32.const 0 + i32.eq + if + local.get $7 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 2146435072 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 1072693248 + i32.eq + end + if + local.get $14 + local.set $15 + local.get $5 + i32.const 0 + i32.lt_s + if + f64.const 1 + local.get $15 + f64.div + local.set $15 + end + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $9 + i32.or i32.const 0 i32.eq if - local.get $3 - local.get $3 - f64.sub - local.get $3 - local.get $3 + local.get $15 + local.get $15 f64.sub + local.set $16 + local.get $16 + local.get $16 f64.div - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $12 - i32.const 1 - i32.eq - if - i32.const 262144 - local.set $4 + local.set $15 + else + local.get $9 + i32.const 1 + i32.eq + if + local.get $15 + f64.neg + local.set $15 + end end - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $7 - i64.const 2047 - i64.and - local.set $7 end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + local.get $15 + return + end + end + f64.const 1 + local.set $16 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $9 + i32.const 0 + i32.eq + if + local.get $0 + local.get $0 + f64.sub + local.set $17 + local.get $17 + local.get $17 + f64.div + return + end + local.get $9 + i32.const 1 + i32.eq + if + f64.const -1 + local.set $16 + end + end + local.get $8 + i32.const 1105199104 + i32.gt_s + if + local.get $8 + i32.const 1139802112 + i32.gt_s + if + local.get $7 + i32.const 1072693247 + i32.le_s if local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.lt_u - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.gt_u - local.get $8 - i64.const 2048 - i64.lt_u - i32.eq + i32.const 0 + i32.lt_s if (result f64) - f64.const inf + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul else - f64.const 0 + f64.const 1e-300 + f64.const 1e-300 + f64.mul end - br $~lib/util/math/pow_lut|inlined.0 + return end local.get $7 - i64.const 0 - i64.eq + i32.const 1072693248 + i32.ge_s if - local.get $3 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $5 local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $5 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $5 + i32.const 0 + i32.gt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return end end - local.get $5 - local.set $9 - local.get $9 - i64.const 4604531861337669632 - i64.sub - local.set $11 - local.get $11 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $12 - local.get $11 - i64.const 52 - i64.shr_s - local.set $13 - local.get $9 - local.get $11 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $14 - local.get $14 - f64.reinterpret_i64 - local.set $10 - local.get $13 - f64.convert_i64_s - local.set $15 - i32.const 32 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $16 - i32.const 32 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=16 - local.set $17 - i32.const 32 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=24 - local.set $18 + local.get $7 + i32.const 1072693247 + i32.lt_s + if + local.get $5 + i32.const 0 + i32.lt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.gt_s + if + local.get $5 + i32.const 0 + i32.gt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end local.get $14 - i64.const 2147483648 - i64.add - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $19 - local.get $10 - local.get $19 - f64.sub - local.set $20 - local.get $19 - local.get $16 - f64.mul f64.const 1 f64.sub - local.set $21 - local.get $20 - local.get $16 - f64.mul local.set $22 - local.get $21 local.get $22 - f64.add - local.set $23 - local.get $15 - f64.const 0.6931471805598903 + local.get $22 + f64.mul + f64.const 0.5 + local.get $22 + f64.const 0.3333333333333333 + local.get $22 + f64.const 0.25 + f64.mul + f64.sub + f64.mul + f64.sub f64.mul - local.get $17 - f64.add - local.set $24 - local.get $24 - local.get $23 - f64.add local.set $25 - local.get $15 - f64.const 5.497923018708371e-14 + f64.const 1.4426950216293335 + local.get $22 + f64.mul + local.set $23 + local.get $22 + f64.const 1.9259629911266175e-08 f64.mul - local.get $18 - f64.add - local.set $26 - local.get $24 local.get $25 + f64.const 1.4426950408889634 + f64.mul f64.sub + local.set $24 local.get $23 + local.get $24 f64.add - local.set $27 - f64.const -0.5 + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $17 + local.get $24 + local.get $17 + local.get $23 + f64.sub + f64.sub + local.set $18 + else + i32.const 0 + local.set $12 + local.get $7 + i32.const 1048576 + i32.lt_s + if + local.get $14 + f64.const 9007199254740992 + f64.mul + local.set $14 + local.get $12 + i32.const 53 + i32.sub + local.set $12 + local.get $14 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $7 + end + local.get $12 + local.get $7 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $12 + local.get $7 + i32.const 1048575 + i32.and + local.set $13 + local.get $13 + i32.const 1072693248 + i32.or + local.set $7 + local.get $13 + i32.const 235662 + i32.le_s + if + i32.const 0 + local.set $10 + else + local.get $13 + i32.const 767610 + i32.lt_s + if + i32.const 1 + local.set $10 + else + i32.const 0 + local.set $10 + local.get $12 + i32.const 1 + i32.add + local.set $12 + local.get $7 + i32.const 1048576 + i32.sub + local.set $7 + end + end + local.get $14 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $7 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.set $14 + f64.const 1.5 + f64.const 1 + local.get $10 + select + local.set $32 + local.get $14 + local.get $32 + f64.sub + local.set $23 + f64.const 1 + local.get $14 + local.get $32 + f64.add + f64.div + local.set $24 local.get $23 + local.get $24 f64.mul + local.set $26 + local.get $26 local.set $28 - local.get $23 local.get $28 - f64.mul - local.set $29 - local.get $23 - local.get $29 - f64.mul + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $28 + local.get $7 + i32.const 1 + i32.shr_s + i32.const 536870912 + i32.or + i32.const 524288 + i32.add + local.get $10 + i32.const 18 + i32.shl + i32.add + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 local.set $30 - f64.const -0.5 - local.get $21 - f64.mul + local.get $14 + local.get $30 + local.get $32 + f64.sub + f64.sub local.set $31 - local.get $21 - local.get $31 + local.get $24 + local.get $23 + local.get $28 + local.get $30 f64.mul - local.set $32 - local.get $25 - local.get $32 - f64.add - local.set $33 - local.get $22 + f64.sub local.get $28 local.get $31 - f64.add f64.mul - local.set $34 - local.get $25 - local.get $33 f64.sub - local.get $32 - f64.add - local.set $35 - local.get $30 - f64.const -0.6666666666666679 - local.get $23 - f64.const 0.5000000000000007 + f64.mul + local.set $29 + local.get $26 + local.get $26 + f64.mul + local.set $27 + local.get $27 + local.get $27 + f64.mul + f64.const 0.5999999999999946 + local.get $27 + f64.const 0.4285714285785502 + local.get $27 + f64.const 0.33333332981837743 + local.get $27 + f64.const 0.272728123808534 + local.get $27 + f64.const 0.23066074577556175 + local.get $27 + f64.const 0.20697501780033842 f64.mul f64.add - local.get $29 - f64.const 0.7999999995323976 - local.get $23 - f64.const -0.6666666663487739 f64.mul f64.add - local.get $29 - f64.const -1.142909628459501 - local.get $23 - f64.const 1.0000415263675542 f64.mul f64.add f64.mul @@ -636,348 +820,420 @@ f64.mul f64.add f64.mul - local.set $36 + local.set $21 + local.get $21 + local.get $29 + local.get $28 local.get $26 - local.get $27 - f64.add - local.get $34 - f64.add - local.get $35 f64.add - local.get $36 + f64.mul f64.add - local.set $37 - local.get $33 - local.get $37 + local.set $21 + local.get $28 + local.get $28 + f64.mul + local.set $27 + f64.const 3 + local.get $27 f64.add - local.set $38 - local.get $33 - local.get $38 - f64.sub - local.get $37 + local.get $21 f64.add - global.set $~lib/util/math/log_tail - local.get $38 - local.set $38 - global.get $~lib/util/math/log_tail - local.set $37 - local.get $6 - i64.const -134217728 - i64.and - f64.reinterpret_i64 - local.set $34 - local.get $2 - local.get $34 - f64.sub - local.set $33 - local.get $38 + local.set $30 + local.get $30 i64.reinterpret_f64 - i64.const -134217728 + i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $32 - local.get $38 - local.get $32 + local.set $30 + local.get $21 + local.get $30 + f64.const 3 + f64.sub + local.get $27 + f64.sub f64.sub - local.get $37 - f64.add local.set $31 - local.get $34 - local.get $32 + local.get $28 + local.get $30 f64.mul - local.set $36 - local.get $33 - local.get $32 + local.set $23 + local.get $29 + local.get $30 f64.mul - local.get $2 local.get $31 + local.get $26 f64.mul f64.add - local.set $35 - block $~lib/util/math/exp_inline|inlined.0 (result f64) - local.get $36 - local.set $15 - local.get $35 - local.set $10 - local.get $4 - local.set $12 - local.get $15 - i64.reinterpret_f64 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i32.wrap_i64 - i32.const 2047 - i32.and - local.set $39 - local.get $39 - i32.const 969 - i32.sub - i32.const 63 - i32.ge_u - if - local.get $39 - i32.const 969 - i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const -1 - f64.const 1 - local.get $12 - select - br $~lib/util/math/exp_inline|inlined.0 - end - local.get $39 - i32.const 1033 - i32.ge_u - if - local.get $9 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - local.get $12 - local.set $41 - local.get $41 - local.set $42 - i64.const 1152921504606846976 - f64.reinterpret_i64 - local.set $16 - local.get $16 - f64.neg - local.get $16 - local.get $42 - select - local.get $16 - f64.mul - else - local.get $12 - local.set $42 - local.get $42 - local.set $41 - i64.const 8070450532247928832 - f64.reinterpret_i64 - local.set $17 - local.get $17 - f64.neg - local.get $17 - local.get $41 - select - local.get $17 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 - end - i32.const 0 - local.set $39 - end - f64.const 184.6649652337873 - local.get $15 - f64.mul - local.set $29 - local.get $29 - f64.const 6755399441055744 - f64.add - local.set $30 - local.get $30 - i64.reinterpret_f64 - local.set $14 - local.get $30 - f64.const 6755399441055744 - f64.sub - local.set $30 - local.get $15 - local.get $30 - f64.const -0.005415212348111709 - f64.mul - f64.add - local.get $30 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $28 - local.get $28 - local.get $10 - f64.add - local.set $28 - local.get $14 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $40 - local.get $14 - local.get $12 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $13 - i32.const 4144 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $25 - i32.const 4144 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $13 - i64.add - local.set $11 - local.get $28 - local.get $28 - f64.mul - local.set $27 - local.get $25 - local.get $28 - f64.add - local.get $27 - f64.const 0.49999999999996786 - local.get $28 - f64.const 0.16666666666665886 - f64.mul - f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $19 + local.get $19 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $19 + local.get $24 + local.get $19 + local.get $23 + f64.sub + f64.sub + local.set $20 + f64.const 0.9617967009544373 + local.get $19 + f64.mul + local.set $33 + f64.const 1.350039202129749e-08 + f64.const 0 + local.get $10 + select + local.set $34 + f64.const -7.028461650952758e-09 + local.get $19 + f64.mul + local.get $20 + f64.const 0.9617966939259756 + f64.mul + f64.add + local.get $34 + f64.add + local.set $35 + local.get $12 + f64.convert_i32_s + local.set $22 + f64.const 0.5849624872207642 + f64.const 0 + local.get $10 + select + local.set $36 + local.get $33 + local.get $35 + f64.add + local.get $36 + f64.add + local.get $22 + f64.add + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $17 + local.get $35 + local.get $17 + local.get $22 + f64.sub + local.get $36 + f64.sub + local.get $33 + f64.sub + f64.sub + local.set $18 + end + local.get $1 + local.set $36 + local.get $36 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $36 + local.get $1 + local.get $36 + f64.sub + local.get $17 + f64.mul + local.get $1 + local.get $18 + f64.mul + f64.add + local.set $20 + local.get $36 + local.get $17 + f64.mul + local.set $19 + local.get $20 + local.get $19 + f64.add + local.set $15 + local.get $15 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $2 + i32.wrap_i64 + local.set $11 + local.get $13 + i32.const 1083179008 + i32.ge_s + if + local.get $13 + i32.const 1083179008 + i32.sub + local.get $11 + i32.or + i32.const 0 + i32.ne + if + local.get $16 + f64.const 1.e+300 f64.mul - f64.add - local.get $27 - local.get $27 + f64.const 1.e+300 f64.mul - f64.const 0.0416666808410674 - local.get $28 - f64.const 0.008333335853059549 + return + end + local.get $20 + f64.const 8.008566259537294e-17 + f64.add + local.get $15 + local.get $19 + f64.sub + f64.gt + if + local.get $16 + f64.const 1.e+300 f64.mul - f64.add + f64.const 1.e+300 f64.mul - f64.add - local.set $24 - local.get $39 + return + end + else + local.get $13 + i32.const 2147483647 + i32.and + i32.const 1083231232 + i32.ge_s + if + local.get $13 + i32.const -1064252416 + i32.sub + local.get $11 + i32.or i32.const 0 - i32.eq + i32.ne if - block $~lib/util/math/specialcase|inlined.0 (result f64) - local.get $24 - local.set $18 - local.get $11 - local.set $44 - local.get $14 - local.set $43 - local.get $43 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $44 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.0 - end - local.get $44 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $16 - local.get $16 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $16 - f64.copysign - local.set $23 - local.get $17 - local.get $16 - f64.sub - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $22 - local.get $23 - local.get $16 - f64.add - local.set $21 - local.get $23 - local.get $21 - f64.sub - local.get $16 - f64.add - local.get $22 - f64.add - local.set $22 - local.get $21 - local.get $22 - f64.add - local.get $23 - f64.sub - local.set $16 - local.get $16 - f64.const 0 - f64.eq - if - local.get $44 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $16 - end - end - local.get $16 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return end - local.get $11 - f64.reinterpret_i64 - local.set $26 - local.get $26 - local.get $26 - local.get $24 - f64.mul - f64.add + local.get $20 + local.get $15 + local.get $19 + f64.sub + f64.le + if + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return + end + end + end + local.get $13 + i32.const 2147483647 + i32.and + local.set $11 + local.get $11 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 0 + local.set $12 + local.get $11 + i32.const 1071644672 + i32.gt_s + if + local.get $13 + i32.const 1048576 + local.get $10 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.set $12 + local.get $12 + i32.const 2147483647 + i32.and + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + f64.const 0 + local.set $22 + local.get $12 + i32.const 1048575 + local.get $10 + i32.shr_s + i32.const -1 + i32.xor + i32.and + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $22 + local.get $12 + i32.const 1048575 + i32.and + i32.const 1048576 + i32.or + i32.const 20 + local.get $10 + i32.sub + i32.shr_s + local.set $12 + local.get $13 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $12 + i32.sub + local.set $12 end + local.get $19 + local.get $22 + f64.sub + local.set $19 + end + local.get $20 + local.get $19 + f64.add + local.set $22 + local.get $22 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $22 + local.get $22 + f64.const 0.6931471824645996 + f64.mul + local.set $23 + local.get $20 + local.get $22 + local.get $19 + f64.sub + f64.sub + f64.const 0.6931471805599453 + f64.mul + local.get $22 + f64.const -1.904654299957768e-09 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $15 + local.get $24 + local.get $15 + local.get $23 + f64.sub + f64.sub + local.set $25 + local.get $15 + local.get $15 + f64.mul + local.set $22 + local.get $15 + local.get $22 + f64.const 0.16666666666666602 + local.get $22 + f64.const -2.7777777777015593e-03 + local.get $22 + f64.const 6.613756321437934e-05 + local.get $22 + f64.const -1.6533902205465252e-06 + local.get $22 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.sub + local.set $17 + local.get $15 + local.get $17 + f64.mul + local.get $17 + f64.const 2 + f64.sub + f64.div + local.get $25 + local.get $15 + local.get $25 + f64.mul + f64.add + f64.sub + local.set $21 + f64.const 1 + local.get $21 + local.get $15 + f64.sub + f64.sub + local.set $15 + local.get $15 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $13 + local.get $12 + i32.const 20 + i32.shl + i32.add + local.set $13 + local.get $13 + i32.const 20 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $15 + local.get $12 + call $~lib/math/NativeMath.scalbn + local.set $15 + else + local.get $15 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $13 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.set $15 end + local.get $16 + local.get $15 + f64.mul return ) - (func $~lib/math/NativeMathf.mod (; 1 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.mod (; 2 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1225,30 +1481,132 @@ local.get $2 f32.reinterpret_i32 ) - (func $~lib/math/NativeMathf.pow (; 2 ;) (param $0 f32) (param $1 f32) (result f32) + (func $~lib/math/NativeMathf.scalbn (; 3 ;) (param $0 f32) (param $1 i32) (result f32) (local $2 f32) - (local $3 f32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.set $2 + local.get $1 + i32.const 127 + i32.gt_s + if + local.get $2 + f32.const 1701411834604692317316873e14 + f32.mul + local.set $2 + local.get $1 + i32.const 127 + i32.sub + local.set $1 + local.get $1 + i32.const 127 + i32.gt_s + if + local.get $2 + f32.const 1701411834604692317316873e14 + f32.mul + local.set $2 + local.get $1 + i32.const 127 + i32.sub + local.tee $3 + i32.const 127 + local.tee $4 + local.get $3 + local.get $4 + i32.lt_s + select + local.set $1 + end + else + local.get $1 + i32.const -126 + i32.lt_s + if + local.get $2 + f32.const 1.1754943508222875e-38 + f32.const 16777216 + f32.mul + f32.mul + local.set $2 + local.get $1 + i32.const 126 + i32.const 24 + i32.sub + i32.add + local.set $1 + local.get $1 + i32.const -126 + i32.lt_s + if + local.get $2 + f32.const 1.1754943508222875e-38 + f32.const 16777216 + f32.mul + f32.mul + local.set $2 + local.get $1 + i32.const 126 + i32.add + i32.const 24 + i32.sub + local.tee $3 + i32.const -126 + local.tee $4 + local.get $3 + local.get $4 + i32.gt_s + select + local.set $1 + end + end + end + local.get $2 + i32.const 127 + local.get $1 + i32.add + i32.const 23 + i32.shl + f32.reinterpret_i32 + f32.mul + ) + (func $~lib/math/NativeMathf.pow (; 4 ;) (param $0 f32) (param $1 f32) (result f32) + (local $2 i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) - (local $9 f32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 f64) - (local $16 f64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - (local $22 f64) - (local $23 i64) - (local $24 i64) + (local $9 i32) + (local $10 f32) + (local $11 f32) + (local $12 f32) + (local $13 f32) + (local $14 f32) + (local $15 f32) + (local $16 f32) + (local $17 f32) + (local $18 f32) + (local $19 f32) + (local $20 f32) + (local $21 f32) + (local $22 f32) + (local $23 f32) + (local $24 i32) + (local $25 i32) + (local $26 f32) + (local $27 f32) + (local $28 f32) + (local $29 f32) + (local $30 f32) + (local $31 f32) + (local $32 f32) + (local $33 f32) + (local $34 f32) + (local $35 f32) + (local $36 i32) local.get $1 f32.abs f32.const 2 @@ -1278,539 +1636,929 @@ select return end - local.get $1 - f32.const -1 - f32.eq - if + local.get $1 + f32.const -1 + f32.eq + if + f32.const 1 + local.get $0 + f32.div + return + end + local.get $1 + f32.const 1 + f32.eq + if + local.get $0 + return + end + local.get $1 + f32.const 0 + f32.eq + if + f32.const 1 + return + end + end + local.get $0 + i32.reinterpret_f32 + local.set $2 + local.get $1 + i32.reinterpret_f32 + local.set $3 + local.get $2 + i32.const 2147483647 + i32.and + local.set $4 + local.get $3 + i32.const 2147483647 + i32.and + local.set $5 + local.get $5 + i32.const 0 + i32.eq + if + f32.const 1 + return + end + local.get $4 + i32.const 2139095040 + i32.gt_s + if (result i32) + i32.const 1 + else + local.get $5 + i32.const 2139095040 + i32.gt_s + end + if + local.get $0 + local.get $1 + f32.add + return + end + i32.const 0 + local.set $6 + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $5 + i32.const 1266679808 + i32.ge_s + if + i32.const 2 + local.set $6 + else + local.get $5 + i32.const 1065353216 + i32.ge_s + if + local.get $5 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 + i32.const 23 + local.get $8 + i32.sub + local.set $9 + local.get $5 + local.get $9 + i32.shr_s + local.set $7 + local.get $7 + local.get $9 + i32.shl + local.get $5 + i32.eq + if + i32.const 2 + local.get $7 + i32.const 1 + i32.and + i32.sub + local.set $6 + end + end + end + end + local.get $5 + i32.const 2139095040 + i32.eq + if + local.get $4 + i32.const 1065353216 + i32.eq + if + f32.const nan:0x400000 + return + else + local.get $4 + i32.const 1065353216 + i32.gt_s + if + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + local.get $1 + else + f32.const 0 + end + return + else + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + f32.const 0 + else + local.get $1 + f32.neg + end + return + end + unreachable + end + unreachable + end + local.get $5 + i32.const 1065353216 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if (result f32) + local.get $0 + else f32.const 1 local.get $0 f32.div - return end - local.get $1 - f32.const 1 - f32.eq + return + end + local.get $3 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f32.mul + return + end + local.get $3 + i32.const 1056964608 + i32.eq + if + local.get $2 + i32.const 0 + i32.ge_s if local.get $0 - return - end - local.get $1 - f32.const 0 - f32.eq - if - f32.const 1 + f32.sqrt return end end - block $~lib/util/math/powf_lut|inlined.0 (result f32) - local.get $0 - local.set $3 - local.get $1 - local.set $2 + local.get $0 + f32.abs + local.set $10 + local.get $4 + i32.const 2139095040 + i32.eq + if (result i32) + i32.const 1 + else + local.get $4 i32.const 0 - local.set $4 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 1065353216 + i32.eq + end + if + local.get $10 + local.set $11 local.get $3 - i32.reinterpret_f32 - local.set $5 - local.get $2 - i32.reinterpret_f32 - local.set $6 i32.const 0 - local.set $7 - local.get $5 - i32.const 8388608 - i32.sub - i32.const 2130706432 - i32.ge_u - local.get $6 - local.set $8 - local.get $8 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u + i32.lt_s + if + f32.const 1 + local.get $11 + f32.div + local.set $11 + end + local.get $2 i32.const 0 - i32.ne - local.tee $7 - i32.or + i32.lt_s if - local.get $7 + local.get $4 + i32.const 1065353216 + i32.sub + local.get $6 + i32.or + i32.const 0 + i32.eq if + local.get $11 + local.get $11 + f32.sub + local.set $12 + local.get $12 + local.get $12 + f32.div + local.set $11 + else local.get $6 i32.const 1 - i32.shl - i32.const 0 - i32.eq - if - f32.const 1 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1065353216 - i32.eq - if - f32.const nan:0x400000 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i32.const 1 - i32.shl - i32.const -16777216 - i32.gt_u - end - if - local.get $3 - local.get $2 - f32.add - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const 2130706432 - i32.eq - if - f32.const nan:0x400000 - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 1 - i32.shl - i32.const 2130706432 - i32.lt_u - local.get $6 - i32.const 31 - i32.shr_u - i32.eqz i32.eq if - f32.const 0 - br $~lib/util/math/powf_lut|inlined.0 + local.get $11 + f32.neg + local.set $11 end - local.get $2 - local.get $2 + end + end + local.get $11 + return + end + f32.const 1 + local.set $13 + local.get $2 + i32.const 0 + i32.lt_s + if + local.get $6 + i32.const 0 + i32.eq + if + local.get $0 + local.get $0 + f32.sub + local.set $12 + local.get $12 + local.get $12 + f32.div + return + end + local.get $6 + i32.const 1 + i32.eq + if + f32.const -1 + local.set $13 + end + end + local.get $5 + i32.const 1291845632 + i32.gt_s + if + local.get $4 + i32.const 1065353208 + i32.lt_s + if + local.get $3 + i32.const 0 + i32.lt_s + if (result f32) + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + else + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 f32.mul - br $~lib/util/math/powf_lut|inlined.0 end - local.get $5 + return + end + local.get $4 + i32.const 1065353223 + i32.gt_s + if + local.get $3 + i32.const 0 + i32.gt_s + if (result f32) + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + else + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + end + return + end + local.get $10 + f32.const 1 + f32.sub + local.set $18 + local.get $18 + local.get $18 + f32.mul + f32.const 0.5 + local.get $18 + f32.const 0.3333333432674408 + local.get $18 + f32.const 0.25 + f32.mul + f32.sub + f32.mul + f32.sub + f32.mul + local.set $21 + f32.const 1.44268798828125 + local.get $18 + f32.mul + local.set $19 + local.get $18 + f32.const 7.052607543300837e-06 + f32.mul + local.get $21 + f32.const 1.4426950216293335 + f32.mul + f32.sub + local.set $20 + local.get $19 + local.get $20 + f32.add + local.set $14 + local.get $14 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $14 + local.get $20 + local.get $14 + local.get $19 + f32.sub + f32.sub + local.set $15 + else + i32.const 0 + local.set $24 + local.get $4 + i32.const 8388608 + i32.lt_s + if + local.get $10 + f32.const 16777216 + f32.mul + local.set $10 + local.get $24 + i32.const 24 + i32.sub + local.set $24 + local.get $10 + i32.reinterpret_f32 + local.set $4 + end + local.get $24 + local.get $4 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + i32.add + local.set $24 + local.get $4 + i32.const 8388607 + i32.and + local.set $7 + local.get $7 + i32.const 1065353216 + i32.or + local.set $4 + local.get $7 + i32.const 1885297 + i32.le_s + if + i32.const 0 local.set $8 - local.get $8 - i32.const 1 - i32.shl - i32.const 1 - i32.sub - i32.const -16777217 - i32.ge_u - if - local.get $3 - local.get $3 - f32.mul - local.set $9 - local.get $5 - i32.const 31 - i32.shr_u - if (result i32) - block $~lib/util/math/checkintf|inlined.0 (result i32) - local.get $6 - local.set $8 - local.get $8 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.set $10 - local.get $10 - i32.const 127 - i32.lt_u - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.0 - end - local.get $10 - i32.const 150 - i32.gt_u - if - i32.const 2 - br $~lib/util/math/checkintf|inlined.0 - end - i32.const 1 - i32.const 150 - local.get $10 - i32.sub - i32.shl - local.set $10 - local.get $8 - local.get $10 - i32.const 1 - i32.sub - i32.and - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.0 - end - local.get $8 - local.get $10 - i32.and - if - i32.const 1 - br $~lib/util/math/checkintf|inlined.0 - end - i32.const 2 - end - i32.const 1 - i32.eq - else - i32.const 0 - end - if - local.get $9 - f32.neg - local.set $9 - end - local.get $6 - i32.const 31 - i32.shr_u - if (result f32) - f32.const 1 - local.get $9 - f32.div - else - local.get $9 - end - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $5 - i32.const 31 - i32.shr_u + else + local.get $7 + i32.const 6140887 + i32.lt_s if - block $~lib/util/math/checkintf|inlined.1 (result i32) - local.get $6 - local.set $8 - local.get $8 - i32.const 23 - i32.shr_u - i32.const 255 - i32.and - local.set $10 - local.get $10 - i32.const 127 - i32.lt_u - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.1 - end - local.get $10 - i32.const 150 - i32.gt_u - if - i32.const 2 - br $~lib/util/math/checkintf|inlined.1 - end - i32.const 1 - i32.const 127 - i32.const 23 - i32.add - local.get $10 - i32.sub - i32.shl - local.set $10 - local.get $8 - local.get $10 - i32.const 1 - i32.sub - i32.and - if - i32.const 0 - br $~lib/util/math/checkintf|inlined.1 - end - local.get $8 - local.get $10 - i32.and - if - i32.const 1 - br $~lib/util/math/checkintf|inlined.1 - end - i32.const 2 - end - local.set $10 - local.get $10 + i32.const 1 + local.set $8 + else i32.const 0 - i32.eq - if - local.get $3 - local.get $3 - f32.sub - local.get $3 - local.get $3 - f32.sub - f32.div - br $~lib/util/math/powf_lut|inlined.0 - end - local.get $10 + local.set $8 + local.get $24 i32.const 1 - i32.eq - if - i32.const 65536 - local.set $4 - end - local.get $5 - i32.const 2147483647 - i32.and - local.set $5 - end - local.get $5 - i32.const 8388608 - i32.lt_u - if - local.get $3 - f32.const 8388608 - f32.mul - i32.reinterpret_f32 - local.set $5 - local.get $5 - i32.const 2147483647 - i32.and - local.set $5 - local.get $5 - i32.const 23 - i32.const 23 - i32.shl + i32.add + local.set $24 + local.get $4 + i32.const 8388608 i32.sub - local.set $5 + local.set $4 end end - local.get $5 - local.set $8 - local.get $8 - i32.const 1060306944 - i32.sub + local.get $4 + f32.reinterpret_i32 local.set $10 + f32.const 1.5 + f32.const 1 + local.get $8 + select + local.set $30 local.get $10 - i32.const 23 - i32.const 4 - i32.sub - i32.shr_u - i32.const 15 - i32.and - local.set $11 + local.get $30 + f32.sub + local.set $19 + f32.const 1 local.get $10 - i32.const -8388608 + local.get $30 + f32.add + f32.div + local.set $20 + local.get $19 + local.get $20 + f32.mul + local.set $17 + local.get $17 + local.set $26 + local.get $26 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 i32.and - local.set $12 - local.get $8 - local.get $12 - i32.sub - local.set $13 - local.get $12 - i32.const 23 - i32.shr_s - local.set $14 - i32.const 6208 - local.get $11 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $15 - i32.const 6208 - local.get $11 + f32.reinterpret_i32 + local.set $26 + local.get $4 i32.const 1 - i32.const 3 + i32.shr_s + i32.const -4096 + i32.and + i32.const 536870912 + i32.or + local.set $25 + local.get $25 + i32.const 4194304 i32.add + local.get $8 + i32.const 21 i32.shl i32.add - f64.load offset=8 - local.set $16 - local.get $13 f32.reinterpret_i32 - f64.promote_f32 - local.set $17 + local.set $28 + local.get $10 + local.get $28 + local.get $30 + f32.sub + f32.sub + local.set $29 + local.get $20 + local.get $19 + local.get $26 + local.get $28 + f32.mul + f32.sub + local.get $26 + local.get $29 + f32.mul + f32.sub + f32.mul + local.set $27 local.get $17 - local.get $15 - f64.mul - f64.const 1 - f64.sub - local.set $18 + local.get $17 + f32.mul + local.set $12 + local.get $12 + local.get $12 + f32.mul + f32.const 0.6000000238418579 + local.get $12 + f32.const 0.4285714328289032 + local.get $12 + f32.const 0.3333333432674408 + local.get $12 + f32.const 0.2727281153202057 + local.get $12 + f32.const 0.23066075146198273 + local.get $12 + f32.const 0.20697501301765442 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + local.set $16 local.get $16 - local.get $14 - f64.convert_i32_s - f64.add + local.get $27 + local.get $26 + local.get $17 + f32.add + f32.mul + f32.add + local.set $16 + local.get $26 + local.get $26 + f32.mul + local.set $12 + f32.const 3 + local.get $12 + f32.add + local.get $16 + f32.add + local.set $28 + local.get $28 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $28 + local.get $16 + local.get $28 + f32.const 3 + f32.sub + local.get $12 + f32.sub + f32.sub + local.set $29 + local.get $26 + local.get $28 + f32.mul local.set $19 - f64.const 0.288457581109214 - local.get $18 - f64.mul - f64.const -0.36092606229713164 - f64.add + local.get $27 + local.get $28 + f32.mul + local.get $29 + local.get $17 + f32.mul + f32.add local.set $20 - f64.const 0.480898481472577 - local.get $18 - f64.mul - f64.const -0.7213474675006291 - f64.add - local.set $21 - f64.const 1.4426950408774342 - local.get $18 - f64.mul local.get $19 - f64.add + local.get $20 + f32.add local.set $22 - local.get $18 - local.get $18 - f64.mul - local.set $18 local.get $22 - local.get $21 - local.get $18 - f64.mul - f64.add + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 local.set $22 local.get $20 + local.get $22 + local.get $19 + f32.sub + f32.sub + local.set $23 + f32.const 0.9619140625 + local.get $22 + f32.mul + local.set $31 + f32.const 1.5632208487659227e-06 + f32.const 0 + local.get $8 + select + local.set $32 + f32.const -1.1736857413779944e-04 + local.get $22 + f32.mul + local.get $23 + f32.const 0.9617967009544373 + f32.mul + f32.add + local.get $32 + f32.add + local.set $33 + local.get $24 + f32.convert_i32_s + local.set $18 + f32.const 0.5849609375 + f32.const 0 + local.get $8 + select + local.set $34 + local.get $31 + local.get $33 + f32.add + local.get $34 + f32.add local.get $18 + f32.add + local.set $14 + local.get $14 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $14 + local.get $33 + local.get $14 local.get $18 - f64.mul - f64.mul - local.get $22 - f64.add - local.set $20 - local.get $20 - local.set $22 - local.get $2 - f64.promote_f32 - local.get $22 - f64.mul - local.set $21 - local.get $21 - i64.reinterpret_f64 - i64.const 47 - i64.shr_u - i64.const 65535 - i64.and - i64.const 32959 - i64.ge_u + f32.sub + local.get $34 + f32.sub + local.get $31 + f32.sub + f32.sub + local.set $15 + end + local.get $1 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -4096 + i32.and + f32.reinterpret_i32 + local.set $35 + local.get $1 + local.get $35 + f32.sub + local.get $14 + f32.mul + local.get $1 + local.get $15 + f32.mul + f32.add + local.set $23 + local.get $35 + local.get $14 + f32.mul + local.set $22 + local.get $23 + local.get $22 + f32.add + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $7 + local.get $7 + i32.const 1124073472 + i32.gt_s + if + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 + f32.mul + return + else + local.get $7 + i32.const 1124073472 + i32.eq if - local.get $21 - f64.const 127.99999995700433 - f64.gt + local.get $23 + f32.const 4.299566569443414e-08 + f32.add + local.get $11 + local.get $22 + f32.sub + f32.gt if - local.get $4 - local.set $8 - local.get $8 - local.set $10 - i32.const 1879048192 - f32.reinterpret_i32 - local.set $9 - local.get $9 - f32.neg - local.get $9 - local.get $10 - select - local.get $9 + local.get $13 + f32.const 1000000015047466219876688e6 + f32.mul + f32.const 1000000015047466219876688e6 f32.mul - br $~lib/util/math/powf_lut|inlined.0 + return end - local.get $21 - f64.const -150 - f64.le + else + local.get $7 + i32.const 2147483647 + i32.and + i32.const 1125515264 + i32.gt_s if - local.get $4 - local.set $11 - local.get $11 - local.set $12 - i32.const 268435456 - f32.reinterpret_i32 - local.set $9 - local.get $9 - f32.neg - local.get $9 - local.get $12 - select - local.get $9 + local.get $13 + f32.const 1.0000000031710769e-30 f32.mul - br $~lib/util/math/powf_lut|inlined.0 + f32.const 1.0000000031710769e-30 + f32.mul + return + else + local.get $7 + i32.const -1021968384 + i32.eq + if + local.get $23 + local.get $11 + local.get $22 + f32.sub + f32.le + if + local.get $13 + f32.const 1.0000000031710769e-30 + f32.mul + f32.const 1.0000000031710769e-30 + f32.mul + return + end + end end end - local.get $21 - local.set $15 - local.get $4 - local.set $13 - local.get $15 - f64.const 211106232532992 - f64.add - local.set $20 - local.get $20 - i64.reinterpret_f64 - local.set $23 - local.get $15 - local.get $20 - f64.const 211106232532992 - f64.sub - f64.sub - local.set $19 - i32.const 6480 - local.get $23 - i32.wrap_i64 - i32.const 31 - i32.and - i32.const 3 - i32.shl + end + local.get $7 + i32.const 2147483647 + i32.and + local.set $36 + local.get $36 + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 + i32.const 0 + local.set $24 + local.get $36 + i32.const 1056964608 + i32.gt_s + if + local.get $7 + i32.const 8388608 + local.get $8 + i32.const 1 + i32.add + i32.shr_s i32.add - i64.load local.set $24 local.get $24 - local.get $23 - local.get $13 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 5 - i64.sub - i64.shl - i64.add - local.set $24 + i32.const 2147483647 + i32.and + i32.const 23 + i32.shr_s + i32.const 127 + i32.sub + local.set $8 local.get $24 - f64.reinterpret_i64 - local.set $16 - f64.const 0.05550361559341535 - local.get $19 - f64.mul - f64.const 0.2402284522445722 - f64.add + i32.const 8388607 + local.get $8 + i32.shr_s + i32.const -1 + i32.xor + i32.and + f32.reinterpret_i32 local.set $18 - f64.const 0.6931471806916203 - local.get $19 - f64.mul - f64.const 1 - f64.add - local.set $17 - local.get $17 + local.get $24 + i32.const 8388607 + i32.and + i32.const 8388608 + i32.or + i32.const 23 + local.get $8 + i32.sub + i32.shr_s + local.set $24 + local.get $7 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $24 + i32.sub + local.set $24 + end + local.get $22 local.get $18 - local.get $19 - local.get $19 - f64.mul - f64.mul - f64.add - local.set $17 - local.get $17 - local.get $16 - f64.mul - local.set $17 - local.get $17 - f32.demote_f64 + f32.sub + local.set $22 + end + local.get $23 + local.get $22 + f32.add + local.set $18 + local.get $18 + i32.reinterpret_f32 + local.set $25 + local.get $25 + i32.const -32768 + i32.and + f32.reinterpret_i32 + local.set $18 + local.get $18 + f32.const 0.693145751953125 + f32.mul + local.set $19 + local.get $23 + local.get $18 + local.get $22 + f32.sub + f32.sub + f32.const 0.6931471824645996 + f32.mul + local.get $18 + f32.const 1.4286065379565116e-06 + f32.mul + f32.add + local.set $20 + local.get $19 + local.get $20 + f32.add + local.set $11 + local.get $20 + local.get $11 + local.get $19 + f32.sub + f32.sub + local.set $21 + local.get $11 + local.get $11 + f32.mul + local.set $18 + local.get $11 + local.get $18 + f32.const 0.1666666716337204 + local.get $18 + f32.const -2.7777778450399637e-03 + local.get $18 + f32.const 6.61375597701408e-05 + local.get $18 + f32.const -1.6533901998627698e-06 + local.get $18 + f32.const 4.138136944220605e-08 + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.add + f32.mul + f32.sub + local.set $14 + local.get $11 + local.get $14 + f32.mul + local.get $14 + f32.const 2 + f32.sub + f32.div + local.get $21 + local.get $11 + local.get $21 + f32.mul + f32.add + f32.sub + local.set $16 + f32.const 1 + local.get $16 + local.get $11 + f32.sub + f32.sub + local.set $11 + local.get $11 + i32.reinterpret_f32 + local.set $7 + local.get $7 + local.get $24 + i32.const 23 + i32.shl + i32.add + local.set $7 + local.get $7 + i32.const 23 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $11 + local.get $24 + call $~lib/math/NativeMathf.scalbn + local.set $11 + else + local.get $7 + f32.reinterpret_i32 + local.set $11 end + local.get $13 + local.get $11 + f32.mul ) - (func $~lib/math/NativeMath.mod (; 3 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.mod (; 5 ;) (param $0 f64) (param $1 f64) (result f64) (local $2 i64) (local $3 i64) (local $4 i64) @@ -2064,7 +2812,7 @@ local.get $2 f64.reinterpret_i64 ) - (func $start:binary (; 4 ;) + (func $start:binary (; 6 ;) global.get $binary/i i32.const 1 i32.lt_s @@ -2672,7 +3420,7 @@ call $~lib/math/NativeMath.pow global.set $binary/F ) - (func $~start (; 5 ;) + (func $~start (; 7 ;) call $start:binary ) ) diff --git a/tests/compiler/mandelbrot.untouched.wat b/tests/compiler/mandelbrot.untouched.wat index 6d5ddb30d3..f54940891c 100644 --- a/tests/compiler/mandelbrot.untouched.wat +++ b/tests/compiler/mandelbrot.untouched.wat @@ -1,20 +1,15 @@ (module (type $f64_=>_f64 (func (param f64) (result f64))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (memory $0 1) - (data (i32.const 16) "\00\08\00\00\01\00\00\00\03\00\00\00\00\08\00\00\9f\de\e0\c3\f04\f7?\00\90\e6y\7f\cc\d7\bf\1f\e9,jx\13\f7?\00\00\0d\c2\eeo\d7\bf\a0\b5\fa\08`\f2\f6?\00\e0Q\13\e3\13\d7\bf}\8c\13\1f\a6\d1\f6?\00x(8[\b8\d6\bf\d1\b4\c5\0bI\b1\f6?\00x\80\90U]\d6\bf\ba\0c/3G\91\f6?\00\00\18v\d0\02\d6\bf#B\"\18\9fq\f6?\00\90\90\86\ca\a8\d5\bf\d9\1e\a5\99OR\f6?\00P\03VCO\d5\bf\c4$\8f\aaV3\f6?\00@k\c37\f6\d4\bf\14\dc\9dk\b3\14\f6?\00P\a8\fd\a7\9d\d4\bfL\\\c6Rd\f6\f5?\00\a8\899\92E\d4\bfO,\91\b5g\d8\f5?\00\b8\b09\f4\ed\d3\bf\de\90[\cb\bc\ba\f5?\00p\8fD\ce\96\d3\bfx\1a\d9\f2a\9d\f5?\00\a0\bd\17\1e@\d3\bf\87VF\12V\80\f5?\00\80F\ef\e2\e9\d2\bf\d3k\e7\ce\97c\f5?\00\e008\1b\94\d2\bf\93\7f\a7\e2%G\f5?\00\88\da\8c\c5>\d2\bf\83E\06B\ff*\f5?\00\90\')\e1\e9\d1\bf\df\bd\b2\db\"\0f\f5?\00\f8H+m\95\d1\bf\d7\de4G\8f\f3\f4?\00\f8\b9\9agA\d1\bf@(\de\cfC\d8\f4?\00\98\ef\94\d0\ed\d0\bf\c8\a3x\c0>\bd\f4?\00\10\db\18\a5\9a\d0\bf\8a%\e0\c3\7f\a2\f4?\00\b8cR\e6G\d0\bf4\84\d4$\05\88\f4?\00\f0\86E\"\eb\cf\bf\0b-\19\1b\cem\f4?\00\b0\17uJG\cf\bfT\189\d3\d9S\f4?\000\10=D\a4\ce\bfZ\84\b4D\':\f4?\00\b0\e9D\0d\02\ce\bf\fb\f8\15A\b5 \f4?\00\f0w)\a2`\cd\bf\b1\f4>\da\82\07\f4?\00\90\95\04\01\c0\cc\bf\8f\feW]\8f\ee\f3?\00\10\89V) \cc\bf\e9L\0b\a0\d9\d5\f3?\00\10\81\8d\17\81\cb\bf+\c1\10\c0`\bd\f3?\00\d0\d3\cc\c9\e2\ca\bf\b8\dau+$\a5\f3?\00\90\12.@E\ca\bf\02\d0\9f\cd\"\8d\f3?\00\f0\1dhw\a8\c9\bf\1cz\84\c5[u\f3?\000Him\0c\c9\bf\e26\adI\ce]\f3?\00\c0E\a6 q\c8\bf@\d4M\98yF\f3?\000\14\b4\8f\d6\c7\bf$\cb\ff\ce\\/\f3?\00pb<\b8<\c7\bfI\0d\a1uw\18\f3?\00`7\9b\9a\a3\c6\bf\909>7\c8\01\f3?\00\a0\b7T1\0b\c6\bfA\f8\95\bbN\eb\f2?\000$v}s\c5\bf\d1\a9\19\02\n\d5\f2?\000\c2\8f{\dc\c4\bf*\fd\b7\a8\f9\be\f2?\00\00\d2Q,F\c4\bf\ab\1b\0cz\1c\a9\f2?\00\00\83\bc\8a\b0\c3\bf0\b5\14`r\93\f2?\00\00Ik\99\1b\c3\bf\f5\a1WW\fa}\f2?\00@\a4\90T\87\c2\bf\bf;\1d\9b\b3h\f2?\00\a0y\f8\b9\f3\c1\bf\bd\f5\8f\83\9dS\f2?\00\a0,%\c8`\c1\bf;\08\c9\aa\b7>\f2?\00 \f7W\7f\ce\c0\bf\b6@\a9+\01*\f2?\00\a0\feI\dc<\c0\bf2A\cc\96y\15\f2?\00\80K\bc\bdW\bf\bf\9b\fc\d2\1d \01\f2?\00@@\96\087\be\bf\0bHMI\f4\ec\f1?\00@\f9>\98\17\bd\bfie\8fR\f5\d8\f1?\00\a0\d8Ng\f9\bb\bf|~W\11#\c5\f1?\00`/ y\dc\ba\bf\e9&\cbt|\b1\f1?\00\80(\e7\c3\c0\b9\bf\b6\1a,\0c\01\9e\f1?\00\c0r\b3F\a6\b8\bf\bdp\b6{\b0\8a\f1?\00\00\ac\b3\01\8d\b7\bf\b6\bc\ef%\8aw\f1?\00\008E\f1t\b6\bf\da1L5\8dd\f1?\00\80\87m\0e^\b5\bf\dd_\'\90\b9Q\f1?\00\e0\a1\de\\H\b4\bfL\d22\a4\0e?\f1?\00\a0jM\d93\b3\bf\da\f9\10r\8b,\f1?\00`\c5\f8y \b2\bf1\b5\ec(0\1a\f1?\00 b\98F\0e\b1\bf\af4\84\da\fb\07\f1?\00\00\d2jl\fa\af\bf\b3kN\0f\ee\f5\f0?\00@wJ\8d\da\ad\bf\ce\9f*]\06\e4\f0?\00\00\85\e4\ec\bc\ab\bf!\a5,cD\d2\f0?\00\c0\12@\89\a1\a9\bf\1a\98\e2|\a7\c0\f0?\00\c0\023X\88\a7\bf\d16\c6\83/\af\f0?\00\80\d6g^q\a5\bf9\13\a0\98\db\9d\f0?\00\80eI\8a\\\a3\bf\df\e7R\af\ab\8c\f0?\00@\15d\e3I\a1\bf\fb(N/\9f{\f0?\00\80\eb\82\c0r\9e\bf\19\8f5\8c\b5j\f0?\00\80RR\f1U\9a\bf,\f9\ec\a5\eeY\f0?\00\80\81\cfb=\96\bf\90,\d1\cdII\f0?\00\00\aa\8c\fb(\92\bf\a9\ad\f0\c6\c68\f0?\00\00\f9 {1\8c\bf\a92y\13e(\f0?\00\00\aa]5\19\84\bfHs\ea\'$\18\f0?\00\00\ec\c2\03\12x\bf\95\b1\14\06\04\08\f0?\00\00$y\t\04`\bf\1a\fa&\f7\1f\e0\ef?\00\00\90\84\f3\efo?t\eaa\c2\1c\a1\ef?\00\00=5A\dc\87?.\99\81\b0\10c\ef?\00\80\c2\c4\a3\ce\93?\cd\ad\ee<\f6%\ef?\00\00\89\14\c1\9f\9b?\e7\13\91\03\c8\e9\ee?\00\00\11\ce\d8\b0\a1?\ab\b1\cbx\80\ae\ee?\00\c0\01\d0[\8a\a5?\9b\0c\9d\a2\1at\ee?\00\80\d8@\83\\\a9?\b5\99\n\83\91:\ee?\00\80W\efj\'\ad?V\9a`\t\e0\01\ee?\00\c0\98\e5\98u\b0?\98\bbw\e5\01\ca\ed?\00 \0d\e3\f5S\b2?\03\91|\0b\f2\92\ed?\00\008\8b\dd.\b4?\ce\\\fbf\ac\\\ed?\00\c0W\87Y\06\b6?\9d\de^\aa,\'\ed?\00\00j5v\da\b7?\cd,k>n\f2\ec?\00`\1cNC\ab\b9?\02y\a7\a2m\be\ec?\00`\0d\bb\c7x\bb?m\087m&\8b\ec?\00 \e72\13C\bd?\04X]\bd\94X\ec?\00`\deq1\n\bf?\8c\9f\bb3\b5&\ec?\00@\91+\15g\c0??\e7\ec\ee\83\f5\eb?\00\b0\92\82\85G\c1?\c1\96\dbu\fd\c4\eb?\000\ca\cdn&\c2?(J\86\0c\1e\95\eb?\00P\c5\a6\d7\03\c3?,>\ef\c5\e2e\eb?\00\103<\c3\df\c3?\8b\88\c9gH7\eb?\00\80zk6\ba\c4?J0\1d!K\t\eb?\00\f0\d1(9\93\c5?~\ef\f2\85\e8\db\ea?\00\f0\18$\cdj\c6?\a2=`1\1d\af\ea?\00\90f\ec\f8@\c7?\a7X\d3?\e6\82\ea?\00\f0\1a\f5\c0\15\c8?\8bs\t\ef@W\ea?\00\80\f6T)\e9\c8?\'K\ab\90*,\ea?\00@\f8\026\bb\c9?\d1\f2\93\13\a0\01\ea?\00\00,\1c\ed\8b\ca?\1b<\db$\9f\d7\e9?\00\d0\01\\Q[\cb?\90\b1\c7\05%\ae\e9?\00\c0\bc\ccg)\cc?/\ce\97\f2.\85\e9?\00`H\d55\f6\cc?uK\a4\ee\ba\\\e9?\00\c0F4\bd\c1\cd?8H\e7\9d\c64\e9?\00\e0\cf\b8\01\8c\ce?\e6Rg/O\0d\e9?\00\90\17\c0\tU\cf?\9d\d7\ff\8eR\e6\e8?\00\b8\1f\12l\0e\d0?|\00\cc\9f\ce\bf\e8?\00\d0\93\0e\b8q\d0?\0e\c3\be\da\c0\99\e8?\00p\86\9ek\d4\d0?\fb\17#\aa\'t\e8?\00\d0K3\876\d1?\08\9a\b3\ac\00O\e8?\00H#g\0d\98\d1?U>e\e8I*\e8?\00\80\cc\e0\ff\f8\d1?`\02\f4\95\01\06\e8?\00hc\d7_Y\d2?)\a3\e0c%\e2\e7?\00\a8\14\t0\b9\d2?\ad\b5\dcw\b3\be\e7?\00`C\10r\18\d3?\c2%\97g\aa\9b\e7?\00\18\ecm&w\d3?W\06\17\f2\07y\e7?\000\af\fbO\d5\d3?\0c\13\d6\db\caV\e7?\00\e0/\e3\ee2\d4?") - (data (i32.const 2080) "\00\08\00\00\01\00\00\00\03\00\00\00\00\08\00\00k\b6O\01\00\10\e6?<[B\91l\02~<\95\b4M\03\000\e6?A]\00H\ea\bf\8d\f6\05\eb\ff\ef\e6?S-\e2\1a\04\80~\bc\80\97\86\0e\00\10\e7?Ry\tqf\ff{<\12\e9g\fc\ff/\e7?$\87\bd&\e2\00\8c\89<\b9{F\13\000\e9?v\02\98KN\80\7f.\98\dd\ff\af\e9?7\93Z\8a\e0@\87\bcf\fbI\ed\ff\cf\e9?\00\e0\9b\c1\08\ce?O*\00\b0\ea?_?\ff<\04\fdi\bc\d1\1e\ae\d7\ff\cf\ea?\b4p\90\12\e7>\82\bcx\04Q\ee\ff\ef\ea?\a3\de\0e\e0>\06j<[\0de\db\ff\0f\eb?\b9\n\1f8\c8\06ZO\86\d0E\ff\8a<@\16\87\f9\ff\8f\eb?\f9\c3\c2\96w\fe|\f0\0f\00\f0\f4?\1cS\85\0b\89\7f\97<\d1K\dc\12\00\10\f5?6\a4fqe\04`\c9\03\00\b0\f5?\c0\0c\bf\n\08A\9f\bc\bc\19I\1d\00\d0\f5?)G%\fb*\81\98\bc\89z\b8\e7\ff\ef\f5?\04i\ed\80\b7~\94\bc") - (data (i32.const 4144) "\00\04\00\00\01\00\00\00\03\00\00\00\00\04\00\00\f8\ac\b1k($\f7?\00\b0\cd\ee_\t\e1\bf\a1\cc\d2f\f7\e1\f6?\00\d0v\bd\94\84\e0\bf\8a\d40\0e=\a1\f6?\00\f8\e8\aeC\01\e0\bf\85l\d02\eca\f6?\00@\0b6\c5\fe\de\bf\f8\98\11\95\fa#\f6?\00\e0\b7\1a\d9\fd\dd\bfl\02\cf\a4[\e7\f5?\00\90\c7\0c\ae\ff\dc\bf\b8O!Z\05\ac\f5?\00\a0\fd\118\04\dc\bf\1en\16\0f\edq\f5?\00\e0:2g\0b\db\bf5\f8\0bY\t9\f5?\00\b0-Z/\15\da\bf\dd\ada\edO\01\f5?\00`\f8Z\7f!\d9\bf\d0{H\8e\b8\ca\f4?\00\90q\b0M0\d8\bf\eeO3\b49\95\f4?\00\e0\a9\f9\89A\d7\bfi\d5\af\df\cb`\f4?\00\90\19\b5+U\d6\bfS\b9\e4Nf-\f4?\00\10\9b\a2#k\d5\bf\a6\d8\1d\11\01\fb\f3?\00\a0_\0fe\83\d4\bf6X\0c\b7\95\c9\f3?\00\a0\f67\e9\9d\d3\bfJ\fd\b6J\1c\99\f3?\00`\8dS\a1\ba\d2\bf\b5\99\e0\0c\8ei\f3?\00@\ca@\83\d9\d1\bf\b2\e7\13\82\e4:\f3?\00\e0@:\85\fa\d0\bf\b1\bd\85\19\19\0d\f3?\000\e72\9c\1d\d0\bf\d7q\b2\ca%\e0\f2?\00`\fa\a2}\85\ce\bf\82\cd\13\cf\04\b4\f2?\00\80=c\c8\d3\cc\bfP\cb|,\b0\88\f2?\00\a0\14L\03&\cb\bf\e5M\94c\"^\f2?\00\e0O/\1c|\c9\bf\b1\15\86=V4\f2?\00\00\80?\02\d6\c7\bf8\af>\e3F\0b\f2?\00\e0\05\1a\a73\c6\bf\dd\a3\cd\fd\ee\e2\f1?\00\00W\e9\f5\94\c4\bf09\0bXJ\bb\f1?\00\a0\e0$\e4\f9\c2\bf\00\"\7f\84S\94\f1?\00\c0\fdZYb\c1\bf<\d7\d5\c0\06n\f1?\00\80\bdu\9a\9c\bf\bf\c2\e4\b7G_H\f1?\00\c0\f9[W{\bc\bf\d1\85\00\adX#\f1?\00\80\f4\0f\c6`\b9\bf\'\"S\0f\f0\fe\f0?\00\00\b6G\e2L\b6\bf\8f:\d0w \db\f0?\00@\01\b2x?\b3\bf\d9\80Y\d6\e6\b7\f0?\00\c0B\1a}8\b0\bf\8d@{\fe>\95\f0?\00\00\b5\08\92o\aa\bf\83;\c5\ca%s\f0?\00\00wO\95z\a4\bf\\\1b\0d\e4\97Q\f0?\00\00\0c\c5\a8#\9d\bf\a2\8e \c1\910\f0?\00\00x)&j\91\bf!~\b3%\10\10\f0?\00\00\e8\d8\f8 w\bfk\a7\ca\f9~\c0\ef?\00\00P\b1S\fe\86?\84\f1\f6\d3eD\ef?\00\80\0f\e1\cc\1c\a1?\7f\10\84\9f\07\cc\ee?\00\80\8b\8c\fcM\ac?\e8Z\97\99:W\ee?\00@W\1e2\aa\b3?\e6=\bd\f0\d6\e5\ed?\00\80\8b\d0\a0\18\b9?\b38\ff\81\b6w\ed?\00@\04\da\e9r\be?C\e9Mr\b5\0c\ed?\00`\7fP\d2\dc\c1?cu\0e\dc\b2\a4\ec?\00\a0\de\03\abv\c4?Q\cb\d6\e8\8e?\ec?\00 \e2wC\07\c7?L\0c\02O+\dd\eb?\00@\a9\8b\de\8e\c9?\ca\15`\00l}\eb?\00\e0\d2j\b8\0d\cc?\8f3.n6 \eb?\00\e0\ce\af\n\84\ce?9P)&p\c5\ea?\00\80g\b4\ny\d0?\dd1\'\bc\01m\ea?\00\c0\01h\05\ac\d1?\8b\f1?\bc\d3\16\ea?\00\e0\fe\d4\11\db\d2?\ad\fegI\d1\c2\e9?\00\80\c5NF\06\d4?\02\99|\f4\e4p\e9?\00\f0:\t\be-\d5?\f2\bc\829\fb \e9?\00\d0P \90Q\d6?\f1Y\f7\87\01\d3\e8?\00\f0\ea\cd\d2q\d7?m\f6\b9\eb\e5\86\e8?\00\90}\85\9c\8e\d8?\94\b9X\b6\97<\e8?\00`\e1U\01\a8\d9?\"\10\c6\ff\05\f4\e7?\00\d0\d3n\18\be\da?\ca\15\14\18\"\ad\e7?\00\e0\a0\ae\f2\d0\db?\8c\ff\9e\f9\dcg\e7?\00@\bf=\a4\e0\dc?") - (data (i32.const 5184) "\00\04\00\00\01\00\00\00\03\00\00\00\00\04\00\00\8e\n\b9\12\00 \e6?\05\b6D\06\ab\04\89<\a64W\04\00`\e6?\a9\f7b\ea\9b\ffa<\c5\f2%\c3\ff\9f\e6?\ba\90<\cb\cf~\82<\04Z\b98\00\e0\e6?&\93sV\88\ff\88<\e3\94\99\e0\ff\1f\e7?\b1\82_\'@\fd\8a<\10\0eY\15\00`\e7?A\83#\b4u\fdr\bc\d5[e\12\00\a0\e7?v+$|\e6\08x<\a6\e9Y2\00\e0\e7?\b7\"\f6&\e4\08b\bc\d2\b2\b4\ed\ff\1f\e8?/\c9\a5\1eF\02\84\bc\c3\fc\fa-\00`\e8?\1f\9a\f2\a2\f4\f7m)\e0\ff\df\f2?\f9\a6\b2\da9|\9b<\82\f0\dc\f7\ff\1f\f3?TR\dcn3\f1}<`\8bZ\f0\ff_\f3?\eb1\cdLV\03\9e\bc\cc\ae\0e.\00\a0\f3?w\a4\d3K\e7\f0u<6\b2;\04\00\e0\f3?3\88\9d\14\cb}\9c<\ff\87\d1\02\00 \f4?(=-\cf\af\08~<\b1|8\0d\00`\f4?\a6\99e\857\08\82<\89\9fV\04\00\a0\f4?\d2\bcO\90\\\fa\89\bc\f3C5\04\00\e0\f4?)S\17\ed%\11x\bc\0f\7f\02\cc\ff\1f\f5?\dcTw\84\d8\83\98\e90.\90\80\91\bc") + (memory $0 0) (table $0 1 funcref) (global $../../examples/mandelbrot/assembly/index/NUM_COLORS i32 (i32.const 2048)) - (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (export "memory" (memory $0)) (export "computeLine" (func $../../examples/mandelbrot/assembly/index/computeLine)) (func $~lib/math/NativeMath.log (; 0 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 f64) + (local $1 i64) + (local $2 i32) + (local $3 i32) (local $4 f64) (local $5 f64) (local $6 f64) @@ -23,316 +18,208 @@ (local $9 f64) (local $10 f64) (local $11 f64) - (local $12 i32) - (local $13 i64) - (local $14 i32) - (local $15 i64) - (local $16 i64) - (local $17 f64) - (local $18 f64) - block $~lib/util/math/log_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $12 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + i32.const 0 + local.set $3 + local.get $2 + i32.const 1048576 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $2 - i64.const 4606619468846596096 - i64.sub - i64.const 854320534781952 - i64.lt_u + i32.const 31 + i32.shr_u + end + if + local.get $1 + i64.const 1 + i64.shl + i64.const 0 + i64.eq if - local.get $1 - f64.const 1 - f64.sub - local.set $3 - local.get $3 - local.get $3 - f64.mul - local.set $4 - local.get $4 - local.get $3 - f64.mul - local.set $5 - local.get $5 - f64.const 0.3333333333333352 - local.get $3 - f64.const -0.24999999999998432 - f64.mul - f64.add - local.get $4 - f64.const 0.19999999999320328 - f64.mul - f64.add - local.get $5 - f64.const -0.16666666669929706 - local.get $3 - f64.const 0.14285715076560868 - f64.mul - f64.add - local.get $4 - f64.const -0.12499997863982555 - f64.mul - f64.add - local.get $5 - f64.const 0.11110712032936046 - local.get $3 - f64.const -0.10000486757818193 - f64.mul - f64.add - local.get $4 - f64.const 0.09181994006195467 - f64.mul - f64.add - local.get $5 - f64.const -0.08328363062289341 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - f64.mul - local.set $6 - local.get $3 - f64.const 134217728 - f64.mul - local.set $7 - local.get $3 - local.get $7 - f64.add - local.get $7 - f64.sub - local.set $8 - local.get $3 - local.get $8 - f64.sub - local.set $9 - local.get $8 - local.get $8 - f64.mul - f64.const -0.5 + f64.const -1 + local.get $0 + local.get $0 f64.mul - local.set $7 - local.get $3 - local.get $7 - f64.add - local.set $10 - local.get $3 - local.get $10 - f64.sub - local.get $7 - f64.add - local.set $11 - local.get $11 - f64.const -0.5 - local.get $9 - f64.mul - local.get $8 - local.get $3 - f64.add - f64.mul - f64.add - local.set $11 - local.get $6 - local.get $11 - f64.add - local.get $10 - f64.add - br $~lib/util/math/log_lut|inlined.0 + f64.div + return end local.get $2 - i64.const 48 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.div + return + end + local.get $3 + i32.const 54 + i32.sub + local.set $3 + local.get $0 + f64.const 18014398509481984 + f64.mul + local.set $0 + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 i64.shr_u i32.wrap_i64 - local.set $12 - local.get $12 - i32.const 16 - i32.sub - i32.const 32736 + local.set $2 + else + local.get $2 + i32.const 2146435072 i32.ge_u if + local.get $0 + return + else local.get $2 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const -1 - local.get $1 - local.get $1 - f64.mul - f64.div - br $~lib/util/math/log_lut|inlined.0 - end - local.get $2 - i64.const 9218868437227405312 - i64.eq - if - local.get $1 - br $~lib/util/math/log_lut|inlined.0 - end - local.get $12 - i32.const 32768 - i32.and + i32.const 1072693248 + i32.eq if (result i32) - i32.const 1 + local.get $1 + i64.const 32 + i64.shl + i64.const 0 + i64.eq else - local.get $12 - i32.const 32752 - i32.and - i32.const 32752 - i32.eq + i32.const 0 end if - local.get $1 - local.get $1 - f64.sub - local.get $1 - local.get $1 - f64.sub - f64.div - br $~lib/util/math/log_lut|inlined.0 + f64.const 0 + return end - local.get $1 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $2 end - local.get $2 - i64.const 4604367669032910848 - i64.sub - local.set $13 - local.get $13 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $14 - local.get $13 - i64.const 52 - i64.shr_s - local.set $15 - local.get $2 - local.get $13 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $16 - i32.const 32 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $11 - i32.const 32 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $10 - local.get $16 - f64.reinterpret_i64 - local.set $9 - i32.const 2096 - local.get $14 - i32.const 4 - i32.shl - i32.add - f64.load - local.set $8 - i32.const 2096 - local.get $14 - i32.const 4 - i32.shl - i32.add - f64.load offset=8 - local.set $7 - local.get $9 - local.get $8 - f64.sub - local.get $7 - f64.sub - local.get $11 - f64.mul - local.set $6 - local.get $15 - f64.convert_i64_s - local.set $5 - local.get $5 - f64.const 0.6931471805598903 - f64.mul - local.get $10 - f64.add - local.set $4 - local.get $4 - local.get $6 - f64.add - local.set $3 - local.get $4 - local.get $3 - f64.sub - local.get $6 - f64.add - local.get $5 - f64.const 5.497923018708371e-14 - f64.mul - f64.add - local.set $17 - local.get $6 - local.get $6 - f64.mul - local.set $18 - local.get $17 - local.get $18 - f64.const -0.5000000000000001 - f64.mul - f64.add - local.get $6 - local.get $18 - f64.mul - f64.const 0.33333333331825593 - local.get $6 - f64.const -0.2499999999622955 - f64.mul - f64.add - local.get $18 - f64.const 0.20000304511814496 - local.get $6 - f64.const -0.16667054827627667 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - local.get $3 - f64.add end + local.get $2 + i32.const 1072693248 + i32.const 1072079006 + i32.sub + i32.add + local.set $2 + local.get $3 + local.get $2 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $3 + local.get $2 + i32.const 1048575 + i32.and + i32.const 1072079006 + i32.add + local.set $2 + local.get $2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get $1 + i64.const 4294967295 + i64.and + i64.or + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $0 + f64.const 1 + f64.sub + local.set $4 + f64.const 0.5 + local.get $4 + f64.mul + local.get $4 + f64.mul + local.set $5 + local.get $4 + f64.const 2 + local.get $4 + f64.add + f64.div + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $7 + local.get $7 + f64.mul + local.set $8 + local.get $8 + f64.const 0.3999999999940942 + local.get $8 + f64.const 0.22222198432149784 + local.get $8 + f64.const 0.15313837699209373 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $9 + local.get $7 + f64.const 0.6666666666666735 + local.get $8 + f64.const 0.2857142874366239 + local.get $8 + f64.const 0.1818357216161805 + local.get $8 + f64.const 0.14798198605116586 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $10 + local.get $10 + local.get $9 + f64.add + local.set $11 + local.get $3 + f64.convert_i32_s + local.set $12 + local.get $6 + local.get $5 + local.get $11 + f64.add + f64.mul + local.get $12 + f64.const 1.9082149292705877e-10 + f64.mul + f64.add + local.get $5 + f64.sub + local.get $4 + f64.add + local.get $12 + f64.const 0.6931471803691238 + f64.mul + f64.add return ) (func $~lib/math/NativeMath.log2 (; 1 ;) (param $0 f64) (result f64) - (local $1 f64) - (local $2 i64) - (local $3 f64) + (local $1 i64) + (local $2 i32) + (local $3 i32) (local $4 f64) (local $5 f64) (local $6 f64) @@ -341,335 +228,246 @@ (local $9 f64) (local $10 f64) (local $11 f64) - (local $12 i32) - (local $13 i64) - (local $14 i32) - (local $15 i64) - (local $16 i64) - (local $17 f64) - (local $18 f64) - (local $19 f64) - (local $20 f64) - (local $21 f64) - (local $22 f64) - (local $23 f64) - block $~lib/util/math/log2_lut|inlined.0 (result f64) - local.get $0 - local.set $1 - local.get $1 - i64.reinterpret_f64 - local.set $2 + (local $12 f64) + (local $13 f64) + (local $14 f64) + (local $15 f64) + (local $16 f64) + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $2 + i32.const 0 + local.set $3 + local.get $2 + i32.const 1048576 + i32.lt_u + if (result i32) + i32.const 1 + else local.get $2 - i64.const 4606800540372828160 - i64.sub - i64.const 581272283906048 - i64.lt_u + i32.const 31 + i32.shr_u + end + if + local.get $1 + i64.const 1 + i64.shl + i64.const 0 + i64.eq if - local.get $1 - f64.const 1 - f64.sub - local.set $3 - local.get $3 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $4 - local.get $3 - local.get $4 - f64.sub - local.set $5 - local.get $4 - f64.const 1.4426950407214463 - f64.mul - local.set $6 - local.get $5 - f64.const 1.4426950407214463 - f64.mul - local.get $3 - f64.const 1.6751713164886512e-10 - f64.mul - f64.add - local.set $7 - local.get $3 - local.get $3 - f64.mul - local.set $8 - local.get $8 - local.get $8 - f64.mul - local.set $9 - local.get $8 - f64.const -0.7213475204444817 - local.get $3 - f64.const 0.48089834696298744 - f64.mul - f64.add - f64.mul - local.set $10 - local.get $6 - local.get $10 - f64.add - local.set $11 - local.get $7 - local.get $6 - local.get $11 - f64.sub - local.get $10 - f64.add - f64.add - local.set $7 - local.get $7 - local.get $9 - f64.const -0.360673760222145 - local.get $3 - f64.const 0.2885390081805197 - f64.mul - f64.add - local.get $8 - f64.const -0.24044917405728863 - local.get $3 - f64.const 0.2060992861022954 - f64.mul - f64.add - f64.mul - f64.add - local.get $9 - f64.const -0.18033596705327856 - local.get $3 - f64.const 0.1603032746063156 + f64.const -1 + local.get $0 + local.get $0 f64.mul - f64.add - local.get $8 - f64.const -0.14483316576701266 - local.get $3 - f64.const 0.13046826811283835 - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - f64.mul - f64.add - local.set $7 - local.get $11 - local.get $7 - f64.add - br $~lib/util/math/log2_lut|inlined.0 + f64.div + return end local.get $2 - i64.const 48 + i32.const 31 + i32.shr_u + if + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.div + return + end + local.get $3 + i32.const 54 + i32.sub + local.set $3 + local.get $0 + f64.const 18014398509481984 + f64.mul + local.set $0 + local.get $0 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const 32 i64.shr_u i32.wrap_i64 - local.set $12 - local.get $12 - i32.const 16 - i32.sub - i32.const 32736 + local.set $2 + else + local.get $2 + i32.const 2146435072 i32.ge_u if + local.get $0 + return + else local.get $2 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const -1 - local.get $1 - local.get $1 - f64.mul - f64.div - br $~lib/util/math/log2_lut|inlined.0 - end - local.get $2 - i64.const 9218868437227405312 - i64.eq - if - local.get $1 - br $~lib/util/math/log2_lut|inlined.0 - end - local.get $12 - i32.const 32768 - i32.and + i32.const 1072693248 + i32.eq if (result i32) - i32.const 1 + local.get $1 + i64.const 32 + i64.shl + i64.const 0 + i64.eq else - local.get $12 - i32.const 32752 - i32.and - i32.const 32752 - i32.eq + i32.const 0 end if - local.get $1 - local.get $1 - f64.sub - local.get $1 - local.get $1 - f64.sub - f64.div - br $~lib/util/math/log2_lut|inlined.0 + f64.const 0 + return end - local.get $1 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $2 - local.get $2 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $2 end - local.get $2 - i64.const 4604367669032910848 - i64.sub - local.set $13 - local.get $13 - i64.const 52 - i64.const 6 - i64.sub - i64.shr_u - i64.const 63 - i64.and - i32.wrap_i64 - local.set $14 - local.get $13 - i64.const 52 - i64.shr_s - local.set $15 - local.get $2 - local.get $13 - i64.const -4503599627370496 - i64.and - i64.sub - local.set $16 - i32.const 4160 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $11 - i32.const 4160 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $10 - local.get $16 - f64.reinterpret_i64 - local.set $9 - local.get $15 - f64.convert_i64_s - local.set $8 - i32.const 5200 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $7 - i32.const 5200 - local.get $14 - i32.const 1 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=8 - local.set $6 - local.get $9 - local.get $7 - f64.sub - local.get $6 - f64.sub - local.get $11 - f64.mul - local.set $5 - local.get $5 - i64.reinterpret_f64 - i64.const -4294967296 - i64.and - f64.reinterpret_i64 - local.set $4 - local.get $5 - local.get $4 - f64.sub - local.set $3 - local.get $4 - f64.const 1.4426950407214463 - f64.mul - local.set $17 - local.get $3 - f64.const 1.4426950407214463 - f64.mul - local.get $5 - f64.const 1.6751713164886512e-10 - f64.mul - f64.add - local.set $18 - local.get $8 - local.get $10 - f64.add - local.set $19 - local.get $19 - local.get $17 - f64.add - local.set $20 - local.get $19 - local.get $20 - f64.sub - local.get $17 - f64.add - local.get $18 - f64.add - local.set $21 - local.get $5 - local.get $5 - f64.mul - local.set $22 - f64.const -0.7213475204444882 - local.get $5 - f64.const 0.4808983469629985 - f64.mul - f64.add - local.get $22 - f64.const -0.36067375954075914 - local.get $5 - f64.const 0.2885390073180969 - f64.mul - f64.add - f64.mul - f64.add - local.get $22 - local.get $22 - f64.mul - f64.const -0.2404693555628422 - local.get $5 - f64.const 0.2061202382173603 - f64.mul - f64.add - f64.mul - f64.add - local.set $23 - local.get $21 - local.get $22 - local.get $23 - f64.mul - f64.add - local.get $20 - f64.add end + local.get $2 + i32.const 1072693248 + i32.const 1072079006 + i32.sub + i32.add + local.set $2 + local.get $3 + local.get $2 + i32.const 20 + i32.shr_u + i32.const 1023 + i32.sub + i32.add + local.set $3 + local.get $2 + i32.const 1048575 + i32.and + i32.const 1072079006 + i32.add + local.set $2 + local.get $2 + i64.extend_i32_u + i64.const 32 + i64.shl + local.get $1 + i64.const 4294967295 + i64.and + i64.or + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $0 + local.get $0 + f64.const 1 + f64.sub + local.set $4 + f64.const 0.5 + local.get $4 + f64.mul + local.get $4 + f64.mul + local.set $5 + local.get $4 + f64.const 2 + local.get $4 + f64.add + f64.div + local.set $6 + local.get $6 + local.get $6 + f64.mul + local.set $7 + local.get $7 + local.get $7 + f64.mul + local.set $8 + local.get $8 + f64.const 0.3999999999940942 + local.get $8 + f64.const 0.22222198432149784 + local.get $8 + f64.const 0.15313837699209373 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $9 + local.get $7 + f64.const 0.6666666666666735 + local.get $8 + f64.const 0.2857142874366239 + local.get $8 + f64.const 0.1818357216161805 + local.get $8 + f64.const 0.14798198605116586 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + local.set $10 + local.get $10 + local.get $9 + f64.add + local.set $11 + local.get $4 + local.get $5 + f64.sub + local.set $12 + local.get $12 + i64.reinterpret_f64 + local.set $1 + local.get $1 + i64.const -4294967296 + i64.and + local.set $1 + local.get $1 + f64.reinterpret_i64 + local.set $12 + local.get $4 + local.get $12 + f64.sub + local.get $5 + f64.sub + local.get $6 + local.get $5 + local.get $11 + f64.add + f64.mul + f64.add + local.set $13 + local.get $12 + f64.const 1.4426950407214463 + f64.mul + local.set $14 + local.get $13 + local.get $12 + f64.add + f64.const 1.6751713164886512e-10 + f64.mul + local.get $13 + f64.const 1.4426950407214463 + f64.mul + f64.add + local.set $15 + local.get $3 + f64.convert_i32_s + local.set $16 + local.get $16 + local.get $14 + f64.add + local.set $8 + local.get $15 + local.get $16 + local.get $8 + f64.sub + local.get $14 + f64.add + f64.add + local.set $15 + local.get $8 + local.set $14 + local.get $15 + local.get $14 + f64.add return ) (func $../../examples/mandelbrot/assembly/index/computeLine (; 2 ;) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) diff --git a/tests/compiler/resolve-binary.untouched.wat b/tests/compiler/resolve-binary.untouched.wat index dd2e953b7f..8795682e7f 100644 --- a/tests/compiler/resolve-binary.untouched.wat +++ b/tests/compiler/resolve-binary.untouched.wat @@ -11,6 +11,7 @@ (type $i32_f64_=>_i32 (func (param i32 f64) (result i32))) (type $f64_=>_i32 (func (param f64) (result i32))) (type $f64_i32_=>_i32 (func (param f64 i32) (result i32))) + (type $f64_i32_=>_f64 (func (param f64 i32) (result f64))) (type $f64_f64_=>_f64 (func (param f64 f64) (result f64))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) @@ -22,40 +23,37 @@ (data (i32.const 208) "\90\01\00\00\01\00\00\00\03\00\00\00\90\01\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00") (data (i32.const 624) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\001\00") (data (i32.const 656) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\002\00") - (data (i32.const 688) "\00\10\00\00\01\00\00\00\04\00\00\00\00\10\00\00\00\00\00\00\00\a0\f6?\00\00\00\00\00\00\00\00\00\c8\b9\f2\82,\d6\bf\80V7($\b4\fa<\00\00\00\00\00\80\f6?\00\00\00\00\00\00\00\00\00\08X\bf\bd\d1\d5\bf \f7\e0\d8\08\a5\1c\bd\00\00\00\00\00`\f6?\00\00\00\00\00\00\00\00\00XE\17wv\d5\bfmP\b6\d5\a4b#\bd\00\00\00\00\00@\f6?\00\00\00\00\00\00\00\00\00\f8-\87\ad\1a\d5\bf\d5g\b0\9e\e4\84\e6\bc\00\00\00\00\00 \f6?\00\00\00\00\00\00\00\00\00xw\95_\be\d4\bf\e0>)\93i\1b\04\bd\00\00\00\00\00\00\f6?\00\00\00\00\00\00\00\00\00`\1c\c2\8ba\d4\bf\cc\84LH/\d8\13=\00\00\00\00\00\e0\f5?\00\00\00\00\00\00\00\00\00\a8\86\860\04\d4\bf:\0b\82\ed\f3B\dc<\00\00\00\00\00\c0\f5?\00\00\00\00\00\00\00\00\00HiUL\a6\d3\bf`\94Q\86\c6\b1 =\00\00\00\00\00\a0\f5?\00\00\00\00\00\00\00\00\00\80\98\9a\ddG\d3\bf\92\80\c5\d4MY%=\00\00\00\00\00\80\f5?\00\00\00\00\00\00\00\00\00 \e1\ba\e2\e8\d2\bf\d8+\b7\99\1e{&=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00@\f5?\00\00\00\00\00\00\00\00\00x\cf\fbA)\d2\bfv\daS($Z\16\bd\00\00\00\00\00 \f5?\00\00\00\00\00\00\00\00\00\98i\c1\98\c8\d1\bf\04T\e7h\bc\af\1f\bd\00\00\00\00\00\00\f5?\00\00\00\00\00\00\00\00\00\a8\ab\ab\\g\d1\bf\f0\a8\823\c6\1f\1f=\00\00\00\00\00\e0\f4?\00\00\00\00\00\00\00\00\00H\ae\f9\8b\05\d1\bffZ\05\fd\c4\a8&\bd\00\00\00\00\00\c0\f4?\00\00\00\00\00\00\00\00\00\90s\e2$\a3\d0\bf\0e\03\f4~\eek\0c\bd\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\80\f4?\00\00\00\00\00\00\00\00\00@^m\18\b9\cf\bf\87<\99\ab*W\0d=\00\00\00\00\00`\f4?\00\00\00\00\00\00\00\00\00`\dc\cb\ad\f0\ce\bf$\af\86\9c\b7&+=\00\00\00\00\00@\f4?\00\00\00\00\00\00\00\00\00\f0*n\07\'\ce\bf\10\ff?TO/\17\bd\00\00\00\00\00 \f4?\00\00\00\00\00\00\00\00\00\c0Ok!\\\cd\bf\1bh\ca\bb\91\ba!=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\e0\f3?\00\00\00\00\00\00\00\00\00\90-t\86\c2\cb\bf\8f\b7\8b1\b0N\19=\00\00\00\00\00\c0\f3?\00\00\00\00\00\00\00\00\00\c0\80N\c9\f3\ca\bff\90\cd?cN\ba<\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\80\f3?\00\00\00\00\00\00\00\00\00P\f4\9cZR\c9\bf\e3\d4\c1\04\d9\d1*\bd\00\00\00\00\00`\f3?\00\00\00\00\00\00\00\00\00\d0 e\a0\7f\c8\bf\t\fa\db\7f\bf\bd+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00 \f3?\00\00\00\00\00\00\00\00\00\d0\19\e7\0f\d6\c6\bff\e2\b2\a3j\e4\10\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\e0\f2?\00\00\00\00\00\00\00\00\00\b0\a1\e3\e5&\c5\bf\8f[\07\90\8b\de \bd\00\00\00\00\00\c0\f2?\00\00\00\00\00\00\00\00\00\80\cbl+M\c4\bf\11\0e\bd\00\00\00\00\00\e0\ed?\00\00\00\00\00\00\00\00\00`F\d1;\97\b1?\9b\9e\0dV]2%\bd\00\00\00\00\00\a0\ed?\00\00\00\00\00\00\00\00\00\e0\d1\a7\f5\bd\b3?\d7N\db\a5^\c8,=\00\00\00\00\00`\ed?\00\00\00\00\00\00\00\00\00\a0\97MZ\e9\b5?\1e\1d]<\06i,\bd\00\00\00\00\00@\ed?\00\00\00\00\00\00\00\00\00\c0\ea\n\d3\00\b7?2\ed\9d\a9\8d\1e\ec<\00\00\00\00\00\00\ed?\00\00\00\00\00\00\00\00\00@Y]^3\b9?\daG\bd:\\\11#=\00\00\00\00\00\c0\ec?\00\00\00\00\00\00\00\00\00`\ad\8d\c8j\bb?\e5h\f7+\80\90\13\bd\00\00\00\00\00\a0\ec?\00\00\00\00\00\00\00\00\00@\bc\01X\88\bc?\d3\acZ\c6\d1F&=\00\00\00\00\00`\ec?\00\00\00\00\00\00\00\00\00 \n\839\c7\be?\e0E\e6\afh\c0-\bd\00\00\00\00\00@\ec?\00\00\00\00\00\00\00\00\00\e0\db9\91\e8\bf?\fd\n\a1O\d64%\bd\00\00\00\00\00\00\ec?\00\00\00\00\00\00\00\00\00\e0\'\82\8e\17\c1?\f2\07-\cex\ef!=\00\00\00\00\00\e0\eb?\00\00\00\00\00\00\00\00\00\f0#~+\aa\c1?4\998D\8e\a7,=\00\00\00\00\00\a0\eb?\00\00\00\00\00\00\00\00\00\80\86\0ca\d1\c2?\a1\b4\81\cbl\9d\03=\00\00\00\00\00\80\eb?\00\00\00\00\00\00\00\00\00\90\15\b0\fce\c3?\89rK#\a8/\c6<\00\00\00\00\00@\eb?\00\00\00\00\00\00\00\00\00\b03\83=\91\c4?x\b6\fdTy\83%=\00\00\00\00\00 \eb?\00\00\00\00\00\00\00\00\00\b0\a1\e4\e5\'\c5?\c7}i\e5\e83&=\00\00\00\00\00\e0\ea?\00\00\00\00\00\00\00\00\00\10\8c\beNW\c6?x.<,\8b\cf\19=\00\00\00\00\00\c0\ea?\00\00\00\00\00\00\00\00\00pu\8b\12\f0\c6?\e1!\9c\e5\8d\11%\bd\00\00\00\00\00\a0\ea?\00\00\00\00\00\00\00\00\00PD\85\8d\89\c7?\05C\91p\10f\1c\bd\00\00\00\00\00`\ea?\00\00\00\00\00\00\00\00\00\009\eb\af\be\c8?\d1,\e9\aaT=\07\bd\00\00\00\00\00@\ea?\00\00\00\00\00\00\00\00\00\00\f7\dcZZ\c9?o\ff\a0X(\f2\07=\00\00\00\00\00\00\ea?\00\00\00\00\00\00\00\00\00\e0\8a<\ed\93\ca?i!VPCr(\bd\00\00\00\00\00\e0\e9?\00\00\00\00\00\00\00\00\00\d0[W\d81\cb?\aa\e1\acN\8d5\0c\bd\00\00\00\00\00\c0\e9?\00\00\00\00\00\00\00\00\00\e0;8\87\d0\cb?\b6\12TY\c4K-\bd\00\00\00\00\00\a0\e9?\00\00\00\00\00\00\00\00\00\10\f0\c6\fbo\cc?\d2+\96\c5r\ec\f1\bc\00\00\00\00\00`\e9?\00\00\00\00\00\00\00\00\00\90\d4\b0=\b1\cd?5\b0\15\f7*\ff*\bd\00\00\00\00\00@\e9?\00\00\00\00\00\00\00\00\00\10\e7\ff\0eS\ce?0\f4A`\'\12\c2<\00\00\00\00\00 \e9?\00\00\00\00\00\00\00\00\00\00\dd\e4\ad\f5\ce?\11\8e\bbe\15!\ca\bc\00\00\00\00\00\00\e9?\00\00\00\00\00\00\00\00\00\b0\b3l\1c\99\cf?0\df\0c\ca\ec\cb\1b=\00\00\00\00\00\c0\e8?\00\00\00\00\00\00\00\00\00XM`8q\d0?\91N\ed\16\db\9c\f8<\00\00\00\00\00\a0\e8?\00\00\00\00\00\00\00\00\00`ag-\c4\d0?\e9\ea<\16\8b\18\'=\00\00\00\00\00\80\e8?\00\00\00\00\00\00\00\00\00\e8\'\82\8e\17\d1?\1c\f0\a5c\0e!,\bd\00\00\00\00\00`\e8?\00\00\00\00\00\00\00\00\00\f8\ac\cb\\k\d1?\81\16\a5\f7\cd\9a+=\00\00\00\00\00@\e8?\00\00\00\00\00\00\00\00\00hZc\99\bf\d1?\b7\bdGQ\ed\a6,=\00\00\00\00\00 \e8?\00\00\00\00\00\00\00\00\00\b8\0emE\14\d2?\ea\baF\ba\de\87\n=\00\00\00\00\00\e0\e7?\00\00\00\00\00\00\00\00\00\90\dc|\f0\be\d2?\f4\04PJ\fa\9c*=\00\00\00\00\00\c0\e7?\00\00\00\00\00\00\00\00\00`\d3\e1\f1\14\d3?\b8\9a\ec\ef?\d1f\87\10z^\90\bc\85\7fn\e8\15\e3\ef?\13\f6g5R\d2\8c\be\ef?m{\83]\a6\9a\97<\0f\89\f9lX\b5\ef?\fc\ef\fd\92\1a\b5\8e<\f7Gr+\92\ac\ef?\d1\9c/p=\be><\a2\d1\d32\ec\a3\ef?\0bn\90\894\03j\bc\1b\d3\fe\aff\9b\ef?\0e\bd/*RV\95\bcQ[\12\d0\01\93\ef?U\eaN\8c\ef\80P\bc\cc1l\c0\bd\8a\ef?\16\f4\d5\b9#\c9\91\bc\e0-\a9\ae\9a\82\ef?\afU\\\e9\e3\d3\80\f7\ec\9a<\aa\b9h1\87T\ef?\9d8\86\cb\82\e7\8f\bc\1d\d9\fc\"PM\ef?\8d\c3\a6DAo\8a<\d6\8cb\88;F\ef?}\04\e4\b0\05z\80<\96\dc}\91I?\ef?\94\a8\a8\e3\fd\8e\96<8bunz8\ef?}Ht\f2\18^\87\a9\af\0c\ef?\b6\ab\b0MuM\83<\15\b71\n\fe\06\ef?Lt\ac\e2\01B\86<1\d8L\fcp\01\ef?J\f8\d3]9\dd\8f<\ff\16d\b2\08\fc\ee?\04[\8e;\80\a3\86\bc\f1\9f\92_\c5\f6\ee?hPK\cc\edJ\92\bc\cb\a9:7\a7\f1\ee?\8e-Q\1b\f8\07\99\bcf\d8\05m\ae\ec\ee?\d26\94>\e8\d1q\bc\f7\9f\e54\db\e7\ee?\15\1b\ce\b3\19\19\99\bc\e5\a8\13\c3-\e3\ee?mL*\a7H\9f\85<\"4\12L\a6\de\ee?\8ai(z`\12\93\bc\1c\80\ac\04E\da\ee?[\89\17H\8f\a7X\bc*.\f7!\n\d6\ee?\1b\9aIg\9b,|\bc\97\a8P\d9\f5\d1\ee?\11\ac\c2`\edcC<-\89a`\08\ce\ee?\efd\06;\tf\96Z~d\1fx\bct_\ec\e8u\9f\ee?\b0}\8b\c0J\ee\86\bct\81\a5H\9a\9f\ee?\8a\e6U\1e2\19\86\bc\c9gBV\eb\9f\ee?\d3\d4\t^\cb\9c\90T\'\a4\ee?47;\f1\b6i\93\bc\13\ceL\99\89\a5\ee?\1e\ff\19:\84^\80\bc\ad\c7#F\1a\a7\ee?nWr\d8P\d4\94\bc\ed\92D\9b\d9\a8\ee?\00\8a\0e[g\ad\90<\99f\8a\d9\c7\aa\ee?\b4\ea\f0\c1/\b7\8d<\db\a0*B\e5\ac\ee?\ff\e7\c5\9c`\b6e\bc\8cD\b5\162\af\ee?D_\f3Y\83\f6{<6w\15\99\ae\b1\ee?\83=\1e\a7\1f\t\93\bc\c6\ff\91\0b[\b4\ee?)\1el\8b\b8\a9]\bc\e5\c5\cd\b07\b7\ee?Y\b9\90|\f9#l\bc\0fR\c8\cbD\ba\ee?\aa\f9\f4\"CC\92\bcPN\de\9f\82\bd\ee?K\8ef\d7l\ca\85\bc\ba\07\cap\f1\c0\ee?\'\ce\91+\fc\afq<\90\f0\a3\82\91\c4\ee?\bbs\n\e15\d2m<##\e3\19c\c8\ee?c\"b\"\04\c5\87\bce\e5]{f\cc\ee?\d51\e2\e3\86\1c\8b<3-J\ec\9b\d0\ee?\15\bb\bc\d3\d1\bb\91\bc]%>\b2\03\d5\ee?\d21\ee\9c1\cc\90\b4\07!\d5\82\bc_\9b{3\97|\ef?\c9\0dG;\b9*\89\bc)\a1\f5\14F\86\ef?\d3\88:`\04\b6t<\f6?\8b\e7.\90\ef?qr\9dQ\ec\c5\83<\83L\c7\fbQ\9a\ef?\f0\91\d3\8f\12\f7\8f\bc\da\90\a4\a2\af\a4\ef?}t#\e2\98\ae\8d\bc\f1g\8e-H\af\ef?\08 \aaA\bc\c3\8e<\'Za\ee\1b\ba\ef?2\eb\a9\c3\94+\84<\97\bak7+\c5\ef?\ee\85\d11\a9d\8a<@En[v\d0\ef?\ed\e3;\e4\ba7\8e\bc\14\be\9c\ad\fd\db\ef?\9d\cd\91M;\89w<\d8\90\9e\81\c1\e7\ef?\89\cc`A\c1\05S<\f1q\8f+\c2\f3\ef?") - (data (i32.const 6864) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\000\00.\000\00") - (data (i32.const 6896) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00N\00a\00N\00") - (data (i32.const 6928) "\12\00\00\00\01\00\00\00\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y\00") - (data (i32.const 6976) "\10\00\00\00\01\00\00\00\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y\00") - (data (i32.const 7008) "\b8\02\00\00\01\00\00\00\05\00\00\00\b8\02\00\00\88\02\1c\08\a0\d5\8f\fav\bf>\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\0dXf\ab\a3&\f1\c3\de\93\f8\e2\f3\b8\80\ff\aa\a8\ad\b5\b5\8bJ|l\05_b\87S0\c14`\ff\bc\c9U&\ba\91\8c\85N\96\bd~)p$w\f9\df\8f\b8\e5\b8\9f\bd\df\a6\94}t\88\cf_\a9\f8\cf\9b\a8\8f\93pD\b9k\15\0f\bf\f8\f0\08\8a\b611eU%\b0\cd\ac\7f{\d0\c6\e2?\99\06;+*\c4\10\\\e4\d3\92si\99$$\aa\0e\ca\00\83\f2\b5\87\fd\eb\1a\11\92d\08\e5\bc\cc\88Po\t\cc\bc\8c,e\19\e2X\17\b7\d1\00\00\00\00\00\00@\9c\00\00\00\00\10\a5\d4\e8\00\00b\ac\c5\ebx\ad\84\t\94\f8x9?\81\b3\15\07\c9{\ce\97\c0p\\\ea{\ce2~\8fh\80\e9\ab\a48\d2\d5E\"\9a\17&\'O\9f\'\fb\c4\d41\a2c\ed\a8\ad\c8\8c8e\de\b0\dbe\ab\1a\8e\08\c7\83\9a\1dqB\f9\1d]\c4X\e7\1b\a6,iM\92\ea\8dp\1ad\ee\01\daJw\ef\9a\99\a3m\a2\85k}\b4{x\t\f2w\18\ddy\a1\e4T\b4\c2\c5\9b[\92\86[\86=]\96\c8\c5S5\c8\b3\a0\97\fa\\\b4*\95\e3_\a0\99\bd\9fF\de%\8c9\db4\c2\9b\a5\\\9f\98\a3r\9a\c6\f6\ce\be\e9TS\bf\dc\b7\e2A\"\f2\17\f3\fc\88\a5x\\\d3\9b\ce \cc\dfS!{\f3Z\16\98:0\1f\97\dc\b5\a0\e2\96\b3\e3\\S\d1\d9\a8\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\0dXf\ab\a3&\f1\c3\de\93\f8\e2\f3\b8\80\ff\aa\a8\ad\b5\b5\8bJ|l\05_b\87S0\c14`\ff\bc\c9U&\ba\91\8c\85N\96\bd~)p$w\f9\df\8f\b8\e5\b8\9f\bd\df\a6\94}t\88\cf_\a9\f8\cf\9b\a8\8f\93pD\b9k\15\0f\bf\f8\f0\08\8a\b611eU%\b0\cd\ac\7f{\d0\c6\e2?\99\06;+*\c4\10\\\e4\d3\92si\99$$\aa\0e\ca\00\83\f2\b5\87\fd\eb\1a\11\92d\08\e5\bc\cc\88Po\t\cc\bc\8c,e\19\e2X\17\b7\d1\00\00\00\00\00\00@\9c\00\00\00\00\10\a5\d4\e8\00\00b\ac\c5\ebx\ad\84\t\94\f8x9?\81\b3\15\07\c9{\ce\97\c0p\\\ea{\ce2~\8fh\80\e9\ab\a48\d2\d5E\"\9a\17&\'O\9f\'\fb\c4\d41\a2c\ed\a8\ad\c8\8c8e\de\b0\dbe\ab\1a\8e\08\c7\83\9a\1dqB\f9\1d]\c4X\e7\1b\a6,iM\92\ea\8dp\1ad\ee\01\daJw\ef\9a\99\a3m\a2\85k}\b4{x\t\f2w\18\ddy\a1\e4T\b4\c2\c5\9b[\92\86[\86=]\96\c8\c5S5\c8\b3\a0\97\fa\\\b4*\95\e3_\a0\99\bd\9fF\de%\8c9\db4\c2\9b\a5\\\9f\98\a3r\9a\c6\f6\ce\be\e9TS\bf\dc\b7\e2A\"\f2\17\f3\fc\88\a5x\\\d3\9b\ce \cc\dfS!{\f3Z\16\98:0\1f\97\dc\b5\a0\e2\96\b3\e3\\S\d1\d9\a8 ) - (func $~lib/math/NativeMath.pow (; 14 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.scalbn (; 14 ;) (param $0 f64) (param $1 i32) (result f64) (local $2 f64) - (local $3 f64) + (local $3 i32) (local $4 i32) - (local $5 i64) - (local $6 i64) - (local $7 i64) - (local $8 i64) - (local $9 i64) - (local $10 f64) - (local $11 i64) + local.get $0 + local.set $2 + local.get $1 + i32.const 1023 + i32.gt_s + if + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 + i32.sub + local.set $1 + local.get $1 + i32.const 1023 + i32.gt_s + if + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 + i32.sub + local.tee $3 + i32.const 1023 + local.tee $4 + local.get $3 + local.get $4 + i32.lt_s + select + local.set $1 + end + else + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.const 53 + i32.sub + i32.add + local.set $1 + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.add + i32.const 53 + i32.sub + local.tee $3 + i32.const -1022 + local.tee $4 + local.get $3 + local.get $4 + i32.gt_s + select + local.set $1 + end + end + end + local.get $2 + i64.const 1023 + local.get $1 + i64.extend_i32_s + i64.add + i64.const 52 + i64.shl + f64.reinterpret_i64 + f64.mul + ) + (func $~lib/math/NativeMath.pow (; 15 ;) (param $0 f64) (param $1 f64) (result f64) + (local $2 i64) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) (local $12 i32) - (local $13 i64) - (local $14 i64) + (local $13 i32) + (local $14 f64) (local $15 f64) (local $16 f64) (local $17 f64) @@ -697,14 +786,6 @@ (local $34 f64) (local $35 f64) (local $36 f64) - (local $37 f64) - (local $38 f64) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i64) - (local $44 i64) local.get $1 f64.abs f64.const 2 @@ -758,870 +839,1047 @@ return end end - block $~lib/util/math/pow_lut|inlined.0 (result f64) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i64.reinterpret_f64 - local.set $5 - local.get $2 - i64.reinterpret_f64 - local.set $6 - local.get $5 - i64.const 52 - i64.shr_u - local.set $7 - local.get $6 - i64.const 52 - i64.shr_u - local.set $8 + local.get $0 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $3 + local.get $2 + i32.wrap_i64 + local.set $4 + local.get $1 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $2 + i32.wrap_i64 + local.set $6 + local.get $3 + i32.const 2147483647 + i32.and + local.set $7 + local.get $5 + i32.const 2147483647 + i32.and + local.set $8 + local.get $8 + local.get $6 + i32.or + i32.const 0 + i32.eq + if + f64.const 1 + return + end + local.get $7 + i32.const 2146435072 + i32.gt_s + if (result i32) + i32.const 1 + else local.get $7 - i64.const 1 - i64.sub - i64.const 2046 - i64.ge_u + i32.const 2146435072 + i32.eq if (result i32) - i32.const 1 + local.get $4 + i32.const 0 + i32.ne else - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + i32.const 0 end - if + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.gt_s + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.eq + if (result i32) local.get $6 + i32.const 0 + i32.ne + else + i32.const 0 + end + end + if + local.get $0 + local.get $1 + f64.add + return + end + i32.const 0 + local.set $9 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $8 + i32.const 1128267776 + i32.ge_s + if + i32.const 2 local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + else + local.get $8 + i32.const 1072693248 + i32.ge_s if + local.get $8 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 52 + i32.const 20 + local.get $10 + i32.const 20 + i32.gt_s + select + local.get $10 + i32.sub + local.set $11 local.get $6 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - end - if - local.get $3 - local.get $2 - f64.add - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.lt_u - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - i32.eqz + local.get $8 + local.get $10 + i32.const 20 + i32.gt_s + select + local.set $12 + local.get $12 + local.get $11 + i32.shr_u + local.set $13 + local.get $13 + local.get $11 + i32.shl + local.get $12 i32.eq if - f64.const 0 - br $~lib/util/math/pow_lut|inlined.0 + i32.const 2 + local.get $13 + i32.const 1 + i32.and + i32.sub + local.set $9 end - local.get $2 - local.get $2 - f64.mul - br $~lib/util/math/pow_lut|inlined.0 end - local.get $5 - local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + end + end + local.get $6 + i32.const 0 + i32.eq + if + local.get $8 + i32.const 2146435072 + i32.eq + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $4 + i32.or + i32.const 0 + i32.eq if - local.get $3 - local.get $3 - f64.mul - local.set $10 - local.get $5 - i64.const 63 - i64.shr_u - i32.wrap_i64 - if (result i32) - block $~lib/util/math/checkint|inlined.0 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.0 - end - i64.const 1 - i64.const 1075 - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.0 - end - i32.const 2 + f64.const nan:0x8000000000000 + return + else + local.get $7 + i32.const 1072693248 + i32.ge_s + if + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + local.get $1 + else + f64.const 0 end - i32.const 1 - i32.eq + return else + local.get $5 i32.const 0 + i32.ge_s + if (result f64) + f64.const 0 + else + local.get $1 + f64.neg + end + return end - if - local.get $10 - f64.neg - local.set $10 - end - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - f64.const 1 - local.get $10 - f64.div - else - local.get $10 - end - br $~lib/util/math/pow_lut|inlined.0 + unreachable end + unreachable + end + local.get $8 + i32.const 1072693248 + i32.eq + if local.get $5 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne + i32.const 0 + i32.ge_s if - block $~lib/util/math/checkint|inlined.1 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.1 - end - i64.const 1 - i64.const 1023 - i64.const 52 - i64.add - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.1 - end - i32.const 2 - end - local.set $12 - local.get $12 + local.get $0 + return + end + f64.const 1 + local.get $0 + f64.div + return + end + local.get $5 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f64.mul + return + end + local.get $5 + i32.const 1071644672 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if + local.get $0 + f64.sqrt + return + end + end + end + local.get $0 + f64.abs + local.set $14 + local.get $4 + i32.const 0 + i32.eq + if + local.get $7 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 2146435072 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 1072693248 + i32.eq + end + if + local.get $14 + local.set $15 + local.get $5 + i32.const 0 + i32.lt_s + if + f64.const 1 + local.get $15 + f64.div + local.set $15 + end + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $9 + i32.or i32.const 0 i32.eq if - local.get $3 - local.get $3 - f64.sub - local.get $3 - local.get $3 + local.get $15 + local.get $15 f64.sub + local.set $16 + local.get $16 + local.get $16 f64.div - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $12 - i32.const 1 - i32.eq - if - i32.const 262144 - local.set $4 + local.set $15 + else + local.get $9 + i32.const 1 + i32.eq + if + local.get $15 + f64.neg + local.set $15 + end end - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $7 - i64.const 2047 - i64.and - local.set $7 end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + local.get $15 + return + end + end + f64.const 1 + local.set $16 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $9 + i32.const 0 + i32.eq + if + local.get $0 + local.get $0 + f64.sub + local.set $17 + local.get $17 + local.get $17 + f64.div + return + end + local.get $9 + i32.const 1 + i32.eq + if + f64.const -1 + local.set $16 + end + end + local.get $8 + i32.const 1105199104 + i32.gt_s + if + local.get $8 + i32.const 1139802112 + i32.gt_s + if + local.get $7 + i32.const 1072693247 + i32.le_s if local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.lt_u - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.gt_u - local.get $8 - i64.const 2048 - i64.lt_u - i32.eq + i32.const 0 + i32.lt_s if (result f64) - f64.const inf + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul else - f64.const 0 + f64.const 1e-300 + f64.const 1e-300 + f64.mul end - br $~lib/util/math/pow_lut|inlined.0 + return end local.get $7 - i64.const 0 - i64.eq + i32.const 1072693248 + i32.ge_s if - local.get $3 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $5 local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $5 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $5 + i32.const 0 + i32.gt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return end end - local.get $5 - local.set $9 - local.get $9 - i64.const 4604531861337669632 - i64.sub - local.set $11 - local.get $11 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 + local.get $7 + i32.const 1072693247 + i32.lt_s + if + local.get $5 + i32.const 0 + i32.lt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.gt_s + if + local.get $5 + i32.const 0 + i32.gt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end + local.get $14 + f64.const 1 + f64.sub + local.set $22 + local.get $22 + local.get $22 + f64.mul + f64.const 0.5 + local.get $22 + f64.const 0.3333333333333333 + local.get $22 + f64.const 0.25 + f64.mul + f64.sub + f64.mul + f64.sub + f64.mul + local.set $25 + f64.const 1.4426950216293335 + local.get $22 + f64.mul + local.set $23 + local.get $22 + f64.const 1.9259629911266175e-08 + f64.mul + local.get $25 + f64.const 1.4426950408889634 + f64.mul + f64.sub + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 i64.and - i32.wrap_i64 + f64.reinterpret_i64 + local.set $17 + local.get $24 + local.get $17 + local.get $23 + f64.sub + f64.sub + local.set $18 + else + i32.const 0 local.set $12 - local.get $11 - i64.const 52 - i64.shr_s + local.get $7 + i32.const 1048576 + i32.lt_s + if + local.get $14 + f64.const 9007199254740992 + f64.mul + local.set $14 + local.get $12 + i32.const 53 + i32.sub + local.set $12 + local.get $14 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $7 + end + local.get $12 + local.get $7 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + i32.add + local.set $12 + local.get $7 + i32.const 1048575 + i32.and local.set $13 - local.get $9 - local.get $11 - i64.const 4095 - i64.const 52 - i64.shl + local.get $13 + i32.const 1072693248 + i32.or + local.set $7 + local.get $13 + i32.const 235662 + i32.le_s + if + i32.const 0 + local.set $10 + else + local.get $13 + i32.const 767610 + i32.lt_s + if + i32.const 1 + local.set $10 + else + i32.const 0 + local.set $10 + local.get $12 + i32.const 1 + i32.add + local.set $12 + local.get $7 + i32.const 1048576 + i32.sub + local.set $7 + end + end + local.get $14 + i64.reinterpret_f64 + i64.const 4294967295 i64.and - i64.sub + local.get $7 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 local.set $14 + f64.const 1.5 + f64.const 1 + local.get $10 + select + local.set $32 local.get $14 - f64.reinterpret_i64 - local.set $10 - local.get $13 - f64.convert_i64_s - local.set $15 - i32.const 704 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $16 - i32.const 704 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=16 - local.set $17 - i32.const 704 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=24 - local.set $18 + local.get $32 + f64.sub + local.set $23 + f64.const 1 local.get $14 - i64.const 2147483648 - i64.add + local.get $32 + f64.add + f64.div + local.set $24 + local.get $23 + local.get $24 + f64.mul + local.set $26 + local.get $26 + local.set $28 + local.get $28 + i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $19 + local.set $28 + local.get $7 + i32.const 1 + i32.shr_s + i32.const 536870912 + i32.or + i32.const 524288 + i32.add local.get $10 - local.get $19 + i32.const 18 + i32.shl + i32.add + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $30 + local.get $14 + local.get $30 + local.get $32 f64.sub - local.set $20 - local.get $19 - local.get $16 + f64.sub + local.set $31 + local.get $24 + local.get $23 + local.get $28 + local.get $30 f64.mul - f64.const 1 f64.sub - local.set $21 - local.get $20 - local.get $16 + local.get $28 + local.get $31 + f64.mul + f64.sub + f64.mul + local.set $29 + local.get $26 + local.get $26 + f64.mul + local.set $27 + local.get $27 + local.get $27 + f64.mul + f64.const 0.5999999999999946 + local.get $27 + f64.const 0.4285714285785502 + local.get $27 + f64.const 0.33333332981837743 + local.get $27 + f64.const 0.272728123808534 + local.get $27 + f64.const 0.23066074577556175 + local.get $27 + f64.const 0.20697501780033842 f64.mul - local.set $22 - local.get $21 - local.get $22 f64.add - local.set $23 - local.get $15 - f64.const 0.6931471805598903 f64.mul - local.get $17 f64.add - local.set $24 - local.get $24 - local.get $23 + f64.mul f64.add - local.set $25 - local.get $15 - f64.const 5.497923018708371e-14 f64.mul - local.get $18 f64.add - local.set $26 - local.get $24 - local.get $25 - f64.sub - local.get $23 + f64.mul f64.add - local.set $27 - f64.const -0.5 - local.get $23 f64.mul - local.set $28 - local.get $23 + local.set $21 + local.get $21 + local.get $29 local.get $28 + local.get $26 + f64.add f64.mul - local.set $29 - local.get $23 - local.get $29 + f64.add + local.set $21 + local.get $28 + local.get $28 f64.mul + local.set $27 + f64.const 3 + local.get $27 + f64.add + local.get $21 + f64.add + local.set $30 + local.get $30 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 local.set $30 - f64.const -0.5 local.get $21 - f64.mul + local.get $30 + f64.const 3 + f64.sub + local.get $27 + f64.sub + f64.sub local.set $31 - local.get $21 - local.get $31 - f64.mul - local.set $32 - local.get $25 - local.get $32 - f64.add - local.set $33 - local.get $22 local.get $28 - local.get $31 - f64.add - f64.mul - local.set $34 - local.get $25 - local.get $33 - f64.sub - local.get $32 - f64.add - local.set $35 local.get $30 - f64.const -0.6666666666666679 - local.get $23 - f64.const 0.5000000000000007 f64.mul - f64.add + local.set $23 local.get $29 - f64.const 0.7999999995323976 - local.get $23 - f64.const -0.6666666663487739 + local.get $30 + f64.mul + local.get $31 + local.get $26 f64.mul f64.add - local.get $29 - f64.const -1.142909628459501 + local.set $24 local.get $23 - f64.const 1.0000415263675542 - f64.mul + local.get $24 f64.add + local.set $19 + local.get $19 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $19 + local.get $24 + local.get $19 + local.get $23 + f64.sub + f64.sub + local.set $20 + f64.const 0.9617967009544373 + local.get $19 f64.mul - f64.add + local.set $33 + f64.const 1.350039202129749e-08 + f64.const 0 + local.get $10 + select + local.set $34 + f64.const -7.028461650952758e-09 + local.get $19 f64.mul - f64.add + local.get $20 + f64.const 0.9617966939259756 f64.mul - local.set $36 - local.get $26 - local.get $27 f64.add local.get $34 f64.add + local.set $35 + local.get $12 + f64.convert_i32_s + local.set $22 + f64.const 0.5849624872207642 + f64.const 0 + local.get $10 + select + local.set $36 + local.get $33 local.get $35 f64.add local.get $36 f64.add - local.set $37 - local.get $33 - local.get $37 - f64.add - local.set $38 - local.get $33 - local.get $38 - f64.sub - local.get $37 + local.get $22 f64.add - global.set $~lib/util/math/log_tail - local.get $38 - local.set $38 - global.get $~lib/util/math/log_tail - local.set $37 - local.get $6 - i64.const -134217728 - i64.and - f64.reinterpret_i64 - local.set $34 - local.get $2 - local.get $34 - f64.sub - local.set $33 - local.get $38 + local.set $17 + local.get $17 i64.reinterpret_f64 - i64.const -134217728 + i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $32 - local.get $38 - local.get $32 + local.set $17 + local.get $35 + local.get $17 + local.get $22 + f64.sub + local.get $36 f64.sub - local.get $37 - f64.add - local.set $31 - local.get $34 - local.get $32 - f64.mul - local.set $36 local.get $33 - local.get $32 - f64.mul - local.get $2 - local.get $31 - f64.mul - f64.add - local.set $35 - block $~lib/util/math/exp_inline|inlined.0 (result f64) - local.get $36 - local.set $15 - local.get $35 - local.set $10 - local.get $4 - local.set $12 - local.get $15 - i64.reinterpret_f64 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i32.wrap_i64 - i32.const 2047 - i32.and - local.set $39 - local.get $39 - i32.const 969 - i32.sub - i32.const 63 - i32.ge_u - if - local.get $39 - i32.const 969 - i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const -1 - f64.const 1 - local.get $12 - select - br $~lib/util/math/exp_inline|inlined.0 - end - local.get $39 - i32.const 1033 - i32.ge_u - if - local.get $9 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - local.get $12 - local.set $41 - local.get $41 - local.set $42 - i64.const 1152921504606846976 - f64.reinterpret_i64 - local.set $16 - local.get $16 - f64.neg - local.get $16 - local.get $42 - select - local.get $16 - f64.mul - else - local.get $12 - local.set $42 - local.get $42 - local.set $41 - i64.const 8070450532247928832 - f64.reinterpret_i64 - local.set $17 - local.get $17 - f64.neg - local.get $17 - local.get $41 - select - local.get $17 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 - end - i32.const 0 - local.set $39 - end - f64.const 184.6649652337873 - local.get $15 - f64.mul - local.set $29 - local.get $29 - f64.const 6755399441055744 - f64.add - local.set $30 - local.get $30 - i64.reinterpret_f64 - local.set $14 - local.get $30 - f64.const 6755399441055744 - f64.sub - local.set $30 - local.get $15 - local.get $30 - f64.const -0.005415212348111709 - f64.mul - f64.add - local.get $30 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $28 - local.get $28 - local.get $10 - f64.add - local.set $28 - local.get $14 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $40 - local.get $14 - local.get $12 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $13 - i32.const 4816 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $25 - i32.const 4816 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $13 - i64.add - local.set $11 - local.get $28 - local.get $28 - f64.mul - local.set $27 - local.get $25 - local.get $28 - f64.add - local.get $27 - f64.const 0.49999999999996786 - local.get $28 - f64.const 0.16666666666665886 - f64.mul - f64.add + f64.sub + f64.sub + local.set $18 + end + local.get $1 + local.set $36 + local.get $36 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $36 + local.get $1 + local.get $36 + f64.sub + local.get $17 + f64.mul + local.get $1 + local.get $18 + f64.mul + f64.add + local.set $20 + local.get $36 + local.get $17 + f64.mul + local.set $19 + local.get $20 + local.get $19 + f64.add + local.set $15 + local.get $15 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $2 + i32.wrap_i64 + local.set $11 + local.get $13 + i32.const 1083179008 + i32.ge_s + if + local.get $13 + i32.const 1083179008 + i32.sub + local.get $11 + i32.or + i32.const 0 + i32.ne + if + local.get $16 + f64.const 1.e+300 f64.mul - f64.add - local.get $27 - local.get $27 + f64.const 1.e+300 f64.mul - f64.const 0.0416666808410674 - local.get $28 - f64.const 0.008333335853059549 + return + end + local.get $20 + f64.const 8.008566259537294e-17 + f64.add + local.get $15 + local.get $19 + f64.sub + f64.gt + if + local.get $16 + f64.const 1.e+300 f64.mul - f64.add + f64.const 1.e+300 f64.mul - f64.add - local.set $24 - local.get $39 + return + end + else + local.get $13 + i32.const 2147483647 + i32.and + i32.const 1083231232 + i32.ge_s + if + local.get $13 + i32.const -1064252416 + i32.sub + local.get $11 + i32.or i32.const 0 - i32.eq + i32.ne if - block $~lib/util/math/specialcase|inlined.0 (result f64) - local.get $24 - local.set $18 - local.get $11 - local.set $44 - local.get $14 - local.set $43 - local.get $43 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $44 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.0 - end - local.get $44 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $16 - local.get $16 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $16 - f64.copysign - local.set $23 - local.get $17 - local.get $16 - f64.sub - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $22 - local.get $23 - local.get $16 - f64.add - local.set $21 - local.get $23 - local.get $21 - f64.sub - local.get $16 - f64.add - local.get $22 - f64.add - local.set $22 - local.get $21 - local.get $22 - f64.add - local.get $23 - f64.sub - local.set $16 - local.get $16 - f64.const 0 - f64.eq - if - local.get $44 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $16 - end - end - local.get $16 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return end - local.get $11 - f64.reinterpret_i64 - local.set $26 - local.get $26 - local.get $26 - local.get $24 - f64.mul - f64.add + local.get $20 + local.get $15 + local.get $19 + f64.sub + f64.le + if + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return + end + end + end + local.get $13 + i32.const 2147483647 + i32.and + local.set $11 + local.get $11 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 0 + local.set $12 + local.get $11 + i32.const 1071644672 + i32.gt_s + if + local.get $13 + i32.const 1048576 + local.get $10 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.set $12 + local.get $12 + i32.const 2147483647 + i32.and + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + f64.const 0 + local.set $22 + local.get $12 + i32.const 1048575 + local.get $10 + i32.shr_s + i32.const -1 + i32.xor + i32.and + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $22 + local.get $12 + i32.const 1048575 + i32.and + i32.const 1048576 + i32.or + i32.const 20 + local.get $10 + i32.sub + i32.shr_s + local.set $12 + local.get $13 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $12 + i32.sub + local.set $12 end + local.get $19 + local.get $22 + f64.sub + local.set $19 + end + local.get $20 + local.get $19 + f64.add + local.set $22 + local.get $22 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $22 + local.get $22 + f64.const 0.6931471824645996 + f64.mul + local.set $23 + local.get $20 + local.get $22 + local.get $19 + f64.sub + f64.sub + f64.const 0.6931471805599453 + f64.mul + local.get $22 + f64.const -1.904654299957768e-09 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $15 + local.get $24 + local.get $15 + local.get $23 + f64.sub + f64.sub + local.set $25 + local.get $15 + local.get $15 + f64.mul + local.set $22 + local.get $15 + local.get $22 + f64.const 0.16666666666666602 + local.get $22 + f64.const -2.7777777777015593e-03 + local.get $22 + f64.const 6.613756321437934e-05 + local.get $22 + f64.const -1.6533902205465252e-06 + local.get $22 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.sub + local.set $17 + local.get $15 + local.get $17 + f64.mul + local.get $17 + f64.const 2 + f64.sub + f64.div + local.get $25 + local.get $15 + local.get $25 + f64.mul + f64.add + f64.sub + local.set $21 + f64.const 1 + local.get $21 + local.get $15 + f64.sub + f64.sub + local.set $15 + local.get $15 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $13 + local.get $12 + i32.const 20 + i32.shl + i32.add + local.set $13 + local.get $13 + i32.const 20 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $15 + local.get $12 + call $~lib/math/NativeMath.scalbn + local.set $15 + else + local.get $15 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $13 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.set $15 end + local.get $16 + local.get $15 + f64.mul return ) - (func $~lib/util/number/genDigits (; 15 ;) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) + (func $~lib/util/number/genDigits (; 16 ;) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) (local $7 i32) (local $8 i64) (local $9 i64) @@ -1890,7 +2148,7 @@ local.set $23 local.get $19 local.set $22 - i32.const 7936 + i32.const 1760 local.get $14 i32.const 2 i32.shl @@ -2031,7 +2289,7 @@ i32.add global.set $~lib/util/number/_K local.get $10 - i32.const 7936 + i32.const 1760 i32.const 0 local.get $14 i32.sub @@ -2124,7 +2382,7 @@ end local.get $15 ) - (func $~lib/util/memory/memcpy (; 16 ;) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/util/memory/memcpy (; 17 ;) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3148,7 +3406,7 @@ i32.store8 end ) - (func $~lib/memory/memory.copy (; 17 ;) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.copy (; 18 ;) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3368,7 +3626,7 @@ end end ) - (func $~lib/util/number/prettify (; 18 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/util/number/prettify (; 19 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3685,7 +3943,7 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (; 19 ;) (param $0 i32) (param $1 f64) (result i32) + (func $~lib/util/number/dtoa_core (; 20 ;) (param $0 i32) (param $1 f64) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3850,14 +4108,14 @@ i32.shl i32.sub global.set $~lib/util/number/_K - i32.const 7024 + i32.const 848 local.get $14 i32.const 3 i32.shl i32.add i64.load global.set $~lib/util/number/_frc_pow - i32.const 7744 + i32.const 1568 local.get $14 i32.const 1 i32.shl @@ -4113,7 +4371,7 @@ local.get $2 i32.add ) - (func $~lib/string/String#substring (; 20 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#substring (; 21 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -4187,7 +4445,7 @@ local.get $10 i32.eqz if - i32.const 8000 + i32.const 1824 call $~lib/rt/stub/__retain return end @@ -4220,7 +4478,7 @@ local.get $11 call $~lib/rt/stub/__retain ) - (func $~lib/rt/stub/__free (; 21 ;) (param $0 i32) + (func $~lib/rt/stub/__free (; 22 ;) (param $0 i32) (local $1 i32) local.get $0 i32.const 0 @@ -4236,7 +4494,7 @@ i32.eqz if i32.const 0 - i32.const 8016 + i32.const 1840 i32.const 70 i32.const 2 call $~lib/builtins/abort @@ -4253,7 +4511,7 @@ i32.eqz if i32.const 0 - i32.const 8016 + i32.const 1840 i32.const 72 i32.const 13 call $~lib/builtins/abort @@ -4270,7 +4528,7 @@ global.set $~lib/rt/stub/offset end ) - (func $~lib/util/number/dtoa (; 22 ;) (param $0 f64) (result i32) + (func $~lib/util/number/dtoa (; 23 ;) (param $0 f64) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4278,7 +4536,7 @@ f64.const 0 f64.eq if - i32.const 6880 + i32.const 704 return end local.get $0 @@ -4292,11 +4550,11 @@ local.get $0 f64.ne if - i32.const 6912 + i32.const 736 return end - i32.const 6944 - i32.const 6992 + i32.const 768 + i32.const 816 local.get $0 f64.const 0 f64.lt @@ -4331,104 +4589,104 @@ call $~lib/rt/stub/__free local.get $3 ) - (func $~lib/number/F64#toString (; 23 ;) (param $0 f64) (param $1 i32) (result i32) + (func $~lib/number/F64#toString (; 24 ;) (param $0 f64) (param $1 i32) (result i32) local.get $0 call $~lib/util/number/dtoa ) - (func $resolve-binary/Foo#constructor (; 24 ;) (param $0 i32) (result i32) + (func $resolve-binary/Foo#constructor (; 25 ;) (param $0 i32) (result i32) local.get $0 i32.eqz if i32.const 0 - i32.const 7 + i32.const 6 call $~lib/rt/stub/__alloc call $~lib/rt/stub/__retain local.set $0 end local.get $0 ) - (func $resolve-binary/Foo#lt (; 25 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#lt (; 26 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8192 + i32.const 2016 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $~lib/string/String#toString (; 26 ;) (param $0 i32) (result i32) + (func $~lib/string/String#toString (; 27 ;) (param $0 i32) (result i32) local.get $0 call $~lib/rt/stub/__retain ) - (func $resolve-binary/Foo#gt (; 27 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#gt (; 28 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8224 + i32.const 2048 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#le (; 28 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#le (; 29 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8256 + i32.const 2080 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#ge (; 29 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#ge (; 30 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8288 + i32.const 2112 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#eq (; 30 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#eq (; 31 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8320 + i32.const 2144 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#ne (; 31 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#ne (; 32 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8352 + i32.const 2176 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#add (; 32 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#add (; 33 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8384 + i32.const 2208 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo.sub (; 33 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo.sub (; 34 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -4436,7 +4694,7 @@ local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8416 + i32.const 2240 local.set $2 local.get $0 call $~lib/rt/stub/__release @@ -4444,73 +4702,73 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#mul (; 34 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#mul (; 35 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8448 + i32.const 2272 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#div (; 35 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#div (; 36 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8480 + i32.const 2304 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#rem (; 36 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#rem (; 37 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8512 + i32.const 2336 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Foo#pow (; 37 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Foo#pow (; 38 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 - i32.const 8544 + i32.const 2368 local.set $2 local.get $1 call $~lib/rt/stub/__release local.get $2 ) - (func $resolve-binary/Bar#constructor (; 38 ;) (param $0 i32) (result i32) + (func $resolve-binary/Bar#constructor (; 39 ;) (param $0 i32) (result i32) local.get $0 i32.eqz if i32.const 0 - i32.const 8 + i32.const 7 call $~lib/rt/stub/__alloc call $~lib/rt/stub/__retain local.set $0 end local.get $0 ) - (func $resolve-binary/Bar#add (; 39 ;) (param $0 i32) (param $1 i32) (result i32) + (func $resolve-binary/Bar#add (; 40 ;) (param $0 i32) (param $1 i32) (result i32) local.get $1 call $~lib/rt/stub/__retain local.set $1 local.get $1 ) - (func $resolve-binary/Bar#self (; 40 ;) (param $0 i32) (result i32) + (func $resolve-binary/Bar#self (; 41 ;) (param $0 i32) (result i32) local.get $0 call $~lib/rt/stub/__retain ) - (func $start:resolve-binary (; 41 ;) + (func $start:resolve-binary (; 42 ;) (local $0 i32) (local $1 i32) (local $2 i32) @@ -4777,7 +5035,7 @@ i32.const 0 call $~lib/number/F64#toString local.tee $12 - i32.const 8064 + i32.const 1888 call $~lib/string/String.__eq i32.eqz if @@ -4833,7 +5091,7 @@ global.get $resolve-binary/a call $~lib/number/I32#toString local.tee $15 - i32.const 8096 + i32.const 1920 call $~lib/string/String.__eq i32.eqz if @@ -4905,7 +5163,7 @@ global.get $resolve-binary/a call $~lib/number/I32#toString local.tee $19 - i32.const 8128 + i32.const 1952 call $~lib/string/String.__eq i32.eqz if @@ -4937,7 +5195,7 @@ i32.const 3 call $~lib/number/I32#toString local.tee $21 - i32.const 8128 + i32.const 1952 call $~lib/string/String.__eq i32.eqz if @@ -4951,7 +5209,7 @@ i32.const -1 call $~lib/number/I32#toString local.tee $22 - i32.const 8160 + i32.const 1984 call $~lib/string/String.__eq i32.eqz if @@ -5010,7 +5268,7 @@ i32.const 0 call $~lib/number/F64#toString local.tee $26 - i32.const 8064 + i32.const 1888 call $~lib/string/String.__eq i32.eqz if @@ -5024,7 +5282,7 @@ i32.const 4 call $~lib/number/I32#toString local.tee $27 - i32.const 8096 + i32.const 1920 call $~lib/string/String.__eq i32.eqz if @@ -5052,7 +5310,7 @@ i32.const 3 call $~lib/number/I32#toString local.tee $29 - i32.const 8128 + i32.const 1952 call $~lib/string/String.__eq i32.eqz if @@ -5080,7 +5338,7 @@ i32.const 3 call $~lib/number/I32#toString local.tee $31 - i32.const 8128 + i32.const 1952 call $~lib/string/String.__eq i32.eqz if @@ -5170,7 +5428,7 @@ local.tee $37 call $~lib/string/String#toString local.tee $38 - i32.const 8192 + i32.const 2016 call $~lib/string/String.__eq i32.eqz if @@ -5187,7 +5445,7 @@ local.tee $39 call $~lib/string/String#toString local.tee $40 - i32.const 8224 + i32.const 2048 call $~lib/string/String.__eq i32.eqz if @@ -5204,7 +5462,7 @@ local.tee $41 call $~lib/string/String#toString local.tee $42 - i32.const 8256 + i32.const 2080 call $~lib/string/String.__eq i32.eqz if @@ -5221,7 +5479,7 @@ local.tee $43 call $~lib/string/String#toString local.tee $44 - i32.const 8288 + i32.const 2112 call $~lib/string/String.__eq i32.eqz if @@ -5238,7 +5496,7 @@ local.tee $45 call $~lib/string/String#toString local.tee $46 - i32.const 8320 + i32.const 2144 call $~lib/string/String.__eq i32.eqz if @@ -5255,7 +5513,7 @@ local.tee $47 call $~lib/string/String#toString local.tee $48 - i32.const 8352 + i32.const 2176 call $~lib/string/String.__eq i32.eqz if @@ -5272,7 +5530,7 @@ local.tee $49 call $~lib/string/String#toString local.tee $50 - i32.const 8384 + i32.const 2208 call $~lib/string/String.__eq i32.eqz if @@ -5289,7 +5547,7 @@ local.tee $51 call $~lib/string/String#toString local.tee $52 - i32.const 8416 + i32.const 2240 call $~lib/string/String.__eq i32.eqz if @@ -5306,7 +5564,7 @@ local.tee $53 call $~lib/string/String#toString local.tee $54 - i32.const 8448 + i32.const 2272 call $~lib/string/String.__eq i32.eqz if @@ -5323,7 +5581,7 @@ local.tee $55 call $~lib/string/String#toString local.tee $56 - i32.const 8480 + i32.const 2304 call $~lib/string/String.__eq i32.eqz if @@ -5340,7 +5598,7 @@ local.tee $57 call $~lib/string/String#toString local.tee $58 - i32.const 8512 + i32.const 2336 call $~lib/string/String.__eq i32.eqz if @@ -5357,7 +5615,7 @@ local.tee $59 call $~lib/string/String#toString local.tee $60 - i32.const 8544 + i32.const 2368 call $~lib/string/String.__eq i32.eqz if @@ -5544,7 +5802,7 @@ local.get $62 call $~lib/rt/stub/__release ) - (func $~start (; 42 ;) + (func $~start (; 43 ;) call $start:resolve-binary ) ) diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index 83a49f35dc..b97f9fbd68 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -4224,7 +4224,7 @@ if i32.const 0 i32.const 4032 - i32.const 1406 + i32.const 1411 i32.const 4 call $~lib/builtins/abort unreachable @@ -5691,7 +5691,7 @@ if i32.const 4864 i32.const 4032 - i32.const 1413 + i32.const 1418 i32.const 24 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index a25ffb50b5..d0363e5fd5 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -7004,7 +7004,7 @@ if i32.const 0 i32.const 4032 - i32.const 1406 + i32.const 1411 i32.const 4 call $~lib/builtins/abort unreachable @@ -9274,7 +9274,7 @@ if i32.const 4864 i32.const 4032 - i32.const 1413 + i32.const 1418 i32.const 24 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/operator-overloading.untouched.wat b/tests/compiler/std/operator-overloading.untouched.wat index dc0f890de4..23adaf9723 100644 --- a/tests/compiler/std/operator-overloading.untouched.wat +++ b/tests/compiler/std/operator-overloading.untouched.wat @@ -5,12 +5,11 @@ (type $none_=>_none (func)) (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $f64_i32_=>_f64 (func (param f64 i32) (result f64))) (type $f64_f64_=>_f64 (func (param f64 f64) (result f64))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 16) "6\00\00\00\01\00\00\00\01\00\00\006\00\00\00s\00t\00d\00/\00o\00p\00e\00r\00a\00t\00o\00r\00-\00o\00v\00e\00r\00l\00o\00a\00d\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 96) "\00\10\00\00\01\00\00\00\04\00\00\00\00\10\00\00\00\00\00\00\00\a0\f6?\00\00\00\00\00\00\00\00\00\c8\b9\f2\82,\d6\bf\80V7($\b4\fa<\00\00\00\00\00\80\f6?\00\00\00\00\00\00\00\00\00\08X\bf\bd\d1\d5\bf \f7\e0\d8\08\a5\1c\bd\00\00\00\00\00`\f6?\00\00\00\00\00\00\00\00\00XE\17wv\d5\bfmP\b6\d5\a4b#\bd\00\00\00\00\00@\f6?\00\00\00\00\00\00\00\00\00\f8-\87\ad\1a\d5\bf\d5g\b0\9e\e4\84\e6\bc\00\00\00\00\00 \f6?\00\00\00\00\00\00\00\00\00xw\95_\be\d4\bf\e0>)\93i\1b\04\bd\00\00\00\00\00\00\f6?\00\00\00\00\00\00\00\00\00`\1c\c2\8ba\d4\bf\cc\84LH/\d8\13=\00\00\00\00\00\e0\f5?\00\00\00\00\00\00\00\00\00\a8\86\860\04\d4\bf:\0b\82\ed\f3B\dc<\00\00\00\00\00\c0\f5?\00\00\00\00\00\00\00\00\00HiUL\a6\d3\bf`\94Q\86\c6\b1 =\00\00\00\00\00\a0\f5?\00\00\00\00\00\00\00\00\00\80\98\9a\ddG\d3\bf\92\80\c5\d4MY%=\00\00\00\00\00\80\f5?\00\00\00\00\00\00\00\00\00 \e1\ba\e2\e8\d2\bf\d8+\b7\99\1e{&=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00`\f5?\00\00\00\00\00\00\00\00\00\88\de\13Z\89\d2\bf?\b0\cf\b6\14\ca\15=\00\00\00\00\00@\f5?\00\00\00\00\00\00\00\00\00x\cf\fbA)\d2\bfv\daS($Z\16\bd\00\00\00\00\00 \f5?\00\00\00\00\00\00\00\00\00\98i\c1\98\c8\d1\bf\04T\e7h\bc\af\1f\bd\00\00\00\00\00\00\f5?\00\00\00\00\00\00\00\00\00\a8\ab\ab\\g\d1\bf\f0\a8\823\c6\1f\1f=\00\00\00\00\00\e0\f4?\00\00\00\00\00\00\00\00\00H\ae\f9\8b\05\d1\bffZ\05\fd\c4\a8&\bd\00\00\00\00\00\c0\f4?\00\00\00\00\00\00\00\00\00\90s\e2$\a3\d0\bf\0e\03\f4~\eek\0c\bd\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\a0\f4?\00\00\00\00\00\00\00\00\00\d0\b4\94%@\d0\bf\7f-\f4\9e\b86\f0\bc\00\00\00\00\00\80\f4?\00\00\00\00\00\00\00\00\00@^m\18\b9\cf\bf\87<\99\ab*W\0d=\00\00\00\00\00`\f4?\00\00\00\00\00\00\00\00\00`\dc\cb\ad\f0\ce\bf$\af\86\9c\b7&+=\00\00\00\00\00@\f4?\00\00\00\00\00\00\00\00\00\f0*n\07\'\ce\bf\10\ff?TO/\17\bd\00\00\00\00\00 \f4?\00\00\00\00\00\00\00\00\00\c0Ok!\\\cd\bf\1bh\ca\bb\91\ba!=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\00\f4?\00\00\00\00\00\00\00\00\00\a0\9a\c7\f7\8f\cc\bf4\84\9fhOy\'=\00\00\00\00\00\e0\f3?\00\00\00\00\00\00\00\00\00\90-t\86\c2\cb\bf\8f\b7\8b1\b0N\19=\00\00\00\00\00\c0\f3?\00\00\00\00\00\00\00\00\00\c0\80N\c9\f3\ca\bff\90\cd?cN\ba<\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\a0\f3?\00\00\00\00\00\00\00\00\00\b0\e2\1f\bc#\ca\bf\ea\c1F\dcd\8c%\bd\00\00\00\00\00\80\f3?\00\00\00\00\00\00\00\00\00P\f4\9cZR\c9\bf\e3\d4\c1\04\d9\d1*\bd\00\00\00\00\00`\f3?\00\00\00\00\00\00\00\00\00\d0 e\a0\7f\c8\bf\t\fa\db\7f\bf\bd+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00@\f3?\00\00\00\00\00\00\00\00\00\e0\10\02\89\ab\c7\bfXJSr\90\db+=\00\00\00\00\00 \f3?\00\00\00\00\00\00\00\00\00\d0\19\e7\0f\d6\c6\bff\e2\b2\a3j\e4\10\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\00\f3?\00\00\00\00\00\00\00\00\00\90\a7p0\ff\c5\bf9P\10\9fC\9e\1e\bd\00\00\00\00\00\e0\f2?\00\00\00\00\00\00\00\00\00\b0\a1\e3\e5&\c5\bf\8f[\07\90\8b\de \bd\00\00\00\00\00\c0\f2?\00\00\00\00\00\00\00\00\00\80\cbl+M\c4\bf\11\0e\bd\00\00\00\00\00\e0\ed?\00\00\00\00\00\00\00\00\00`F\d1;\97\b1?\9b\9e\0dV]2%\bd\00\00\00\00\00\a0\ed?\00\00\00\00\00\00\00\00\00\e0\d1\a7\f5\bd\b3?\d7N\db\a5^\c8,=\00\00\00\00\00`\ed?\00\00\00\00\00\00\00\00\00\a0\97MZ\e9\b5?\1e\1d]<\06i,\bd\00\00\00\00\00@\ed?\00\00\00\00\00\00\00\00\00\c0\ea\n\d3\00\b7?2\ed\9d\a9\8d\1e\ec<\00\00\00\00\00\00\ed?\00\00\00\00\00\00\00\00\00@Y]^3\b9?\daG\bd:\\\11#=\00\00\00\00\00\c0\ec?\00\00\00\00\00\00\00\00\00`\ad\8d\c8j\bb?\e5h\f7+\80\90\13\bd\00\00\00\00\00\a0\ec?\00\00\00\00\00\00\00\00\00@\bc\01X\88\bc?\d3\acZ\c6\d1F&=\00\00\00\00\00`\ec?\00\00\00\00\00\00\00\00\00 \n\839\c7\be?\e0E\e6\afh\c0-\bd\00\00\00\00\00@\ec?\00\00\00\00\00\00\00\00\00\e0\db9\91\e8\bf?\fd\n\a1O\d64%\bd\00\00\00\00\00\00\ec?\00\00\00\00\00\00\00\00\00\e0\'\82\8e\17\c1?\f2\07-\cex\ef!=\00\00\00\00\00\e0\eb?\00\00\00\00\00\00\00\00\00\f0#~+\aa\c1?4\998D\8e\a7,=\00\00\00\00\00\a0\eb?\00\00\00\00\00\00\00\00\00\80\86\0ca\d1\c2?\a1\b4\81\cbl\9d\03=\00\00\00\00\00\80\eb?\00\00\00\00\00\00\00\00\00\90\15\b0\fce\c3?\89rK#\a8/\c6<\00\00\00\00\00@\eb?\00\00\00\00\00\00\00\00\00\b03\83=\91\c4?x\b6\fdTy\83%=\00\00\00\00\00 \eb?\00\00\00\00\00\00\00\00\00\b0\a1\e4\e5\'\c5?\c7}i\e5\e83&=\00\00\00\00\00\e0\ea?\00\00\00\00\00\00\00\00\00\10\8c\beNW\c6?x.<,\8b\cf\19=\00\00\00\00\00\c0\ea?\00\00\00\00\00\00\00\00\00pu\8b\12\f0\c6?\e1!\9c\e5\8d\11%\bd\00\00\00\00\00\a0\ea?\00\00\00\00\00\00\00\00\00PD\85\8d\89\c7?\05C\91p\10f\1c\bd\00\00\00\00\00`\ea?\00\00\00\00\00\00\00\00\00\009\eb\af\be\c8?\d1,\e9\aaT=\07\bd\00\00\00\00\00@\ea?\00\00\00\00\00\00\00\00\00\00\f7\dcZZ\c9?o\ff\a0X(\f2\07=\00\00\00\00\00\00\ea?\00\00\00\00\00\00\00\00\00\e0\8a<\ed\93\ca?i!VPCr(\bd\00\00\00\00\00\e0\e9?\00\00\00\00\00\00\00\00\00\d0[W\d81\cb?\aa\e1\acN\8d5\0c\bd\00\00\00\00\00\c0\e9?\00\00\00\00\00\00\00\00\00\e0;8\87\d0\cb?\b6\12TY\c4K-\bd\00\00\00\00\00\a0\e9?\00\00\00\00\00\00\00\00\00\10\f0\c6\fbo\cc?\d2+\96\c5r\ec\f1\bc\00\00\00\00\00`\e9?\00\00\00\00\00\00\00\00\00\90\d4\b0=\b1\cd?5\b0\15\f7*\ff*\bd\00\00\00\00\00@\e9?\00\00\00\00\00\00\00\00\00\10\e7\ff\0eS\ce?0\f4A`\'\12\c2<\00\00\00\00\00 \e9?\00\00\00\00\00\00\00\00\00\00\dd\e4\ad\f5\ce?\11\8e\bbe\15!\ca\bc\00\00\00\00\00\00\e9?\00\00\00\00\00\00\00\00\00\b0\b3l\1c\99\cf?0\df\0c\ca\ec\cb\1b=\00\00\00\00\00\c0\e8?\00\00\00\00\00\00\00\00\00XM`8q\d0?\91N\ed\16\db\9c\f8<\00\00\00\00\00\a0\e8?\00\00\00\00\00\00\00\00\00`ag-\c4\d0?\e9\ea<\16\8b\18\'=\00\00\00\00\00\80\e8?\00\00\00\00\00\00\00\00\00\e8\'\82\8e\17\d1?\1c\f0\a5c\0e!,\bd\00\00\00\00\00`\e8?\00\00\00\00\00\00\00\00\00\f8\ac\cb\\k\d1?\81\16\a5\f7\cd\9a+=\00\00\00\00\00@\e8?\00\00\00\00\00\00\00\00\00hZc\99\bf\d1?\b7\bdGQ\ed\a6,=\00\00\00\00\00 \e8?\00\00\00\00\00\00\00\00\00\b8\0emE\14\d2?\ea\baF\ba\de\87\n=\00\00\00\00\00\e0\e7?\00\00\00\00\00\00\00\00\00\90\dc|\f0\be\d2?\f4\04PJ\fa\9c*=\00\00\00\00\00\c0\e7?\00\00\00\00\00\00\00\00\00`\d3\e1\f1\14\d3?\b8\9a\ec\ef?\d1f\87\10z^\90\bc\85\7fn\e8\15\e3\ef?\13\f6g5R\d2\8c\be\ef?m{\83]\a6\9a\97<\0f\89\f9lX\b5\ef?\fc\ef\fd\92\1a\b5\8e<\f7Gr+\92\ac\ef?\d1\9c/p=\be><\a2\d1\d32\ec\a3\ef?\0bn\90\894\03j\bc\1b\d3\fe\aff\9b\ef?\0e\bd/*RV\95\bcQ[\12\d0\01\93\ef?U\eaN\8c\ef\80P\bc\cc1l\c0\bd\8a\ef?\16\f4\d5\b9#\c9\91\bc\e0-\a9\ae\9a\82\ef?\afU\\\e9\e3\d3\80\f7\ec\9a<\aa\b9h1\87T\ef?\9d8\86\cb\82\e7\8f\bc\1d\d9\fc\"PM\ef?\8d\c3\a6DAo\8a<\d6\8cb\88;F\ef?}\04\e4\b0\05z\80<\96\dc}\91I?\ef?\94\a8\a8\e3\fd\8e\96<8bunz8\ef?}Ht\f2\18^\87\a9\af\0c\ef?\b6\ab\b0MuM\83<\15\b71\n\fe\06\ef?Lt\ac\e2\01B\86<1\d8L\fcp\01\ef?J\f8\d3]9\dd\8f<\ff\16d\b2\08\fc\ee?\04[\8e;\80\a3\86\bc\f1\9f\92_\c5\f6\ee?hPK\cc\edJ\92\bc\cb\a9:7\a7\f1\ee?\8e-Q\1b\f8\07\99\bcf\d8\05m\ae\ec\ee?\d26\94>\e8\d1q\bc\f7\9f\e54\db\e7\ee?\15\1b\ce\b3\19\19\99\bc\e5\a8\13\c3-\e3\ee?mL*\a7H\9f\85<\"4\12L\a6\de\ee?\8ai(z`\12\93\bc\1c\80\ac\04E\da\ee?[\89\17H\8f\a7X\bc*.\f7!\n\d6\ee?\1b\9aIg\9b,|\bc\97\a8P\d9\f5\d1\ee?\11\ac\c2`\edcC<-\89a`\08\ce\ee?\efd\06;\tf\96Z~d\1fx\bct_\ec\e8u\9f\ee?\b0}\8b\c0J\ee\86\bct\81\a5H\9a\9f\ee?\8a\e6U\1e2\19\86\bc\c9gBV\eb\9f\ee?\d3\d4\t^\cb\9c\90T\'\a4\ee?47;\f1\b6i\93\bc\13\ceL\99\89\a5\ee?\1e\ff\19:\84^\80\bc\ad\c7#F\1a\a7\ee?nWr\d8P\d4\94\bc\ed\92D\9b\d9\a8\ee?\00\8a\0e[g\ad\90<\99f\8a\d9\c7\aa\ee?\b4\ea\f0\c1/\b7\8d<\db\a0*B\e5\ac\ee?\ff\e7\c5\9c`\b6e\bc\8cD\b5\162\af\ee?D_\f3Y\83\f6{<6w\15\99\ae\b1\ee?\83=\1e\a7\1f\t\93\bc\c6\ff\91\0b[\b4\ee?)\1el\8b\b8\a9]\bc\e5\c5\cd\b07\b7\ee?Y\b9\90|\f9#l\bc\0fR\c8\cbD\ba\ee?\aa\f9\f4\"CC\92\bcPN\de\9f\82\bd\ee?K\8ef\d7l\ca\85\bc\ba\07\cap\f1\c0\ee?\'\ce\91+\fc\afq<\90\f0\a3\82\91\c4\ee?\bbs\n\e15\d2m<##\e3\19c\c8\ee?c\"b\"\04\c5\87\bce\e5]{f\cc\ee?\d51\e2\e3\86\1c\8b<3-J\ec\9b\d0\ee?\15\bb\bc\d3\d1\bb\91\bc]%>\b2\03\d5\ee?\d21\ee\9c1\cc\90\b4\07!\d5\82\bc_\9b{3\97|\ef?\c9\0dG;\b9*\89\bc)\a1\f5\14F\86\ef?\d3\88:`\04\b6t<\f6?\8b\e7.\90\ef?qr\9dQ\ec\c5\83<\83L\c7\fbQ\9a\ef?\f0\91\d3\8f\12\f7\8f\bc\da\90\a4\a2\af\a4\ef?}t#\e2\98\ae\8d\bc\f1g\8e-H\af\ef?\08 \aaA\bc\c3\8e<\'Za\ee\1b\ba\ef?2\eb\a9\c3\94+\84<\97\bak7+\c5\ef?\ee\85\d11\a9d\8a<@En[v\d0\ef?\ed\e3;\e4\ba7\8e\bc\14\be\9c\ad\fd\db\ef?\9d\cd\91M;\89w<\d8\90\9e\81\c1\e7\ef?\89\cc`A\c1\05S<\f1q\8f+\c2\f3\ef?") (table $0 1 funcref) (global $~lib/rt/stub/startOffset (mut i32) (i32.const 0)) (global $~lib/rt/stub/offset (mut i32) (i32.const 0)) @@ -31,8 +30,6 @@ (global $std/operator-overloading/f (mut i32) (i32.const 0)) (global $std/operator-overloading/p1 (mut i32) (i32.const 0)) (global $std/operator-overloading/p2 (mut i32) (i32.const 0)) - (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/math/log_tail (mut f64) (f64.const 0)) (global $std/operator-overloading/p (mut i32) (i32.const 0)) (global $std/operator-overloading/n1 (mut i32) (i32.const 0)) (global $std/operator-overloading/n2 (mut i32) (i32.const 0)) @@ -83,7 +80,7 @@ (global $std/operator-overloading/aii1 (mut i32) (i32.const 0)) (global $std/operator-overloading/aii2 (mut i32) (i32.const 0)) (global $std/operator-overloading/aii (mut i32) (i32.const 0)) - (global $~lib/heap/__heap_base i32 (i32.const 6272)) + (global $~lib/heap/__heap_base i32 (i32.const 88)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/stub/maybeGrowMemory (; 1 ;) (param $0 i32) @@ -352,20 +349,111 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $~lib/math/NativeMath.pow (; 11 ;) (param $0 f64) (param $1 f64) (result f64) + (func $~lib/math/NativeMath.scalbn (; 11 ;) (param $0 f64) (param $1 i32) (result f64) (local $2 f64) - (local $3 f64) + (local $3 i32) + (local $4 i32) + local.get $0 + local.set $2 + local.get $1 + i32.const 1023 + i32.gt_s + if + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 + i32.sub + local.set $1 + local.get $1 + i32.const 1023 + i32.gt_s + if + local.get $2 + f64.const 8988465674311579538646525e283 + f64.mul + local.set $2 + local.get $1 + i32.const 1023 + i32.sub + local.tee $3 + i32.const 1023 + local.tee $4 + local.get $3 + local.get $4 + i32.lt_s + select + local.set $1 + end + else + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.const 53 + i32.sub + i32.add + local.set $1 + local.get $1 + i32.const -1022 + i32.lt_s + if + local.get $2 + f64.const 2.2250738585072014e-308 + f64.const 9007199254740992 + f64.mul + f64.mul + local.set $2 + local.get $1 + i32.const 1022 + i32.add + i32.const 53 + i32.sub + local.tee $3 + i32.const -1022 + local.tee $4 + local.get $3 + local.get $4 + i32.gt_s + select + local.set $1 + end + end + end + local.get $2 + i64.const 1023 + local.get $1 + i64.extend_i32_s + i64.add + i64.const 52 + i64.shl + f64.reinterpret_i64 + f64.mul + ) + (func $~lib/math/NativeMath.pow (; 12 ;) (param $0 f64) (param $1 f64) (result f64) + (local $2 i64) + (local $3 i32) (local $4 i32) - (local $5 i64) - (local $6 i64) - (local $7 i64) - (local $8 i64) - (local $9 i64) - (local $10 f64) - (local $11 i64) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) (local $12 i32) - (local $13 i64) - (local $14 i64) + (local $13 i32) + (local $14 f64) (local $15 f64) (local $16 f64) (local $17 f64) @@ -388,14 +476,6 @@ (local $34 f64) (local $35 f64) (local $36 f64) - (local $37 f64) - (local $38 f64) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i64) - (local $44 i64) local.get $1 f64.abs f64.const 2 @@ -449,870 +529,1047 @@ return end end - block $~lib/util/math/pow_lut|inlined.0 (result f64) - local.get $0 - local.set $3 - local.get $1 - local.set $2 - i32.const 0 - local.set $4 - local.get $3 - i64.reinterpret_f64 - local.set $5 - local.get $2 - i64.reinterpret_f64 - local.set $6 - local.get $5 - i64.const 52 - i64.shr_u - local.set $7 - local.get $6 - i64.const 52 - i64.shr_u - local.set $8 + local.get $0 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $3 + local.get $2 + i32.wrap_i64 + local.set $4 + local.get $1 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $2 + i32.wrap_i64 + local.set $6 + local.get $3 + i32.const 2147483647 + i32.and + local.set $7 + local.get $5 + i32.const 2147483647 + i32.and + local.set $8 + local.get $8 + local.get $6 + i32.or + i32.const 0 + i32.eq + if + f64.const 1 + return + end + local.get $7 + i32.const 2146435072 + i32.gt_s + if (result i32) + i32.const 1 + else local.get $7 - i64.const 1 - i64.sub - i64.const 2046 - i64.ge_u + i32.const 2146435072 + i32.eq if (result i32) - i32.const 1 + local.get $4 + i32.const 0 + i32.ne else - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + i32.const 0 end - if + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.gt_s + end + if (result i32) + i32.const 1 + else + local.get $8 + i32.const 2146435072 + i32.eq + if (result i32) local.get $6 + i32.const 0 + i32.ne + else + i32.const 0 + end + end + if + local.get $0 + local.get $1 + f64.add + return + end + i32.const 0 + local.set $9 + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $8 + i32.const 1128267776 + i32.ge_s + if + i32.const 2 local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u - if - local.get $6 - i64.const 1 - i64.shl - i64.const 0 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - if (result i32) - i32.const 1 - else - local.get $6 - i64.const 1 - i64.shl - i64.const -9007199254740992 - i64.gt_u - end - if - local.get $3 - local.get $2 - f64.add - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.eq - if - f64.const nan:0x8000000000000 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 1 - i64.shl - i64.const 9214364837600034816 - i64.lt_u - local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - i32.eqz - i32.eq - if - f64.const 0 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $2 - local.get $2 - f64.mul - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - local.set $9 - local.get $9 - i64.const 1 - i64.shl - i64.const 1 - i64.sub - i64.const -9007199254740993 - i64.ge_u + else + local.get $8 + i32.const 1072693248 + i32.ge_s if - local.get $3 - local.get $3 - f64.mul + local.get $8 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub local.set $10 - local.get $5 - i64.const 63 - i64.shr_u - i32.wrap_i64 - if (result i32) - block $~lib/util/math/checkint|inlined.0 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.0 - end - i64.const 1 - i64.const 1075 - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.0 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.0 - end - i32.const 2 - end - i32.const 1 - i32.eq - else - i32.const 0 - end - if - local.get $10 - f64.neg - local.set $10 - end + i32.const 52 + i32.const 20 + local.get $10 + i32.const 20 + i32.gt_s + select + local.get $10 + i32.sub + local.set $11 local.get $6 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - f64.const 1 - local.get $10 - f64.div - else - local.get $10 - end - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if - block $~lib/util/math/checkint|inlined.1 (result i32) - local.get $6 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i64.const 2047 - i64.and - local.set $11 - local.get $11 - i64.const 1023 - i64.lt_u - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $11 - i64.const 1075 - i64.gt_u - if - i32.const 2 - br $~lib/util/math/checkint|inlined.1 - end - i64.const 1 - i64.const 1023 - i64.const 52 - i64.add - local.get $11 - i64.sub - i64.shl - local.set $11 - local.get $9 - local.get $11 - i64.const 1 - i64.sub - i64.and - i64.const 0 - i64.ne - if - i32.const 0 - br $~lib/util/math/checkint|inlined.1 - end - local.get $9 - local.get $11 - i64.and - i64.const 0 - i64.ne - if - i32.const 1 - br $~lib/util/math/checkint|inlined.1 - end - i32.const 2 - end + local.get $8 + local.get $10 + i32.const 20 + i32.gt_s + select local.set $12 local.get $12 - i32.const 0 - i32.eq - if - local.get $3 - local.get $3 - f64.sub - local.get $3 - local.get $3 - f64.sub - f64.div - br $~lib/util/math/pow_lut|inlined.0 - end + local.get $11 + i32.shr_u + local.set $13 + local.get $13 + local.get $11 + i32.shl local.get $12 - i32.const 1 i32.eq if - i32.const 262144 - local.set $4 + i32.const 2 + local.get $13 + i32.const 1 + i32.and + i32.sub + local.set $9 end - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $7 - i64.const 2047 - i64.and - local.set $7 end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.sub - i64.const 128 - i64.ge_u + end + end + local.get $6 + i32.const 0 + i32.eq + if + local.get $8 + i32.const 2146435072 + i32.eq + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $4 + i32.or + i32.const 0 + i32.eq if - local.get $5 - i64.const 4607182418800017408 - i64.eq - if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $8 - i64.const 2047 - i64.and - i64.const 958 - i64.lt_u + f64.const nan:0x8000000000000 + return + else + local.get $7 + i32.const 1072693248 + i32.ge_s if - f64.const 1 - br $~lib/util/math/pow_lut|inlined.0 - end - local.get $5 - i64.const 4607182418800017408 - i64.gt_u - local.get $8 - i64.const 2048 - i64.lt_u - i32.eq - if (result f64) - f64.const inf + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + local.get $1 + else + f64.const 0 + end + return else - f64.const 0 + local.get $5 + i32.const 0 + i32.ge_s + if (result f64) + f64.const 0 + else + local.get $1 + f64.neg + end + return end - br $~lib/util/math/pow_lut|inlined.0 + unreachable end - local.get $7 - i64.const 0 - i64.eq + unreachable + end + local.get $8 + i32.const 1072693248 + i32.eq + if + local.get $5 + i32.const 0 + i32.ge_s if - local.get $3 - f64.const 4503599627370496 - f64.mul - i64.reinterpret_f64 - local.set $5 - local.get $5 - i64.const 9223372036854775807 - i64.and - local.set $5 - local.get $5 - i64.const 52 - i64.const 52 - i64.shl - i64.sub - local.set $5 + local.get $0 + return end + f64.const 1 + local.get $0 + f64.div + return end local.get $5 - local.set $9 + i32.const 1073741824 + i32.eq + if + local.get $0 + local.get $0 + f64.mul + return + end + local.get $5 + i32.const 1071644672 + i32.eq + if + local.get $3 + i32.const 0 + i32.ge_s + if + local.get $0 + f64.sqrt + return + end + end + end + local.get $0 + f64.abs + local.set $14 + local.get $4 + i32.const 0 + i32.eq + if + local.get $7 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 2146435072 + i32.eq + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 1072693248 + i32.eq + end + if + local.get $14 + local.set $15 + local.get $5 + i32.const 0 + i32.lt_s + if + f64.const 1 + local.get $15 + f64.div + local.set $15 + end + local.get $3 + i32.const 0 + i32.lt_s + if + local.get $7 + i32.const 1072693248 + i32.sub + local.get $9 + i32.or + i32.const 0 + i32.eq + if + local.get $15 + local.get $15 + f64.sub + local.set $16 + local.get $16 + local.get $16 + f64.div + local.set $15 + else + local.get $9 + i32.const 1 + i32.eq + if + local.get $15 + f64.neg + local.set $15 + end + end + end + local.get $15 + return + end + end + f64.const 1 + local.set $16 + local.get $3 + i32.const 0 + i32.lt_s + if local.get $9 - i64.const 4604531861337669632 - i64.sub - local.set $11 - local.get $11 - i64.const 52 - i64.const 7 - i64.sub - i64.shr_u - i64.const 127 - i64.and - i32.wrap_i64 - local.set $12 - local.get $11 - i64.const 52 - i64.shr_s - local.set $13 + i32.const 0 + i32.eq + if + local.get $0 + local.get $0 + f64.sub + local.set $17 + local.get $17 + local.get $17 + f64.div + return + end local.get $9 - local.get $11 - i64.const 4095 - i64.const 52 - i64.shl - i64.and - i64.sub - local.set $14 + i32.const 1 + i32.eq + if + f64.const -1 + local.set $16 + end + end + local.get $8 + i32.const 1105199104 + i32.gt_s + if + local.get $8 + i32.const 1139802112 + i32.gt_s + if + local.get $7 + i32.const 1072693247 + i32.le_s + if + local.get $5 + i32.const 0 + i32.lt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.ge_s + if + local.get $5 + i32.const 0 + i32.gt_s + if (result f64) + f64.const 1.e+300 + f64.const 1.e+300 + f64.mul + else + f64.const 1e-300 + f64.const 1e-300 + f64.mul + end + return + end + end + local.get $7 + i32.const 1072693247 + i32.lt_s + if + local.get $5 + i32.const 0 + i32.lt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end + local.get $7 + i32.const 1072693248 + i32.gt_s + if + local.get $5 + i32.const 0 + i32.gt_s + if (result f64) + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + else + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + end + return + end local.get $14 + f64.const 1 + f64.sub + local.set $22 + local.get $22 + local.get $22 + f64.mul + f64.const 0.5 + local.get $22 + f64.const 0.3333333333333333 + local.get $22 + f64.const 0.25 + f64.mul + f64.sub + f64.mul + f64.sub + f64.mul + local.set $25 + f64.const 1.4426950216293335 + local.get $22 + f64.mul + local.set $23 + local.get $22 + f64.const 1.9259629911266175e-08 + f64.mul + local.get $25 + f64.const 1.4426950408889634 + f64.mul + f64.sub + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $17 + local.get $17 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and f64.reinterpret_i64 - local.set $10 - local.get $13 - f64.convert_i64_s - local.set $15 - i32.const 112 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load - local.set $16 - i32.const 112 - local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl - i32.add - f64.load offset=16 local.set $17 - i32.const 112 + local.get $24 + local.get $17 + local.get $23 + f64.sub + f64.sub + local.set $18 + else + i32.const 0 + local.set $12 + local.get $7 + i32.const 1048576 + i32.lt_s + if + local.get $14 + f64.const 9007199254740992 + f64.mul + local.set $14 + local.get $12 + i32.const 53 + i32.sub + local.set $12 + local.get $14 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $7 + end local.get $12 - i32.const 2 - i32.const 3 - i32.add - i32.shl + local.get $7 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub i32.add - f64.load offset=24 - local.set $18 + local.set $12 + local.get $7 + i32.const 1048575 + i32.and + local.set $13 + local.get $13 + i32.const 1072693248 + i32.or + local.set $7 + local.get $13 + i32.const 235662 + i32.le_s + if + i32.const 0 + local.set $10 + else + local.get $13 + i32.const 767610 + i32.lt_s + if + i32.const 1 + local.set $10 + else + i32.const 0 + local.set $10 + local.get $12 + i32.const 1 + i32.add + local.set $12 + local.get $7 + i32.const 1048576 + i32.sub + local.set $7 + end + end local.get $14 - i64.const 2147483648 - i64.add - i64.const -4294967296 + i64.reinterpret_f64 + i64.const 4294967295 i64.and + local.get $7 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or f64.reinterpret_i64 - local.set $19 - local.get $10 - local.get $19 - f64.sub - local.set $20 - local.get $19 - local.get $16 - f64.mul + local.set $14 + f64.const 1.5 f64.const 1 + local.get $10 + select + local.set $32 + local.get $14 + local.get $32 f64.sub - local.set $21 - local.get $20 - local.get $16 - f64.mul - local.set $22 - local.get $21 - local.get $22 - f64.add local.set $23 - local.get $15 - f64.const 0.6931471805598903 - f64.mul - local.get $17 + f64.const 1 + local.get $14 + local.get $32 f64.add + f64.div local.set $24 - local.get $24 local.get $23 - f64.add - local.set $25 - local.get $15 - f64.const 5.497923018708371e-14 + local.get $24 f64.mul - local.get $18 - f64.add local.set $26 - local.get $24 - local.get $25 + local.get $26 + local.set $28 + local.get $28 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $28 + local.get $7 + i32.const 1 + i32.shr_s + i32.const 536870912 + i32.or + i32.const 524288 + i32.add + local.get $10 + i32.const 18 + i32.shl + i32.add + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $30 + local.get $14 + local.get $30 + local.get $32 f64.sub + f64.sub + local.set $31 + local.get $24 local.get $23 - f64.add - local.set $27 - f64.const -0.5 - local.get $23 + local.get $28 + local.get $30 f64.mul - local.set $28 - local.get $23 + f64.sub local.get $28 + local.get $31 + f64.mul + f64.sub f64.mul local.set $29 - local.get $23 - local.get $29 + local.get $26 + local.get $26 f64.mul - local.set $30 - f64.const -0.5 - local.get $21 + local.set $27 + local.get $27 + local.get $27 f64.mul - local.set $31 - local.get $21 - local.get $31 + f64.const 0.5999999999999946 + local.get $27 + f64.const 0.4285714285785502 + local.get $27 + f64.const 0.33333332981837743 + local.get $27 + f64.const 0.272728123808534 + local.get $27 + f64.const 0.23066074577556175 + local.get $27 + f64.const 0.20697501780033842 f64.mul - local.set $32 - local.get $25 - local.get $32 f64.add - local.set $33 - local.get $22 - local.get $28 - local.get $31 + f64.mul f64.add f64.mul - local.set $34 - local.get $25 - local.get $33 - f64.sub - local.get $32 f64.add - local.set $35 - local.get $30 - f64.const -0.6666666666666679 - local.get $23 - f64.const 0.5000000000000007 f64.mul f64.add - local.get $29 - f64.const 0.7999999995323976 - local.get $23 - f64.const -0.6666666663487739 f64.mul f64.add + f64.mul + local.set $21 + local.get $21 local.get $29 - f64.const -1.142909628459501 - local.get $23 - f64.const 1.0000415263675542 + local.get $28 + local.get $26 + f64.add f64.mul f64.add + local.set $21 + local.get $28 + local.get $28 f64.mul + local.set $27 + f64.const 3 + local.get $27 f64.add + local.get $21 + f64.add + local.set $30 + local.get $30 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $30 + local.get $21 + local.get $30 + f64.const 3 + f64.sub + local.get $27 + f64.sub + f64.sub + local.set $31 + local.get $28 + local.get $30 + f64.mul + local.set $23 + local.get $29 + local.get $30 + f64.mul + local.get $31 + local.get $26 f64.mul f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $19 + local.get $19 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $19 + local.get $24 + local.get $19 + local.get $23 + f64.sub + f64.sub + local.set $20 + f64.const 0.9617967009544373 + local.get $19 f64.mul + local.set $33 + f64.const 1.350039202129749e-08 + f64.const 0 + local.get $10 + select + local.set $34 + f64.const -7.028461650952758e-09 + local.get $19 + f64.mul + local.get $20 + f64.const 0.9617966939259756 + f64.mul + f64.add + local.get $34 + f64.add + local.set $35 + local.get $12 + f64.convert_i32_s + local.set $22 + f64.const 0.5849624872207642 + f64.const 0 + local.get $10 + select local.set $36 - local.get $26 - local.get $27 - f64.add - local.get $34 - f64.add + local.get $33 local.get $35 f64.add local.get $36 f64.add - local.set $37 - local.get $33 - local.get $37 - f64.add - local.set $38 - local.get $33 - local.get $38 - f64.sub - local.get $37 + local.get $22 f64.add - global.set $~lib/util/math/log_tail - local.get $38 - local.set $38 - global.get $~lib/util/math/log_tail - local.set $37 - local.get $6 - i64.const -134217728 - i64.and - f64.reinterpret_i64 - local.set $34 - local.get $2 - local.get $34 - f64.sub - local.set $33 - local.get $38 + local.set $17 + local.get $17 i64.reinterpret_f64 - i64.const -134217728 + i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $32 - local.get $38 - local.get $32 + local.set $17 + local.get $35 + local.get $17 + local.get $22 + f64.sub + local.get $36 f64.sub - local.get $37 - f64.add - local.set $31 - local.get $34 - local.get $32 - f64.mul - local.set $36 local.get $33 - local.get $32 - f64.mul - local.get $2 - local.get $31 - f64.mul + f64.sub + f64.sub + local.set $18 + end + local.get $1 + local.set $36 + local.get $36 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $36 + local.get $1 + local.get $36 + f64.sub + local.get $17 + f64.mul + local.get $1 + local.get $18 + f64.mul + f64.add + local.set $20 + local.get $36 + local.get $17 + f64.mul + local.set $19 + local.get $20 + local.get $19 + f64.add + local.set $15 + local.get $15 + i64.reinterpret_f64 + local.set $2 + local.get $2 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $2 + i32.wrap_i64 + local.set $11 + local.get $13 + i32.const 1083179008 + i32.ge_s + if + local.get $13 + i32.const 1083179008 + i32.sub + local.get $11 + i32.or + i32.const 0 + i32.ne + if + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + return + end + local.get $20 + f64.const 8.008566259537294e-17 f64.add - local.set $35 - block $~lib/util/math/exp_inline|inlined.0 (result f64) - local.get $36 - local.set $15 - local.get $35 - local.set $10 - local.get $4 - local.set $12 - local.get $15 - i64.reinterpret_f64 - local.set $9 - local.get $9 - i64.const 52 - i64.shr_u - i32.wrap_i64 - i32.const 2047 - i32.and - local.set $39 - local.get $39 - i32.const 969 + local.get $15 + local.get $19 + f64.sub + f64.gt + if + local.get $16 + f64.const 1.e+300 + f64.mul + f64.const 1.e+300 + f64.mul + return + end + else + local.get $13 + i32.const 2147483647 + i32.and + i32.const 1083231232 + i32.ge_s + if + local.get $13 + i32.const -1064252416 i32.sub - i32.const 63 - i32.ge_u + local.get $11 + i32.or + i32.const 0 + i32.ne if - local.get $39 - i32.const 969 - i32.sub - i32.const -2147483648 - i32.ge_u - if - f64.const -1 - f64.const 1 - local.get $12 - select - br $~lib/util/math/exp_inline|inlined.0 - end - local.get $39 - i32.const 1033 - i32.ge_u - if - local.get $9 - i64.const 63 - i64.shr_u - i64.const 0 - i64.ne - if (result f64) - local.get $12 - local.set $41 - local.get $41 - local.set $42 - i64.const 1152921504606846976 - f64.reinterpret_i64 - local.set $16 - local.get $16 - f64.neg - local.get $16 - local.get $42 - select - local.get $16 - f64.mul - else - local.get $12 - local.set $42 - local.get $42 - local.set $41 - i64.const 8070450532247928832 - f64.reinterpret_i64 - local.set $17 - local.get $17 - f64.neg - local.get $17 - local.get $41 - select - local.get $17 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 - end - i32.const 0 - local.set $39 + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return end - f64.const 184.6649652337873 + local.get $20 local.get $15 - f64.mul - local.set $29 - local.get $29 - f64.const 6755399441055744 - f64.add - local.set $30 - local.get $30 - i64.reinterpret_f64 - local.set $14 - local.get $30 - f64.const 6755399441055744 + local.get $19 f64.sub - local.set $30 - local.get $15 - local.get $30 - f64.const -0.005415212348111709 - f64.mul - f64.add - local.get $30 - f64.const -1.2864023111638346e-14 - f64.mul - f64.add - local.set $28 - local.get $28 - local.get $10 - f64.add - local.set $28 - local.get $14 - i64.const 127 - i64.and - i64.const 1 - i64.shl - i32.wrap_i64 - local.set $40 - local.get $14 - local.get $12 - i64.extend_i32_u - i64.add - i64.const 52 - i64.const 7 - i64.sub - i64.shl - local.set $13 - i32.const 4224 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load - f64.reinterpret_i64 - local.set $25 - i32.const 4224 - local.get $40 - i32.const 3 - i32.shl - i32.add - i64.load offset=8 - local.get $13 - i64.add - local.set $11 - local.get $28 - local.get $28 - f64.mul - local.set $27 - local.get $25 - local.get $28 - f64.add - local.get $27 - f64.const 0.49999999999996786 - local.get $28 - f64.const 0.16666666666665886 - f64.mul - f64.add - f64.mul - f64.add - local.get $27 - local.get $27 - f64.mul - f64.const 0.0416666808410674 - local.get $28 - f64.const 0.008333335853059549 - f64.mul - f64.add - f64.mul - f64.add - local.set $24 - local.get $39 - i32.const 0 - i32.eq + f64.le if - block $~lib/util/math/specialcase|inlined.0 (result f64) - local.get $24 - local.set $18 - local.get $11 - local.set $44 - local.get $14 - local.set $43 - local.get $43 - i64.const 2147483648 - i64.and - i64.const 0 - i64.ne - i32.eqz - if - local.get $44 - i64.const 1009 - i64.const 52 - i64.shl - i64.sub - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - f64.const 5486124068793688683255936e279 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - f64.mul - br $~lib/util/math/specialcase|inlined.0 - end - local.get $44 - i64.const 1022 - i64.const 52 - i64.shl - i64.add - local.set $44 - local.get $44 - f64.reinterpret_i64 - local.set $17 - local.get $17 - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $16 - local.get $16 - f64.abs - f64.const 1 - f64.lt - if - f64.const 1 - local.get $16 - f64.copysign - local.set $23 - local.get $17 - local.get $16 - f64.sub - local.get $17 - local.get $18 - f64.mul - f64.add - local.set $22 - local.get $23 - local.get $16 - f64.add - local.set $21 - local.get $23 - local.get $21 - f64.sub - local.get $16 - f64.add - local.get $22 - f64.add - local.set $22 - local.get $21 - local.get $22 - f64.add - local.get $23 - f64.sub - local.set $16 - local.get $16 - f64.const 0 - f64.eq - if - local.get $44 - i64.const -9223372036854775808 - i64.and - f64.reinterpret_i64 - local.set $16 - end - end - local.get $16 - f64.const 2.2250738585072014e-308 - f64.mul - end - br $~lib/util/math/exp_inline|inlined.0 + local.get $16 + f64.const 1e-300 + f64.mul + f64.const 1e-300 + f64.mul + return end - local.get $11 - f64.reinterpret_i64 - local.set $26 - local.get $26 - local.get $26 - local.get $24 - f64.mul - f64.add end end + local.get $13 + i32.const 2147483647 + i32.and + local.set $11 + local.get $11 + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + i32.const 0 + local.set $12 + local.get $11 + i32.const 1071644672 + i32.gt_s + if + local.get $13 + i32.const 1048576 + local.get $10 + i32.const 1 + i32.add + i32.shr_s + i32.add + local.set $12 + local.get $12 + i32.const 2147483647 + i32.and + i32.const 20 + i32.shr_s + i32.const 1023 + i32.sub + local.set $10 + f64.const 0 + local.set $22 + local.get $12 + i32.const 1048575 + local.get $10 + i32.shr_s + i32.const -1 + i32.xor + i32.and + i64.extend_i32_s + i64.const 32 + i64.shl + f64.reinterpret_i64 + local.set $22 + local.get $12 + i32.const 1048575 + i32.and + i32.const 1048576 + i32.or + i32.const 20 + local.get $10 + i32.sub + i32.shr_s + local.set $12 + local.get $13 + i32.const 0 + i32.lt_s + if + i32.const 0 + local.get $12 + i32.sub + local.set $12 + end + local.get $19 + local.get $22 + f64.sub + local.set $19 + end + local.get $20 + local.get $19 + f64.add + local.set $22 + local.get $22 + i64.reinterpret_f64 + i64.const -4294967296 + i64.and + f64.reinterpret_i64 + local.set $22 + local.get $22 + f64.const 0.6931471824645996 + f64.mul + local.set $23 + local.get $20 + local.get $22 + local.get $19 + f64.sub + f64.sub + f64.const 0.6931471805599453 + f64.mul + local.get $22 + f64.const -1.904654299957768e-09 + f64.mul + f64.add + local.set $24 + local.get $23 + local.get $24 + f64.add + local.set $15 + local.get $24 + local.get $15 + local.get $23 + f64.sub + f64.sub + local.set $25 + local.get $15 + local.get $15 + f64.mul + local.set $22 + local.get $15 + local.get $22 + f64.const 0.16666666666666602 + local.get $22 + f64.const -2.7777777777015593e-03 + local.get $22 + f64.const 6.613756321437934e-05 + local.get $22 + f64.const -1.6533902205465252e-06 + local.get $22 + f64.const 4.1381367970572385e-08 + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.add + f64.mul + f64.sub + local.set $17 + local.get $15 + local.get $17 + f64.mul + local.get $17 + f64.const 2 + f64.sub + f64.div + local.get $25 + local.get $15 + local.get $25 + f64.mul + f64.add + f64.sub + local.set $21 + f64.const 1 + local.get $21 + local.get $15 + f64.sub + f64.sub + local.set $15 + local.get $15 + i64.reinterpret_f64 + i64.const 32 + i64.shr_u + i32.wrap_i64 + local.set $13 + local.get $13 + local.get $12 + i32.const 20 + i32.shl + i32.add + local.set $13 + local.get $13 + i32.const 20 + i32.shr_s + i32.const 0 + i32.le_s + if + local.get $15 + local.get $12 + call $~lib/math/NativeMath.scalbn + local.set $15 + else + local.get $15 + i64.reinterpret_f64 + i64.const 4294967295 + i64.and + local.get $13 + i64.extend_i32_s + i64.const 32 + i64.shl + i64.or + f64.reinterpret_i64 + local.set $15 + end + local.get $16 + local.get $15 + f64.mul return ) - (func $std/operator-overloading/Tester.pow (; 12 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.pow (; 13 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1345,7 +1602,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.and (; 13 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.and (; 14 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1372,7 +1629,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.or (; 14 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.or (; 15 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1399,7 +1656,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.xor (; 15 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.xor (; 16 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1426,7 +1683,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.equals (; 16 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.equals (; 17 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1455,7 +1712,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.notEquals (; 17 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.notEquals (; 18 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1484,7 +1741,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.greater (; 18 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.greater (; 19 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1513,7 +1770,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.greaterEquals (; 19 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.greaterEquals (; 20 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1542,7 +1799,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.less (; 20 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.less (; 21 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1571,7 +1828,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.lessEquals (; 21 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.lessEquals (; 22 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1600,7 +1857,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.shr (; 22 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.shr (; 23 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1620,7 +1877,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.shu (; 23 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.shu (; 24 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1640,7 +1897,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.shl (; 24 ;) (param $0 i32) (param $1 i32) (result i32) + (func $std/operator-overloading/Tester.shl (; 25 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1660,7 +1917,7 @@ call $~lib/rt/stub/__release local.get $2 ) - (func $std/operator-overloading/Tester.pos (; 25 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester.pos (; 26 ;) (param $0 i32) (result i32) (local $1 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1676,7 +1933,7 @@ call $~lib/rt/stub/__release local.get $1 ) - (func $std/operator-overloading/Tester.neg (; 26 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester.neg (; 27 ;) (param $0 i32) (result i32) (local $1 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1696,7 +1953,7 @@ call $~lib/rt/stub/__release local.get $1 ) - (func $std/operator-overloading/Tester.not (; 27 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester.not (; 28 ;) (param $0 i32) (result i32) (local $1 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1716,7 +1973,7 @@ call $~lib/rt/stub/__release local.get $1 ) - (func $std/operator-overloading/Tester.excl (; 28 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester.excl (; 29 ;) (param $0 i32) (result i32) (local $1 i32) local.get $0 call $~lib/rt/stub/__retain @@ -1736,7 +1993,7 @@ call $~lib/rt/stub/__release local.get $1 ) - (func $std/operator-overloading/Tester#inc (; 29 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester#inc (; 30 ;) (param $0 i32) (result i32) local.get $0 local.get $0 i32.load @@ -1752,7 +2009,7 @@ local.get $0 call $~lib/rt/stub/__retain ) - (func $std/operator-overloading/Tester#dec (; 30 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester#dec (; 31 ;) (param $0 i32) (result i32) local.get $0 local.get $0 i32.load @@ -1768,7 +2025,7 @@ local.get $0 call $~lib/rt/stub/__retain ) - (func $std/operator-overloading/Tester#postInc (; 31 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester#postInc (; 32 ;) (param $0 i32) (result i32) i32.const 0 local.get $0 i32.load @@ -1780,7 +2037,7 @@ i32.add call $std/operator-overloading/Tester#constructor ) - (func $std/operator-overloading/Tester#postDec (; 32 ;) (param $0 i32) (result i32) + (func $std/operator-overloading/Tester#postDec (; 33 ;) (param $0 i32) (result i32) i32.const 0 local.get $0 i32.load @@ -1792,12 +2049,12 @@ i32.sub call $std/operator-overloading/Tester#constructor ) - (func $std/operator-overloading/TesterInlineStatic#constructor (; 33 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/operator-overloading/TesterInlineStatic#constructor (; 34 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $0 i32.eqz if i32.const 8 - i32.const 6 + i32.const 4 call $~lib/rt/stub/__alloc call $~lib/rt/stub/__retain local.set $0 @@ -1810,12 +2067,12 @@ i32.store offset=4 local.get $0 ) - (func $std/operator-overloading/TesterInlineInstance#constructor (; 34 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/operator-overloading/TesterInlineInstance#constructor (; 35 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $0 i32.eqz if i32.const 8 - i32.const 7 + i32.const 5 call $~lib/rt/stub/__alloc call $~lib/rt/stub/__retain local.set $0 @@ -1828,7 +2085,7 @@ i32.store offset=4 local.get $0 ) - (func $start:std/operator-overloading (; 35 ;) + (func $start:std/operator-overloading (; 36 ;) (local $0 i32) (local $1 i32) (local $2 i32) @@ -3080,7 +3337,7 @@ local.get $22 call $~lib/rt/stub/__release ) - (func $~start (; 36 ;) + (func $~start (; 37 ;) call $start:std/operator-overloading ) ) From 7d0a173300690bc0200959c24450ae6d01114f5a Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 28 Feb 2020 02:49:26 +0200 Subject: [PATCH 5/6] rebuild mandelbrod example --- examples/mandelbrot/build/optimized.wasm | Bin 578 -> 543 bytes examples/mandelbrot/build/optimized.wat | 200 +++++++++--------- examples/mandelbrot/build/untouched.wat | 250 ++++++++++++----------- 3 files changed, 226 insertions(+), 224 deletions(-) diff --git a/examples/mandelbrot/build/optimized.wasm b/examples/mandelbrot/build/optimized.wasm index d4fccd63975e3f2da22733a60d93902935927762..1d8d62c490b5f11e352089932056ee7f7bcb7d7e 100644 GIT binary patch literal 543 zcmZva%}T>S6ov2nWro~<1+S!A-&Hr^UK=ortP6pls^$$$r?pInB%V|Ah(Ttjz?YNBnl zP@L8Qt&sJ#RpUx2%Civi(mZw+8cJy&yF{m UyGfe$;@(5lY2MMbXvVGd2e^Z1!2kdN literal 578 zcmY*XyG{a85S{zj2Q0|O%5v_;SX$Ux?2>3FF)^`+zy_DN>_$MNA>mVmD^^x^`#BVT z03TqY!+L=@%{`epXU@#zLT8jR0ARjo%NYf<*_2J&0Q^MAR%d)C?z29y5=w$+z(hQJ zw9`1v9-cXX5FEI3#CI95o2B_=9A72F7LFIzXD853iY=i=N5x6F| z3iZOkc2x1g$(hc?nvM?iMpWMc(}vkp;E$2WCg5=f$@YKVwOXd%0< z16l=XvA$3>!vRqC9y(1>vgF%n>!5-TIy!LYhT%u?WqoT05mBg&-ds6YL3e?*IV~np zY@B414V0`g&l3^K0vlaPf>J`FlDl30eMXZSw2qE>^ diff --git a/examples/mandelbrot/build/optimized.wat b/examples/mandelbrot/build/optimized.wat index 82bdd9a7b0..4b92ab4125 100644 --- a/examples/mandelbrot/build/optimized.wat +++ b/examples/mandelbrot/build/optimized.wat @@ -1,133 +1,136 @@ (module - (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) - (type $FUNCSIG$dd (func (param f64) (result f64))) - (type $FUNCSIG$v (func)) + (type $f64_=>_f64 (func (param f64) (result f64))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (import "env" "memory" (memory $0 0)) (import "Math" "log" (func $~lib/bindings/Math/log (param f64) (result f64))) (import "Math" "log2" (func $~lib/bindings/Math/log2 (param f64) (result f64))) (export "memory" (memory $0)) (export "computeLine" (func $assembly/index/computeLine)) - (func $assembly/index/computeLine (; 2 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (func $assembly/index/computeLine (; 2 ;) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (local $4 f64) (local $5 f64) - (local $6 f64) + (local $6 i32) (local $7 i32) - (local $8 i32) + (local $8 f64) (local $9 f64) (local $10 f64) (local $11 f64) (local $12 f64) (local $13 f64) (local $14 f64) - (local $15 f64) - local.get $1 - f64.convert_i32_u - local.tee $9 - f64.const 0.625 - f64.mul local.get $0 f64.convert_i32_u local.get $2 f64.convert_i32_u - local.tee $6 f64.const 0.5 f64.mul f64.sub f64.const 10 - f64.const 3 - local.get $9 - f64.mul - f64.const 4 + local.get $1 + i32.const 3 + i32.mul + local.tee $6 + local.get $2 + i32.const 2 + i32.shl + local.tee $2 local.get $6 - f64.mul - f64.min + local.get $2 + i32.lt_s + select + f64.convert_i32_s f64.div - local.tee $10 + local.tee $9 + f64.mul + local.set $10 + local.get $1 + f64.convert_i32_u + f64.const 0.625 f64.mul - local.set $11 - local.get $10 + local.get $9 f64.mul - local.set $13 + local.set $12 local.get $0 local.get $1 i32.mul i32.const 1 i32.shl - local.set $0 + local.set $2 f64.const 1 local.get $3 f64.convert_i32_u - local.tee $6 f64.div - local.set $14 - f64.const 8 - local.get $6 - f64.min - local.set $15 - loop $loop|0 - block $break|0 - local.get $8 - local.get $1 - i32.ge_u - br_if $break|0 - local.get $8 + local.set $13 + i32.const 8 + local.get $3 + i32.const 8 + local.get $3 + i32.lt_u + select + local.set $0 + i32.const 0 + local.set $6 + loop $for-loop|0 + local.get $6 + local.get $1 + i32.lt_u + if + local.get $6 f64.convert_i32_u - local.get $10 + local.get $9 f64.mul - local.get $13 + local.get $12 f64.sub - local.set $12 - f64.const 0 - local.set $4 + local.set $11 f64.const 0 + local.tee $4 local.set $5 i32.const 0 local.set $7 - loop $continue|1 - block $break|1 - local.get $4 - local.get $4 - f64.mul - local.tee $9 - local.get $5 - local.get $5 - f64.mul - local.tee $6 - f64.add - f64.const 4 - f64.le - i32.eqz - br_if $break|1 - f64.const 2 - local.get $4 - f64.mul - local.get $5 - f64.mul - local.get $11 - f64.add - local.set $5 - local.get $9 - local.get $6 - f64.sub - local.get $12 - f64.add - local.set $4 - local.get $7 - local.get $3 - i32.ge_u - br_if $break|1 - local.get $7 - i32.const 1 - i32.add - local.set $7 - br $continue|1 + loop $while-continue|1 + local.get $4 + local.get $4 + f64.mul + local.tee $14 + local.get $5 + local.get $5 + f64.mul + local.tee $8 + f64.add + f64.const 4 + f64.le + if + block $while-break|1 + f64.const 2 + local.get $4 + f64.mul + local.get $5 + f64.mul + local.get $10 + f64.add + local.set $5 + local.get $14 + local.get $8 + f64.sub + local.get $11 + f64.add + local.set $4 + local.get $7 + local.get $3 + i32.ge_u + br_if $while-break|1 + local.get $7 + i32.const 1 + i32.add + local.set $7 + br $while-continue|1 + end end end - loop $continue|2 + loop $while-continue|2 local.get $7 - f64.convert_i32_u - local.get $15 - f64.lt + local.get $0 + i32.lt_u if local.get $4 local.get $4 @@ -136,14 +139,14 @@ local.get $5 f64.mul f64.sub - local.get $12 + local.get $11 f64.add f64.const 2 local.get $4 f64.mul local.get $5 f64.mul - local.get $11 + local.get $10 f64.add local.set $5 local.set $4 @@ -151,15 +154,13 @@ i32.const 1 i32.add local.set $7 - br $continue|2 + br $while-continue|2 end end - i32.const 2047 - local.set $2 - local.get $8 + local.get $6 i32.const 1 i32.shl - local.get $0 + local.get $2 i32.add local.get $4 local.get $4 @@ -168,7 +169,7 @@ local.get $5 f64.mul f64.add - local.tee $6 + local.tee $8 f64.const 1 f64.gt if (result i32) @@ -178,12 +179,12 @@ i32.add f64.convert_i32_u f64.const 0.5 - local.get $6 + local.get $8 call $~lib/bindings/Math/log f64.mul call $~lib/bindings/Math/log2 f64.sub - local.get $14 + local.get $13 f64.mul f64.const 0 f64.max @@ -191,19 +192,16 @@ f64.min f64.mul i32.trunc_f64_u - else + else i32.const 2047 end i32.store16 - local.get $8 + local.get $6 i32.const 1 i32.add - local.set $8 - br $loop|0 + local.set $6 + br $for-loop|0 end end ) - (func $null (; 3 ;) (type $FUNCSIG$v) - nop - ) ) diff --git a/examples/mandelbrot/build/untouched.wat b/examples/mandelbrot/build/untouched.wat index 8db1ec8f17..4d3fc73914 100644 --- a/examples/mandelbrot/build/untouched.wat +++ b/examples/mandelbrot/build/untouched.wat @@ -1,37 +1,37 @@ (module - (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) - (type $FUNCSIG$dd (func (param f64) (result f64))) - (type $FUNCSIG$v (func)) + (type $f64_=>_f64 (func (param f64) (result f64))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (import "env" "memory" (memory $0 0)) (import "Math" "log" (func $~lib/bindings/Math/log (param f64) (result f64))) (import "Math" "log2" (func $~lib/bindings/Math/log2 (param f64) (result f64))) (table $0 1 funcref) - (elem (i32.const 0) $null) (global $assembly/index/NUM_COLORS i32 (i32.const 2048)) (export "memory" (memory $0)) (export "computeLine" (func $assembly/index/computeLine)) - (func $assembly/index/computeLine (; 2 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (func $assembly/index/computeLine (; 2 ;) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (local $4 f64) (local $5 f64) - (local $6 f64) - (local $7 f64) + (local $6 i32) + (local $7 i32) (local $8 f64) - (local $9 i32) + (local $9 f64) (local $10 f64) - (local $11 f64) - (local $12 i32) - (local $13 f64) + (local $11 i32) + (local $12 f64) + (local $13 i32) (local $14 f64) (local $15 f64) (local $16 f64) (local $17 f64) - (local $18 i32) - (local $19 f64) + (local $18 f64) + (local $19 i32) (local $20 i32) (local $21 f64) (local $22 f64) (local $23 f64) (local $24 f64) + (local $25 f64) + (local $26 f64) local.get $1 f64.convert_i32_u f64.const 1 @@ -47,209 +47,213 @@ f64.mul local.set $5 f64.const 10 - f64.const 3 + i32.const 3 local.get $1 - f64.convert_i32_u - f64.mul - f64.const 4 + i32.mul + local.tee $6 + i32.const 4 local.get $2 - f64.convert_i32_u - f64.mul - f64.min + i32.mul + local.tee $7 + local.get $6 + local.get $7 + i32.lt_s + select + f64.convert_i32_s f64.div - local.set $6 + local.set $8 local.get $0 f64.convert_i32_u local.get $5 f64.sub - local.get $6 + local.get $8 f64.mul - local.set $7 + local.set $9 local.get $4 - local.get $6 + local.get $8 f64.mul - local.set $8 + local.set $10 local.get $0 local.get $1 i32.mul i32.const 1 i32.shl - local.set $9 + local.set $11 f64.const 1 local.get $3 f64.convert_i32_u f64.div - local.set $10 - f64.const 8 + local.set $12 + i32.const 8 + local.tee $6 local.get $3 - f64.convert_i32_u - f64.min - local.set $11 - block $break|0 - i32.const 0 - local.set $12 - loop $loop|0 - local.get $12 - local.get $1 - i32.lt_u - i32.eqz - br_if $break|0 - local.get $12 - f64.convert_i32_u + local.tee $7 + local.get $6 + local.get $7 + i32.lt_u + select + local.set $13 + i32.const 0 + local.set $6 + loop $for-loop|0 + local.get $6 + local.get $1 + i32.lt_u + local.set $7 + local.get $7 + if local.get $6 - f64.mul + f64.convert_i32_u local.get $8 + f64.mul + local.get $10 f64.sub - local.set $13 - f64.const 0 local.set $14 f64.const 0 local.set $15 + f64.const 0 + local.set $16 i32.const 0 - local.set $18 - block $break|1 - loop $continue|1 - local.get $14 - local.get $14 - f64.mul - local.tee $16 + local.set $19 + block $while-break|1 + loop $while-continue|1 local.get $15 local.get $15 f64.mul local.tee $17 + local.get $16 + local.get $16 + f64.mul + local.tee $18 f64.add f64.const 4 f64.le - i32.eqz - br_if $break|1 - f64.const 2 - local.get $14 - f64.mul - local.get $15 - f64.mul - local.get $7 - f64.add - local.set $15 - local.get $16 - local.get $17 - f64.sub - local.get $13 - f64.add - local.set $14 - local.get $18 - local.get $3 - i32.ge_u + local.set $20 + local.get $20 if - br $break|1 + f64.const 2 + local.get $15 + f64.mul + local.get $16 + f64.mul + local.get $9 + f64.add + local.set $16 + local.get $17 + local.get $18 + f64.sub + local.get $14 + f64.add + local.set $15 + local.get $19 + local.get $3 + i32.ge_u + if + br $while-break|1 + end + local.get $19 + i32.const 1 + i32.add + local.set $19 + br $while-continue|1 end - local.get $18 - i32.const 1 - i32.add - local.set $18 - br $continue|1 end - unreachable end - block $break|2 - loop $continue|2 - local.get $18 - f64.convert_i32_u - local.get $11 - f64.lt - i32.eqz - br_if $break|2 - local.get $14 - local.get $14 - f64.mul + loop $while-continue|2 + local.get $19 + local.get $13 + i32.lt_u + local.set $20 + local.get $20 + if local.get $15 local.get $15 f64.mul + local.get $16 + local.get $16 + f64.mul f64.sub - local.get $13 + local.get $14 f64.add - local.set $19 + local.set $21 f64.const 2 - local.get $14 - f64.mul local.get $15 f64.mul - local.get $7 + local.get $16 + f64.mul + local.get $9 f64.add + local.set $16 + local.get $21 local.set $15 local.get $19 - local.set $14 - local.get $18 i32.const 1 i32.add - local.set $18 - br $continue|2 + local.set $19 + br $while-continue|2 end - unreachable end global.get $assembly/index/NUM_COLORS i32.const 1 i32.sub local.set $20 - local.get $14 - local.get $14 - f64.mul local.get $15 local.get $15 f64.mul + local.get $16 + local.get $16 + f64.mul f64.add - local.set $19 - local.get $19 + local.set $22 + local.get $22 f64.const 1 f64.gt if f64.const 0.5 - local.get $19 + local.get $22 call $~lib/bindings/Math/log f64.mul call $~lib/bindings/Math/log2 - local.set $21 + local.set $23 global.get $assembly/index/NUM_COLORS i32.const 1 i32.sub f64.convert_i32_s - local.get $18 + local.get $19 i32.const 1 i32.add f64.convert_i32_u - local.get $21 + local.get $23 f64.sub - local.get $10 + local.get $12 f64.mul - local.set $24 + local.set $26 f64.const 0 - local.set $23 + local.set $25 f64.const 1 - local.set $22 - local.get $24 - local.get $23 + local.set $24 + local.get $26 + local.get $25 f64.max - local.get $22 + local.get $24 f64.min f64.mul i32.trunc_f64_u local.set $20 end - local.get $9 - local.get $12 + local.get $11 + local.get $6 i32.const 1 i32.shl i32.add local.get $20 i32.store16 - local.get $12 + local.get $6 i32.const 1 i32.add - local.set $12 - br $loop|0 + local.set $6 + br $for-loop|0 end - unreachable end ) - (func $null (; 3 ;) (type $FUNCSIG$v) - ) ) From b5e3ec54a7f97ba853b16dca1052fcf6b5e4797f Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 29 Feb 2020 08:07:20 +0200 Subject: [PATCH 6/6] cleanups --- NOTICE | 5 - std/assembly/math.ts | 890 ++++---- std/assembly/util/math.ts | 1935 ----------------- tests/compiler/binary.untouched.wat | 385 ++-- tests/compiler/mandelbrot.untouched.wat | 2 - tests/compiler/resolve-binary.untouched.wat | 385 ++-- tests/compiler/std/array.optimized.wat | 4 +- tests/compiler/std/array.untouched.wat | 4 +- tests/compiler/std/libm.untouched.wat | 391 ++-- tests/compiler/std/math.optimized.wat | 6 +- tests/compiler/std/math.untouched.wat | 397 ++-- .../std/operator-overloading.untouched.wat | 385 ++-- 12 files changed, 1400 insertions(+), 3389 deletions(-) delete mode 100644 std/assembly/util/math.ts diff --git a/NOTICE b/NOTICE index 3cbcecc156..e81924ddd5 100644 --- a/NOTICE +++ b/NOTICE @@ -43,8 +43,3 @@ the following terms: Copyright (c) the V8 project authors The 3-Clause BSD License (https://opensource.org/licenses/BSD-3-Clause) - -* Arm Optimized Routines: https://github.com/ARM-software/optimized-routines - - Copyright (c) Arm Limited - The MIT License (https://opensource.org/licenses/MIT) diff --git a/std/assembly/math.ts b/std/assembly/math.ts index ee21fcf160..ecba576614 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -1,12 +1,6 @@ import * as JSMath from "./bindings/Math"; export { JSMath }; -// TODO: Fast methods with lookup tables have some preicision issues so temporary disabled -// import { -// pow_lut, exp_lut, exp2_lut, log_lut, log2_lut, -// powf_lut, expf_lut, exp2f_lut, logf_lut, log2f_lut -// } from "./util/math"; - import { abs as builtin_abs, ceil as builtin_ceil, @@ -782,57 +776,48 @@ export namespace NativeMath { } export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above - // if (ASC_SHRINK_LEVEL < 1) { - // return exp_lut(x); - // } else - { - const - ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01 - ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10 - invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00 - P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01 - P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03 - P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05 - P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06 - P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08 - overflow = reinterpret(0x40862E42FEFA39EF), // 709.782712893383973096 - underflow = reinterpret(0xC0874910D52D3051), // -745.13321910194110842 - Ox1p1023 = reinterpret(0x7FE0000000000000); - let hx = (reinterpret(x) >> 32); - let sign_ = (hx >> 31); - hx &= 0x7FFFFFFF; - if (hx >= 0x4086232B) { - if (isNaN(x)) return x; - if (x > overflow) return x * Ox1p1023; - if (x < underflow) return 0; - } - let hi: f64, lo: f64 = 0; - let k = 0; - if (hx > 0x3FD62E42) { - if (hx >= 0x3FF0A2B2) { - k = (invln2 * x + builtin_copysign(0.5, x)); - } else { - k = 1 - (sign_ << 1); - } - hi = x - k * ln2hi; - lo = k * ln2lo; - x = hi - lo; - } else if (hx > 0x3E300000) { - hi = x; - } else return 1.0 + x; - let xs = x * x; - // var c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5)))); - let xq = xs * xs; - let c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5))); - let y = 1.0 + (x * c / (2 - c) - lo + hi); - return k == 0 ? y : scalbn(y, k); + const + ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01 + ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10 + invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00 + P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01 + P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03 + P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05 + P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06 + P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08 + overflow = reinterpret(0x40862E42FEFA39EF), // 709.782712893383973096 + underflow = reinterpret(0xC0874910D52D3051), // -745.13321910194110842 + Ox1p1023 = reinterpret(0x7FE0000000000000); + var hx = (reinterpret(x) >> 32); + var sign_ = (hx >> 31); + hx &= 0x7FFFFFFF; + if (hx >= 0x4086232B) { + if (isNaN(x)) return x; + if (x > overflow) return x * Ox1p1023; + if (x < underflow) return 0; } + var hi: f64, lo: f64 = 0; + var k = 0; + if (hx > 0x3FD62E42) { + if (hx >= 0x3FF0A2B2) { + k = (invln2 * x + builtin_copysign(0.5, x)); + } else { + k = 1 - (sign_ << 1); + } + hi = x - k * ln2hi; + lo = k * ln2lo; + x = hi - lo; + } else if (hx > 0x3E300000) { + hi = x; + } else return 1.0 + x; + var xs = x * x; + // var c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5)))); + var xq = xs * xs; + var c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5))); + var y = 1.0 + (x * c / (2 - c) - lo + hi); + return k == 0 ? y : scalbn(y, k); } - // export function exp2(x: f64): f64 { - // return exp2_lut(x); - // } - export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above const o_threshold = reinterpret(0x40862E42FEFA39EF), // 7.09782712893383973096e+02 @@ -965,49 +950,44 @@ export namespace NativeMath { } export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above - // if (ASC_SHRINK_LEVEL < 1) { - // return log_lut(x); - // } else - { - const - ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01 - ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10 - Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01 - Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01 - Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01 - Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01 - Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01 - Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01 - Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01 - Ox1p54 = reinterpret(0x4350000000000000); - let u = reinterpret(x); - let hx = (u >> 32); - let k = 0; - if (hx < 0x00100000 || (hx >> 31)) { - if (u << 1 == 0) return -1 / (x * x); - if (hx >> 31) return (x - x) / 0.0; - k -= 54; - x *= Ox1p54; - u = reinterpret(x); - hx = (u >> 32); - } else if (hx >= 0x7FF00000) return x; - else if (hx == 0x3FF00000 && u << 32 == 0) return 0; - hx += 0x3FF00000 - 0x3FE6A09E; - k += (hx >> 20) - 0x3FF; - hx = (hx & 0x000FFFFF) + 0x3FE6A09E; - u = hx << 32 | (u & 0xFFFFFFFF); - x = reinterpret(u); - let f = x - 1.0; - let hfsq = 0.5 * f * f; - let s = f / (2.0 + f); - let z = s * s; - let w = z * z; - let t1 = w * (Lg2 + w * (Lg4 + w * Lg6)); - let t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7))); - let r = t2 + t1; - let dk = k; - return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi; - } + const + ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01 + ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10 + Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01 + Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01 + Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01 + Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01 + Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01 + Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01 + Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01 + Ox1p54 = reinterpret(0x4350000000000000); + var u = reinterpret(x); + var hx = (u >> 32); + var k = 0; + if (hx < 0x00100000 || (hx >> 31)) { + if (u << 1 == 0) return -1 / (x * x); + if (hx >> 31) return (x - x) / 0.0; + k -= 54; + x *= Ox1p54; + u = reinterpret(x); + hx = (u >> 32); + } else if (hx >= 0x7FF00000) return x; + else if (hx == 0x3FF00000 && u << 32 == 0) return 0; + hx += 0x3FF00000 - 0x3FE6A09E; + k += (hx >> 20) - 0x3FF; + hx = (hx & 0x000FFFFF) + 0x3FE6A09E; + u = hx << 32 | (u & 0xFFFFFFFF); + x = reinterpret(u); + var f = x - 1.0; + var hfsq = 0.5 * f * f; + var s = f / (2.0 + f); + var z = s * s; + var w = z * z; + var t1 = w * (Lg2 + w * (Lg4 + w * Lg6)); + var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7))); + var r = t2 + t1; + var dk = k; + return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi; } export function log10(x: f64): f64 { // see: musl/src/math/log10.c and SUN COPYRIGHT NOTICE above @@ -1116,59 +1096,54 @@ export namespace NativeMath { } export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above - // if (ASC_SHRINK_LEVEL < 1) { - // return log2_lut(x); - // } else - { - const - ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00 - ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10 - Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01 - Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01 - Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01 - Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01 - Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01 - Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01 - Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01 - Ox1p54 = reinterpret(0x4350000000000000); - let u = reinterpret(x); - let hx = (u >> 32); - let k = 0; - if (hx < 0x00100000 || (hx >> 31)) { - if (u << 1 == 0) return -1 / (x * x); - if (hx >> 31) return (x - x) / 0.0; - k -= 54; - x *= Ox1p54; - u = reinterpret(x); - hx = (u >> 32); - } else if (hx >= 0x7FF00000) return x; - else if (hx == 0x3FF00000 && u << 32 == 0) return 0; - hx += 0x3FF00000 - 0x3FE6A09E; - k += (hx >> 20) - 0x3FF; - hx = (hx & 0x000FFFFF) + 0x3FE6A09E; - u = hx << 32 | (u & 0xFFFFFFFF); - x = reinterpret(u); - let f = x - 1.0; - let hfsq = 0.5 * f * f; - let s = f / (2.0 + f); - let z = s * s; - let w = z * z; - let t1 = w * (Lg2 + w * (Lg4 + w * Lg6)); - let t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7))); - let r = t2 + t1; - let hi = f - hfsq; - u = reinterpret(hi); - u &= 0xFFFFFFFF00000000; - hi = reinterpret(u); - let lo = f - hi - hfsq + s * (hfsq + r); - let val_hi = hi * ivln2hi; - let val_lo = (lo + hi) * ivln2lo + lo * ivln2hi; - let y = k; - w = y + val_hi; - val_lo += (y - w) + val_hi; - val_hi = w; - return val_lo + val_hi; - } + const + ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00 + ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10 + Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01 + Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01 + Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01 + Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01 + Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01 + Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01 + Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01 + Ox1p54 = reinterpret(0x4350000000000000); + var u = reinterpret(x); + var hx = (u >> 32); + var k = 0; + if (hx < 0x00100000 || (hx >> 31)) { + if (u << 1 == 0) return -1 / (x * x); + if (hx >> 31) return (x - x) / 0.0; + k -= 54; + x *= Ox1p54; + u = reinterpret(x); + hx = (u >> 32); + } else if (hx >= 0x7FF00000) return x; + else if (hx == 0x3FF00000 && u << 32 == 0) return 0; + hx += 0x3FF00000 - 0x3FE6A09E; + k += (hx >> 20) - 0x3FF; + hx = (hx & 0x000FFFFF) + 0x3FE6A09E; + u = hx << 32 | (u & 0xFFFFFFFF); + x = reinterpret(u); + var f = x - 1.0; + var hfsq = 0.5 * f * f; + var s = f / (2.0 + f); + var z = s * s; + var w = z * z; + var t1 = w * (Lg2 + w * (Lg4 + w * Lg6)); + var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7))); + var r = t2 + t1; + var hi = f - hfsq; + u = reinterpret(hi); + u &= 0xFFFFFFFF00000000; + hi = reinterpret(u); + var lo = f - hi - hfsq + s * (hfsq + r); + var val_hi = hi * ivln2hi; + var val_lo = (lo + hi) * ivln2lo + lo * ivln2hi; + var y = k; + w = y + val_hi; + val_lo += (y - w) + val_hi; + val_hi = w; + return val_lo + val_hi; } // @ts-ignore: decorator @@ -1198,208 +1173,203 @@ export namespace NativeMath { if (y == 1.0) return x; if (y == 0.0) return 1.0; } - // if (ASC_SHRINK_LEVEL < 1) { - // return pow_lut(x, y); - // } else - { - const - dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01 - dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08 - two53 = reinterpret(0x4340000000000000), // 9007199254740992.0 - huge = reinterpret(0x7E37E43C8800759C), // 1e+300 - tiny = reinterpret(0x01A56E1FC2F8F359), // 1e-300 - L1 = reinterpret(0x3FE3333333333303), // 5.99999999999994648725e-01 - L2 = reinterpret(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01 - L3 = reinterpret(0x3FD55555518F264D), // 3.33333329818377432918e-01 - L4 = reinterpret(0x3FD17460A91D4101), // 2.72728123808534006489e-01 - L5 = reinterpret(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01 - L6 = reinterpret(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01 - P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01 - P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03 - P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05 - P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06 - P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08 - lg2 = reinterpret(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01 - lg2_h = reinterpret(0x3FE62E4300000000), // 6.93147182464599609375e-01 - lg2_l = reinterpret(0xBE205C610CA86C39), // -1.90465429995776804525e-09 - ovt = reinterpret(0x3C971547652B82FE), // 8.0085662595372944372e-017 - cp = reinterpret(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01 - cp_h = reinterpret(0x3FEEC709E0000000), // 9.61796700954437255859e-01 - cp_l = reinterpret(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09 - ivln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00 - ivln2_h = reinterpret(0x3FF7154760000000), // 1.44269502162933349609e+00 - ivln2_l = reinterpret(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08 - inv3 = reinterpret(0x3FD5555555555555); // 0.3333333333333333333333 - let u_ = reinterpret(x); - let hx = (u_ >> 32); - let lx = u_; - u_ = reinterpret(y); - let hy = (u_ >> 32); - let ly = u_; - let ix = hx & 0x7FFFFFFF; - let iy = hy & 0x7FFFFFFF; - if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN - // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN - if ( // NaN if either arg is NaN - ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) || - iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0) - ) return x + y; - let yisint = 0, k: i32; - if (hx < 0) { - if (iy >= 0x43400000) yisint = 2; - else if (iy >= 0x3FF00000) { - k = (iy >> 20) - 0x3FF; - let offset = select(52, 20, k > 20) - k; - let Ly = select(ly, iy, k > 20); - let jj = Ly >> offset; - if ((jj << offset) == Ly) yisint = 2 - (jj & 1); + const + dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01 + dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08 + two53 = reinterpret(0x4340000000000000), // 9007199254740992.0 + huge = reinterpret(0x7E37E43C8800759C), // 1e+300 + tiny = reinterpret(0x01A56E1FC2F8F359), // 1e-300 + L1 = reinterpret(0x3FE3333333333303), // 5.99999999999994648725e-01 + L2 = reinterpret(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01 + L3 = reinterpret(0x3FD55555518F264D), // 3.33333329818377432918e-01 + L4 = reinterpret(0x3FD17460A91D4101), // 2.72728123808534006489e-01 + L5 = reinterpret(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01 + L6 = reinterpret(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01 + P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01 + P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03 + P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05 + P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06 + P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08 + lg2 = reinterpret(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01 + lg2_h = reinterpret(0x3FE62E4300000000), // 6.93147182464599609375e-01 + lg2_l = reinterpret(0xBE205C610CA86C39), // -1.90465429995776804525e-09 + ovt = reinterpret(0x3C971547652B82FE), // 8.0085662595372944372e-017 + cp = reinterpret(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01 + cp_h = reinterpret(0x3FEEC709E0000000), // 9.61796700954437255859e-01 + cp_l = reinterpret(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09 + ivln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00 + ivln2_h = reinterpret(0x3FF7154760000000), // 1.44269502162933349609e+00 + ivln2_l = reinterpret(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08 + inv3 = reinterpret(0x3FD5555555555555); // 0.3333333333333333333333 + var u_ = reinterpret(x); + var hx = (u_ >> 32); + var lx = u_; + u_ = reinterpret(y); + var hy = (u_ >> 32); + var ly = u_; + var ix = hx & 0x7FFFFFFF; + var iy = hy & 0x7FFFFFFF; + if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN + // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN + if ( // NaN if either arg is NaN + ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) || + iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0) + ) return x + y; + var yisint = 0, k: i32; + if (hx < 0) { + if (iy >= 0x43400000) yisint = 2; + else if (iy >= 0x3FF00000) { + k = (iy >> 20) - 0x3FF; + let offset = select(52, 20, k > 20) - k; + let Ly = select(ly, iy, k > 20); + let jj = Ly >> offset; + if ((jj << offset) == Ly) yisint = 2 - (jj & 1); + } + } + if (ly == 0) { + if (iy == 0x7FF00000) { // y is +-inf + if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN + else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0 + else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf + } + if (iy == 0x3FF00000) { + if (hy >= 0) return x; + return 1 / x; + } + if (hy == 0x40000000) return x * x; + if (hy == 0x3FE00000) { + if (hx >= 0) return builtin_sqrt(x); + } + } + var ax = builtin_abs(x), z: f64; + if (lx == 0) { + if (ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000) { + z = ax; + if (hy < 0) z = 1.0 / z; + if (hx < 0) { + if (((ix - 0x3FF00000) | yisint) == 0) { + let d = z - z; + z = d / d; + } else if (yisint == 1) z = -z; } + return z; } - if (ly == 0) { - if (iy == 0x7FF00000) { // y is +-inf - if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN - else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0 - else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf - } - if (iy == 0x3FF00000) { - if (hy >= 0) return x; - return 1 / x; - } - if (hy == 0x40000000) return x * x; - if (hy == 0x3FE00000) { - if (hx >= 0) return builtin_sqrt(x); - } + } + let s = 1.0; + if (hx < 0) { + if (yisint == 0) { + let d = x - x; + return d / d; } - let ax = builtin_abs(x), z: f64; - if (lx == 0) { - if (ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000) { - z = ax; - if (hy < 0) z = 1.0 / z; - if (hx < 0) { - if (((ix - 0x3FF00000) | yisint) == 0) { - let d = z - z; - z = d / d; - } else if (yisint == 1) z = -z; - } - return z; - } + if (yisint == 1) s = -1.0; + } + var t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64; + var j: i32, n: i32; + if (iy > 0x41E00000) { + if (iy > 0x43F00000) { + if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny; + if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny; } - let s = 1.0; - if (hx < 0) { - if (yisint == 0) { - let d = x - x; - return d / d; - } - if (yisint == 1) s = -1.0; - } - let t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64; - let j: i32, n: i32; - if (iy > 0x41E00000) { - if (iy > 0x43F00000) { - if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny; - if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny; - } - if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny; - if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny; - t = ax - 1.0; - w = (t * t) * (0.5 - t * (inv3 - t * 0.25)); - u = ivln2_h * t; - v = t * ivln2_l - w * ivln2; - t1 = u + v; - t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000); - t2 = v - (t1 - u); - } else { - let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64; - n = 0; - if (ix < 0x00100000) { - ax *= two53; - n -= 53; - ix = (reinterpret(ax) >> 32); - } - n += (ix >> 20) - 0x3FF; - j = ix & 0x000FFFFF; - ix = j | 0x3FF00000; - if (j <= 0x3988E) k = 0; - else if (j < 0xBB67A) k = 1; - else { - k = 0; - n += 1; - ix -= 0x00100000; - } - ax = reinterpret(reinterpret(ax) & 0xFFFFFFFF | (ix << 32)); - let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0 - u = ax - bp; - v = 1.0 / (ax + bp); - ss = u * v; - s_h = ss; - s_h = reinterpret(reinterpret(s_h) & 0xFFFFFFFF00000000); - t_h = reinterpret((((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32); - t_l = ax - (t_h - bp); - s_l = v * ((u - s_h * t_h) - s_h * t_l); - s2 = ss * ss; - r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6))))); - r += s_l * (s_h + ss); - s2 = s_h * s_h; - t_h = 3.0 + s2 + r; - t_h = reinterpret(reinterpret(t_h) & 0xFFFFFFFF00000000); - t_l = r - ((t_h - 3.0) - s2); - u = s_h * t_h; - v = s_l * t_h + t_l * ss; - p_h = u + v; - p_h = reinterpret(reinterpret(p_h) & 0xFFFFFFFF00000000); - p_l = v - (p_h - u); - let z_h = cp_h * p_h; - let dp_l = select(dp_l1, 0.0, k); - let z_l = cp_l * p_h + p_l * cp + dp_l; - t = n; - let dp_h = select(dp_h1, 0.0, k); - t1 = ((z_h + z_l) + dp_h) + t; - t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000); - t2 = z_l - (((t1 - t) - dp_h) - z_h); - } - let y1 = y; - y1 = reinterpret(reinterpret(y1) & 0xFFFFFFFF00000000); - p_l = (y - y1) * t1 + y * t2; - p_h = y1 * t1; - z = p_l + p_h; - u_ = reinterpret(z); - j = (u_ >> 32); - let i = u_; - if (j >= 0x40900000) { - if (((j - 0x40900000) | i) != 0) return s * huge * huge; - if (p_l + ovt > z - p_h) return s * huge * huge; - } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) { - if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny; - if (p_l <= z - p_h) return s * tiny * tiny; - } - i = j & 0x7FFFFFFF; - k = (i >> 20) - 0x3FF; + if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny; + if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny; + t = ax - 1.0; + w = (t * t) * (0.5 - t * (inv3 - t * 0.25)); + u = ivln2_h * t; + v = t * ivln2_l - w * ivln2; + t1 = u + v; + t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000); + t2 = v - (t1 - u); + } else { + let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64; n = 0; - if (i > 0x3FE00000) { - n = j + (0x00100000 >> (k + 1)); - k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF; - t = 0.0; - t = reinterpret((n & ~(0x000FFFFF >> k)) << 32); - n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k); - if (j < 0) n = -n; - p_h -= t; - } - t = p_l + p_h; - t = reinterpret(reinterpret(t) & 0xFFFFFFFF00000000); - u = t * lg2_h; - v = (p_l - (t - p_h)) * lg2 + t * lg2_l; - z = u + v; - w = v - (z - u); - t = z * z; - t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5)))); - r = (z * t1) / (t1 - 2.0) - (w + z * w); - z = 1.0 - (r - z); - j = (reinterpret(z) >> 32); - j += n << 20; - if ((j >> 20) <= 0) z = scalbn(z, n); - else z = reinterpret(reinterpret(z) & 0xFFFFFFFF | (j << 32)); - return s * z; + if (ix < 0x00100000) { + ax *= two53; + n -= 53; + ix = (reinterpret(ax) >> 32); + } + n += (ix >> 20) - 0x3FF; + j = ix & 0x000FFFFF; + ix = j | 0x3FF00000; + if (j <= 0x3988E) k = 0; + else if (j < 0xBB67A) k = 1; + else { + k = 0; + n += 1; + ix -= 0x00100000; + } + ax = reinterpret(reinterpret(ax) & 0xFFFFFFFF | (ix << 32)); + let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0 + u = ax - bp; + v = 1.0 / (ax + bp); + ss = u * v; + s_h = ss; + s_h = reinterpret(reinterpret(s_h) & 0xFFFFFFFF00000000); + t_h = reinterpret((((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32); + t_l = ax - (t_h - bp); + s_l = v * ((u - s_h * t_h) - s_h * t_l); + s2 = ss * ss; + r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6))))); + r += s_l * (s_h + ss); + s2 = s_h * s_h; + t_h = 3.0 + s2 + r; + t_h = reinterpret(reinterpret(t_h) & 0xFFFFFFFF00000000); + t_l = r - ((t_h - 3.0) - s2); + u = s_h * t_h; + v = s_l * t_h + t_l * ss; + p_h = u + v; + p_h = reinterpret(reinterpret(p_h) & 0xFFFFFFFF00000000); + p_l = v - (p_h - u); + let z_h = cp_h * p_h; + let dp_l = select(dp_l1, 0.0, k); + let z_l = cp_l * p_h + p_l * cp + dp_l; + t = n; + let dp_h = select(dp_h1, 0.0, k); + t1 = ((z_h + z_l) + dp_h) + t; + t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000); + t2 = z_l - (((t1 - t) - dp_h) - z_h); + } + var y1 = y; + y1 = reinterpret(reinterpret(y1) & 0xFFFFFFFF00000000); + p_l = (y - y1) * t1 + y * t2; + p_h = y1 * t1; + z = p_l + p_h; + u_ = reinterpret(z); + j = (u_ >> 32); + var i = u_; + if (j >= 0x40900000) { + if (((j - 0x40900000) | i) != 0) return s * huge * huge; + if (p_l + ovt > z - p_h) return s * huge * huge; + } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) { + if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny; + if (p_l <= z - p_h) return s * tiny * tiny; + } + i = j & 0x7FFFFFFF; + k = (i >> 20) - 0x3FF; + n = 0; + if (i > 0x3FE00000) { + n = j + (0x00100000 >> (k + 1)); + k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF; + t = 0.0; + t = reinterpret((n & ~(0x000FFFFF >> k)) << 32); + n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k); + if (j < 0) n = -n; + p_h -= t; } + t = p_l + p_h; + t = reinterpret(reinterpret(t) & 0xFFFFFFFF00000000); + u = t * lg2_h; + v = (p_l - (t - p_h)) * lg2 + t * lg2_l; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5)))); + r = (z * t1) / (t1 - 2.0) - (w + z * w); + z = 1.0 - (r - z); + j = (reinterpret(z) >> 32); + j += n << 20; + if ((j >> 20) <= 0) z = scalbn(z, n); + else z = reinterpret(reinterpret(z) & 0xFFFFFFFF | (j << 32)); + return s * z; } export function seedRandom(value: i64): void { @@ -2237,56 +2207,47 @@ export namespace NativeMathf { } export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above - // if (ASC_SHRINK_LEVEL < 1) { - // return expf_lut(x); - // } else - { - const - ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f - ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f - invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+0f - P1 = reinterpret(0x3E2AAA8F), // 1.6666625440e-1f - P2 = reinterpret(0xBB355215), // -2.7667332906e-3f - Ox1p127f = reinterpret(0x7F000000); - let hx = reinterpret(x); - let sign_ = (hx >> 31); - hx &= 0x7FFFFFFF; - if (hx >= 0x42AEAC50) { - if (hx > 0x7F800000) return x; // NaN - if (hx >= 0x42B17218) { - if (!sign_) return x * Ox1p127f; - else if (hx >= 0x42CFF1B5) return 0; - } + const + ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f + ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f + invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+0f + P1 = reinterpret(0x3E2AAA8F), // 1.6666625440e-1f + P2 = reinterpret(0xBB355215), // -2.7667332906e-3f + Ox1p127f = reinterpret(0x7F000000); + var hx = reinterpret(x); + var sign_ = (hx >> 31); + hx &= 0x7FFFFFFF; + if (hx >= 0x42AEAC50) { + if (hx > 0x7F800000) return x; // NaN + if (hx >= 0x42B17218) { + if (!sign_) return x * Ox1p127f; + else if (hx >= 0x42CFF1B5) return 0; } - let hi: f32, lo: f32; - let k: i32; - if (hx > 0x3EB17218) { - if (hx > 0x3F851592) { - k = (invln2 * x + builtin_copysign(0.5, x)); - } else { - k = 1 - (sign_ << 1); - } - hi = x - k * ln2hi; - lo = k * ln2lo; - x = hi - lo; - } else if (hx > 0x39000000) { - k = 0; - hi = x; - lo = 0; + } + var hi: f32, lo: f32; + var k: i32; + if (hx > 0x3EB17218) { + if (hx > 0x3F851592) { + k = (invln2 * x + builtin_copysign(0.5, x)); } else { - return 1 + x; + k = 1 - (sign_ << 1); } - let xx = x * x; - let c = x - xx * (P1 + xx * P2); - let y: f32 = 1 + (x * c / (2 - c) - lo + hi); - return k == 0 ? y : scalbn(y, k); + hi = x - k * ln2hi; + lo = k * ln2lo; + x = hi - lo; + } else if (hx > 0x39000000) { + k = 0; + hi = x; + lo = 0; + } else { + return 1 + x; } + var xx = x * x; + var c = x - xx * (P1 + xx * P2); + var y: f32 = 1 + (x * c / (2 - c) - lo + hi); + return k == 0 ? y : scalbn(y, k); } - // export function exp2(x: f32): f32 { - // return exp2f_lut(x); - // } - export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above const o_threshold = reinterpret(0x42B17180), // 8.8721679688e+01f @@ -2401,43 +2362,38 @@ export namespace NativeMathf { } export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above - // if (ASC_SHRINK_LEVEL < 1) { - // return logf_lut(x); - // } else - { - const - ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f - ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f - Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f - Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f - Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f - Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f - Ox1p25f = reinterpret(0x4C000000); - let u = reinterpret(x); - let k = 0; - if (u < 0x00800000 || (u >> 31)) { - if (u << 1 == 0) return -1 / (x * x); - if (u >> 31) return (x - x) / 0; - k -= 25; - x *= Ox1p25f; - u = reinterpret(x); - } else if (u >= 0x7F800000) return x; - else if (u == 0x3F800000) return 0; - u += 0x3F800000 - 0x3F3504F3; - k += (u >> 23) - 0x7F; - u = (u & 0x007FFFFF) + 0x3F3504F3; - x = reinterpret(u); - let f = x - 1.0; - let s = f / (2.0 + f); - let z = s * s; - let w = z * z; - let t1 = w * (Lg2 + w * Lg4); - let t2 = z * (Lg1 + w * Lg3); - let r = t2 + t1; - let hfsq = 0.5 * f * f; - let dk = k; - return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi; - } + const + ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f + ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f + Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f + Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f + Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f + Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f + Ox1p25f = reinterpret(0x4C000000); + var u = reinterpret(x); + var k = 0; + if (u < 0x00800000 || (u >> 31)) { + if (u << 1 == 0) return -1 / (x * x); + if (u >> 31) return (x - x) / 0; + k -= 25; + x *= Ox1p25f; + u = reinterpret(x); + } else if (u >= 0x7F800000) return x; + else if (u == 0x3F800000) return 0; + u += 0x3F800000 - 0x3F3504F3; + k += (u >> 23) - 0x7F; + u = (u & 0x007FFFFF) + 0x3F3504F3; + x = reinterpret(u); + var f = x - 1.0; + var s = f / (2.0 + f); + var z = s * s; + var w = z * z; + var t1 = w * (Lg2 + w * Lg4); + var t2 = z * (Lg1 + w * Lg3); + var r = t2 + t1; + var hfsq = 0.5 * f * f; + var dk = k; + return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi; } export function log10(x: f32): f32 { // see: musl/src/math/log10f.c and SUN COPYRIGHT NOTICE above @@ -2529,48 +2485,43 @@ export namespace NativeMathf { } export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above - // if (ASC_SHRINK_LEVEL < 1) { - // return log2f_lut(x); - // } else - { - const - ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f - ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04 - Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f - Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f - Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f - Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f - Ox1p25f = reinterpret(0x4C000000); - let ix = reinterpret(x); - let k: i32 = 0; - if (ix < 0x00800000 || (ix >> 31)) { - if (ix << 1 == 0) return -1 / (x * x); - if (ix >> 31) return (x - x) / 0.0; - k -= 25; - x *= Ox1p25f; - ix = reinterpret(x); - } else if (ix >= 0x7F800000) return x; - else if (ix == 0x3F800000) return 0; - ix += 0x3F800000 - 0x3F3504F3; - k += (ix >> 23) - 0x7F; - ix = (ix & 0x007FFFFF) + 0x3F3504F3; - x = reinterpret(ix); - let f = x - 1.0; - let s = f / (2.0 + f); - let z = s * s; - let w = z * z; - let t1 = w * (Lg2 + w * Lg4); - let t2 = z * (Lg1 + w * Lg3); - let r = t2 + t1; - let hfsq: f32 = 0.5 * f * f; - let hi = f - hfsq; - let u = reinterpret(hi); - u &= 0xFFFFF000; - hi = reinterpret(u); - let lo: f32 = f - hi - hfsq + s * (hfsq + r); - let dk = k; - return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk; - } + const + ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f + ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04 + Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f + Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f + Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f + Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f + Ox1p25f = reinterpret(0x4C000000); + var ix = reinterpret(x); + var k: i32 = 0; + if (ix < 0x00800000 || (ix >> 31)) { + if (ix << 1 == 0) return -1 / (x * x); + if (ix >> 31) return (x - x) / 0.0; + k -= 25; + x *= Ox1p25f; + ix = reinterpret(x); + } else if (ix >= 0x7F800000) return x; + else if (ix == 0x3F800000) return 0; + ix += 0x3F800000 - 0x3F3504F3; + k += (ix >> 23) - 0x7F; + ix = (ix & 0x007FFFFF) + 0x3F3504F3; + x = reinterpret(ix); + var f = x - 1.0; + var s = f / (2.0 + f); + var z = s * s; + var w = z * z; + var t1 = w * (Lg2 + w * Lg4); + var t2 = z * (Lg1 + w * Lg3); + var r = t2 + t1; + var hfsq: f32 = 0.5 * f * f; + var hi = f - hfsq; + var u = reinterpret(hi); + u &= 0xFFFFF000; + hi = reinterpret(u); + var lo: f32 = f - hi - hfsq + s * (hfsq + r); + var dk = k; + return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk; } // @ts-ignore: decorator @@ -2600,7 +2551,6 @@ export namespace NativeMathf { if (y == 1.0) return x; if (y == 0.0) return 1.0; } - // return powf_lut(x, y); const dp_h1 = reinterpret(0x3F15C000), // 5.84960938e-01f dp_l1 = reinterpret(0x35D1CFDC), // 1.56322085e-06f diff --git a/std/assembly/util/math.ts b/std/assembly/util/math.ts deleted file mode 100644 index 4a3735f7a3..0000000000 --- a/std/assembly/util/math.ts +++ /dev/null @@ -1,1935 +0,0 @@ -// -// Lookup data for exp2f -// - -// @ts-ignore: decorator -@inline -const EXP2F_TABLE_BITS = 5; - -// @ts-ignore: decorator -@lazy @inline -const EXP2F_DATA_TAB: StaticArray = [ - // exp2f_data_tab[i] = uint(2^(i/N)) - (i << 52-BITS) - // used for computing 2^(k/N) for an int |k| < 150 N as - // double(tab[k%N] + (k << 52-BITS)) - 0x3FF0000000000000, 0x3FEFD9B0D3158574, 0x3FEFB5586CF9890F, 0x3FEF9301D0125B51, - 0x3FEF72B83C7D517B, 0x3FEF54873168B9AA, 0x3FEF387A6E756238, 0x3FEF1E9DF51FDEE1, - 0x3FEF06FE0A31B715, 0x3FEEF1A7373AA9CB, 0x3FEEDEA64C123422, 0x3FEECE086061892D, - 0x3FEEBFDAD5362A27, 0x3FEEB42B569D4F82, 0x3FEEAB07DD485429, 0x3FEEA47EB03A5585, - 0x3FEEA09E667F3BCD, 0x3FEE9F75E8EC5F74, 0x3FEEA11473EB0187, 0x3FEEA589994CCE13, - 0x3FEEACE5422AA0DB, 0x3FEEB737B0CDC5E5, 0x3FEEC49182A3F090, 0x3FEED503B23E255D, - 0x3FEEE89F995AD3AD, 0x3FEEFF76F2FB5E47, 0x3FEF199BDD85529C, 0x3FEF3720DCEF9069, - 0x3FEF5818DCFBA487, 0x3FEF7C97337B9B5F, 0x3FEFA4AFA2A490DA, 0x3FEFD0765B6E4540 -]; - -// ULP error: 0.502 (nearest rounding.) -// Relative error: 1.69 * 2^-34 in [-1/64, 1/64] (before rounding.) -// Wrong count: 168353 (all nearest rounding wrong results with fma.) -// @ts-ignore: decorator -@inline -export function exp2f_lut(x: f32): f32 { - const - N = 1 << EXP2F_TABLE_BITS, - N_MASK = N - 1, - shift = reinterpret(0x4338000000000000) / N, // 0x1.8p+52 - Ox127f = reinterpret(0x7F000000); - - const - C0 = reinterpret(0x3FAC6AF84B912394), // 0x1.c6af84b912394p-5 - C1 = reinterpret(0x3FCEBFCE50FAC4F3), // 0x1.ebfce50fac4f3p-3 - C2 = reinterpret(0x3FE62E42FF0C52D6); // 0x1.62e42ff0c52d6p-1 - - var xd = x; - var ix = reinterpret(x); - var ux = ix >> 20 & 0x7FF; - if (ux >= 0x430) { - // |x| >= 128 or x is nan. - if (ix == 0xFF800000) return 0; // x == -Inf -> 0 - if (ux >= 0x7F8) return x + x; // x == Inf/NaN -> Inf/NaN - if (x > 0) return x * Ox127f; // x > 0 -> HugeVal (Owerflow) - if (x <= -150) return 0; // x <= -150 -> 0 (Underflow) - } - - // x = k/N + r with r in [-1/(2N), 1/(2N)] and int k. - var kd = xd + shift; - var ki = reinterpret(kd); - var r = xd - (kd - shift); - var t: u64, y: f64, s: f64; - - // exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) - t = load(changetype(EXP2F_DATA_TAB) + ((ki & N_MASK) << alignof())); - t += ki << (52 - EXP2F_TABLE_BITS); - s = reinterpret(t); - y = C2 * r + 1; - y += (C0 * r + C1) * (r * r); - y *= s; - - return y; -} - -// ULP error: 0.502 (nearest rounding.) -// Relative error: 1.69 * 2^-34 in [-ln2/64, ln2/64] (before rounding.) -// Wrong count: 170635 (all nearest rounding wrong results with fma.) -// @ts-ignore: decorator -@inline -export function expf_lut(x: f32): f32 { - const - N = 1 << EXP2F_TABLE_BITS, - N_MASK = N - 1, - shift = reinterpret(0x4338000000000000), // 0x1.8p+52 - InvLn2N = reinterpret(0x3FF71547652B82FE) * N, // 0x1.71547652b82fep+0 - Ox1p127f = reinterpret(0x7F000000); - - const - C0 = reinterpret(0x3FAC6AF84B912394) / N / N / N, // 0x1.c6af84b912394p-5 - C1 = reinterpret(0x3FCEBFCE50FAC4F3) / N / N, // 0x1.ebfce50fac4f3p-3 - C2 = reinterpret(0x3FE62E42FF0C52D6) / N; // 0x1.62e42ff0c52d6p-1 - - var xd = x; - var ix = reinterpret(x); - var ux = ix >> 20 & 0x7FF; - if (ux >= 0x42B) { - // |x| >= 88 or x is nan. - if (ix == 0xFF800000) return 0; // x == -Inf -> 0 - if (ux >= 0x7F8) return x + x; // x == Inf/NaN -> Inf/NaN - if (x > reinterpret(0x42B17217)) return x * Ox1p127f; // x > log(0x1p128) ~= 88.72 -> HugeVal (Owerflow) - if (x < reinterpret(0xC2CFF1B4)) return 0; // x < log(0x1p-150) ~= -103.97 -> 0 (Underflow) - } - - // x*N/Ln2 = k + r with r in [-1/2, 1/2] and int k. - var z = InvLn2N * xd; - - // Round and convert z to int, the result is in [-150*N, 128*N] and - // ideally ties-to-even rule is used, otherwise the magnitude of r - // can be bigger which gives larger approximation error. - var kd = (z + shift); - var ki = reinterpret(kd); - var r = z - (kd - shift); - var s: f64, y: f64, t: u64; - - // exp(x) = 2^(k/N) * 2^(r/N) ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) - t = load(changetype(EXP2F_DATA_TAB) + ((ki & N_MASK) << alignof())); - t += ki << (52 - EXP2F_TABLE_BITS); - s = reinterpret(t); - z = C0 * r + C1; - y = C2 * r + 1; - y += z * (r * r); - y *= s; - - return y; -} - -// -// Lookup data for log2f -// - -// @ts-ignore: decorator -@inline -const LOG2F_TABLE_BITS = 4; - -// @ts-ignore: decorator -@lazy @inline -const LOG2F_DATA_TAB: StaticArray = [ - reinterpret(0x3FF661EC79F8F3BE), reinterpret(0xBFDEFEC65B963019), // 0x1.661ec79f8f3bep+0, -0x1.efec65b963019p-2, - reinterpret(0x3FF571ED4AAF883D), reinterpret(0xBFDB0B6832D4FCA4), // 0x1.571ed4aaf883dp+0, -0x1.b0b6832d4fca4p-2, - reinterpret(0x3FF49539F0F010B0), reinterpret(0xBFD7418B0A1FB77B), // 0x1.49539f0f010bp+0 , -0x1.7418b0a1fb77bp-2, - reinterpret(0x3FF3C995B0B80385), reinterpret(0xBFD39DE91A6DCF7B), // 0x1.3c995b0b80385p+0, -0x1.39de91a6dcf7bp-2, - reinterpret(0x3FF30D190C8864A5), reinterpret(0xBFD01D9BF3F2B631), // 0x1.30d190c8864a5p+0, -0x1.01d9bf3f2b631p-2, - reinterpret(0x3FF25E227B0B8EA0), reinterpret(0xBFC97C1D1B3B7AF0), // 0x1.25e227b0b8eap+0 , -0x1.97c1d1b3b7afp-3 , - reinterpret(0x3FF1BB4A4A1A343F), reinterpret(0xBFC2F9E393AF3C9F), // 0x1.1bb4a4a1a343fp+0, -0x1.2f9e393af3c9fp-3, - reinterpret(0x3FF12358F08AE5BA), reinterpret(0xBFB960CBBF788D5C), // 0x1.12358f08ae5bap+0, -0x1.960cbbf788d5cp-4, - reinterpret(0x3FF0953F419900A7), reinterpret(0xBFAA6F9DB6475FCE), // 0x1.0953f419900a7p+0, -0x1.a6f9db6475fcep-5, - reinterpret(0x3FF0000000000000), 0, // 0x1p+0, 0x0, - reinterpret(0x3FEE608CFD9A47AC), reinterpret(0x3FB338CA9F24F53D), // 0x1.e608cfd9a47acp-1, 0x1.338ca9f24f53dp-4, - reinterpret(0x3FECA4B31F026AA0), reinterpret(0x3FC476A9543891BA), // 0x1.ca4b31f026aap-1 , 0x1.476a9543891bap-3, - reinterpret(0x3FEB2036576AFCE6), reinterpret(0x3FCE840B4AC4E4D2), // 0x1.b2036576afce6p-1, 0x1.e840b4ac4e4d2p-3, - reinterpret(0x3FE9C2D163A1AA2D), reinterpret(0x3FD40645F0C6651C), // 0x1.9c2d163a1aa2dp-1, 0x1.40645f0c6651cp-2, - reinterpret(0x3FE886E6037841ED), reinterpret(0x3FD88E9C2C1B9FF8), // 0x1.886e6037841edp-1, 0x1.88e9c2c1b9ff8p-2, - reinterpret(0x3FE767DCF5534862), reinterpret(0x3FDCE0A44EB17BCC) // 0x1.767dcf5534862p-1, 0x1.ce0a44eb17bccp-2 -]; - -// ULP error: 0.752 (nearest rounding.) -// Relative error: 1.9 * 2^-26 (before rounding.) -// @ts-ignore: decorator -@inline -export function log2f_lut(x: f32): f32 { - const - N_MASK = (1 << LOG2F_TABLE_BITS) - 1, - Ox1p23f = reinterpret(0x4B000000); // 0x1p23f - - const - A0 = reinterpret(0xBFD712B6F70A7E4D), // -0x1.712b6f70a7e4dp-2 - A1 = reinterpret(0x3FDECABF496832E0), // 0x1.ecabf496832ep-2 - A2 = reinterpret(0xBFE715479FFAE3DE), // -0x1.715479ffae3dep-1 - A3 = reinterpret(0x3FF715475F35C8B8); // 0x1.715475f35c8b8p0 - - var ux = reinterpret(x); - // Fix sign of zero with downward rounding when x==1. - // if (WANT_ROUNDING && predict_false(ix == 0x3f800000)) return 0; - if (ux - 0x00800000 >= 0x7F800000 - 0x00800000) { - // x < 0x1p-126 or inf or nan. - if ((ux << 1) == 0) return -Infinity; - if (ux == 0x7F800000) return x; // log2(inf) == inf. - if ((ux >> 31) || (ux << 1) >= 0xFF000000) return (x - x) / (x - x); - // x is subnormal, normalize it. - ux = reinterpret(x * Ox1p23f); - ux -= 23 << 23; - } - // x = 2^k z; where z is in range [OFF,2*OFF] and exact. - // The range is split into N subintervals. - // The ith subinterval contains z and c is near its center. - var tmp = ux - 0x3F330000; - var i = (tmp >> (23 - LOG2F_TABLE_BITS)) & N_MASK; - var top = tmp & 0xFF800000; - var iz = ux - top; - var k = tmp >> 23; - - var invc = load(changetype(LOG2F_DATA_TAB) + (i << (1 + alignof())), 0 << alignof()); - var logc = load(changetype(LOG2F_DATA_TAB) + (i << (1 + alignof())), 1 << alignof()); - var z = reinterpret(iz); - - // log2(x) = log1p(z/c-1)/ln2 + log2(c) + k - var r = z * invc - 1; - var y0 = logc + k; - - // Pipelined polynomial evaluation to approximate log1p(r)/ln2. - var r2 = r * r; - var y = A1 * r + A2; - var p = A3 * r + y0; - y = A0 * r2 + y; - y = y * r2 + p; - - return y; -} - -// -// Lookup data for logf. See: https://git.musl-libc.org/cgit/musl/tree/src/math/logf.c -// - -// @ts-ignore: decorator -@inline -const LOGF_TABLE_BITS = 4; - -// @ts-ignore: decorator -@lazy @inline -const LOGF_DATA_TAB: StaticArray = [ - reinterpret(0x3FF661EC79F8F3BE), reinterpret(0xBFD57BF7808CAADE), // 0x1.661ec79f8f3bep+0, -0x1.57bf7808caadep-2, - reinterpret(0x3FF571ED4AAF883D), reinterpret(0xBFD2BEF0A7C06DDB), // 0x1.571ed4aaf883dp+0, -0x1.2bef0a7c06ddbp-2, - reinterpret(0x3FF49539F0F010B0), reinterpret(0xBFD01EAE7F513A67), // 0x1.49539f0f010bp+0 , -0x1.01eae7f513a67p-2, - reinterpret(0x3FF3C995B0B80385), reinterpret(0xBFCB31D8A68224E9), // 0x1.3c995b0b80385p+0, -0x1.b31d8a68224e9p-3, - reinterpret(0x3FF30D190C8864A5), reinterpret(0xBFC6574F0AC07758), // 0x1.30d190c8864a5p+0, -0x1.6574f0ac07758p-3, - reinterpret(0x3FF25E227B0B8EA0), reinterpret(0xBFC1AA2BC79C8100), // 0x1.25e227b0b8eap+0 , -0x1.1aa2bc79c81p-3 , - reinterpret(0x3FF1BB4A4A1A343F), reinterpret(0xBFBA4E76CE8C0E5E), // 0x1.1bb4a4a1a343fp+0, -0x1.a4e76ce8c0e5ep-4, - reinterpret(0x3FF12358F08AE5BA), reinterpret(0xBFB1973C5A611CCC), // 0x1.12358f08ae5bap+0, -0x1.1973c5a611cccp-4, - reinterpret(0x3FF0953F419900A7), reinterpret(0xBFA252F438E10C1E), // 0x1.0953f419900a7p+0, -0x1.252f438e10c1ep-5, - reinterpret(0x3FF0000000000000), 0, // 0x1p+0, 0, - reinterpret(0x3FEE608CFD9A47AC), reinterpret(0x3FAAA5AA5DF25984), // 0x1.e608cfd9a47acp-1, 0x1.aa5aa5df25984p-5, - reinterpret(0x3FECA4B31F026AA0), reinterpret(0x3FBC5E53AA362EB4), // 0x1.ca4b31f026aap-1 , 0x1.c5e53aa362eb4p-4, - reinterpret(0x3FEB2036576AFCE6), reinterpret(0x3FC526E57720DB08), // 0x1.b2036576afce6p-1, 0x1.526e57720db08p-3, - reinterpret(0x3FE9C2D163A1AA2D), reinterpret(0x3FCBC2860D224770), // 0x1.9c2d163a1aa2dp-1, 0x1.bc2860d22477p-3 , - reinterpret(0x3FE886E6037841ED), reinterpret(0x3FD1058BC8A07EE1), // 0x1.886e6037841edp-1, 0x1.1058bc8a07ee1p-2, - reinterpret(0x3FE767DCF5534862), reinterpret(0x3FD4043057B6EE09) // 0x1.767dcf5534862p-1, 0x1.4043057b6ee09p-2 -]; - -// ULP error: 0.818 (nearest rounding.) -// Relative error: 1.957 * 2^-26 (before rounding.) -// @ts-ignore: decorator -@inline -export function logf_lut(x: f32): f32 { - const - N_MASK = (1 << LOGF_TABLE_BITS) - 1, - Ox1p23f = reinterpret(0x4B000000); // 0x1p23f - - const - Ln2 = reinterpret(0x3FE62E42FEFA39EF), // 0x1.62e42fefa39efp-1; - A0 = reinterpret(0xBFD00EA348B88334), // -0x1.00ea348b88334p-2 - A1 = reinterpret(0x3FD5575B0BE00B6A), // 0x1.5575b0be00b6ap-2 - A2 = reinterpret(0xBFDFFFFEF20A4123); // -0x1.ffffef20a4123p-2 - - var ux = reinterpret(x); - // Fix sign of zero with downward rounding when x==1. - // if (WANT_ROUNDING && ux == 0x3f800000) return 0; - if (ux - 0x00800000 >= 0x7F800000 - 0x00800000) { - // x < 0x1p-126 or inf or nan. - if ((ux << 1) == 0) return -Infinity; - if (ux == 0x7F800000) return x; // log(inf) == inf. - if ((ux >> 31) || (ux << 1) >= 0xFF000000) return (x - x) / (x - x); - // x is subnormal, normalize it. - ux = reinterpret(x * Ox1p23f); - ux -= 23 << 23; - } - // x = 2^k z; where z is in range [OFF,2*OFF] and exact. - // The range is split into N subintervals. - // The ith subinterval contains z and c is near its center. - var tmp = ux - 0x3F330000; - var i = (tmp >> (23 - LOGF_TABLE_BITS)) & N_MASK; - var k = tmp >> 23; - var iz = ux - (tmp & 0x1FF << 23); - - var invc = load(changetype(LOGF_DATA_TAB) + (i << (1 + alignof())), 0 << alignof()); - var logc = load(changetype(LOGF_DATA_TAB) + (i << (1 + alignof())), 1 << alignof()); - - var z = reinterpret(iz); - - // log(x) = log1p(z/c-1) + log(c) + k*Ln2 - var r = z * invc - 1; - var y0 = logc + k * Ln2; - - // Pipelined polynomial evaluation to approximate log1p(r). - var r2 = r * r; - var y = A1 * r + A2; - y = A0 * r2 + y; - y = y * r2 + (y0 + r); - - return y; -} - -// -// Lookup data for powf. See: https://git.musl-libc.org/cgit/musl/tree/src/math/powf.c -// - -// @ts-ignore: decorator -@inline -function zeroinfnanf(ux: u32): bool { - return (ux << 1) - 1 >= (0x7f800000 << 1) - 1; -} - -// Returns 0 if not int, 1 if odd int, 2 if even int. The argument is -// the bit representation of a non-zero finite floating-point value. -// @ts-ignore: decorator -@inline -function checkintf(iy: u32): i32 { - var e = iy >> 23 & 0xFF; - if (e < 0x7F ) return 0; - if (e > 0x7F + 23) return 2; - e = 1 << (0x7F + 23 - e); - if (iy & (e - 1)) return 0; - if (iy & e ) return 1; - return 2; -} - -// Subnormal input is normalized so ix has negative biased exponent. -// Output is multiplied by N (POWF_SCALE) if TOINT_INTRINICS is set. -// @ts-ignore: decorator -@inline -function log2f_inline(ux: u32): f64 { - const N_MASK = (1 << LOG2F_TABLE_BITS) - 1; - - const - A0 = reinterpret(0x3FD27616C9496E0B), // 0x1.27616c9496e0bp-2 - A1 = reinterpret(0xBFD71969A075C67A), // -0x1.71969a075c67ap-2 - A2 = reinterpret(0x3FDEC70A6CA7BADD), // 0x1.ec70a6ca7baddp-2 - A3 = reinterpret(0xBFE7154748BEF6C8), // -0x1.7154748bef6c8p-1 - A4 = reinterpret(0x3FF71547652AB82B); // 0x1.71547652ab82bp+0 - - // x = 2^k z; where z is in range [OFF,2*OFF] and exact. - // The range is split into N subintervals. - // The ith subinterval contains z and c is near its center. - var tmp = ux - 0x3F330000; - var i = ((tmp >> (23 - LOG2F_TABLE_BITS)) & N_MASK); - var top = tmp & 0xFF800000; - var uz = ux - top; - var k = (top >> 23); - - var invc = load(changetype(LOG2F_DATA_TAB) + (i << (1 + alignof())), 0 << alignof()); - var logc = load(changetype(LOG2F_DATA_TAB) + (i << (1 + alignof())), 1 << alignof()); - var z = reinterpret(uz); - - // log2(x) = log1p(z/c-1)/ln2 + log2(c) + k - var r = z * invc - 1; - var y0 = logc + k; - - // Pipelined polynomial evaluation to approximate log1p(r)/ln2. - var y = A0 * r + A1; - var p = A2 * r + A3; - var q = A4 * r + y0; - - r *= r; - q += p * r; - y = y * (r * r) + q; - - return y; -} - -// The output of log2 and thus the input of exp2 is either scaled by N -// (in case of fast toint intrinsics) or not. The unscaled xd must be -// in [-1021,1023], sign_bias sets the sign of the result. -// @ts-ignore: decorator -@inline -function exp2f_inline(xd: f64, signBias: u32): f32 { - const - N = 1 << EXP2F_TABLE_BITS, - N_MASK = N - 1, - shift = reinterpret(0x4338000000000000) / N; // 0x1.8p+52 - - const - C0 = reinterpret(0x3FAC6AF84B912394), // 0x1.c6af84b912394p-5 - C1 = reinterpret(0x3FCEBFCE50FAC4F3), // 0x1.ebfce50fac4f3p-3 - C2 = reinterpret(0x3FE62E42FF0C52D6); // 0x1.62e42ff0c52d6p-1 - - // x = k/N + r with r in [-1/(2N), 1/(2N)] - var kd = (xd + shift); - var ki = reinterpret(kd); - var r = xd - (kd - shift); - var t: u64, z: f64, y: f64, s: f64; - - // exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) - t = load(changetype(EXP2F_DATA_TAB) + ((ki & N_MASK) << alignof())); - t += (ki + signBias) << (52 - EXP2F_TABLE_BITS); - s = reinterpret(t); - z = C0 * r + C1; - y = C2 * r + 1; - y += z * (r * r); - y *= s; - return y; -} - -// @ts-ignore: decorator -@inline -function xflowf(sign: u32, y: f32): f32 { - return select(-y, y, sign) * y; -} - -// @ts-ignore: decorator -@inline -function oflowf(sign: u32): f32 { - return xflowf(sign, reinterpret(0x70000000)); // 0x1p97f -} - -// @ts-ignore: decorator -@inline -function uflowf(sign: u32): f32 { - return xflowf(sign, reinterpret(0x10000000)); // 0x1p-95f -} - -// @ts-ignore: decorator -@inline -export function powf_lut(x: f32, y: f32): f32 { - const - Ox1p23f = reinterpret(0x4B000000), // 0x1p23f - UPPER_LIMIT = reinterpret(0x405FFFFFFFD1D571), // 0x1.fffffffd1d571p+6 - LOWER_LIMIT = -150.0, - SIGN_BIAS = 1 << (EXP2F_TABLE_BITS + 11); - - var signBias: u32 = 0; - var ix = reinterpret(x); - var iy = reinterpret(y); - var ny = 0; - - if (i32(ix - 0x00800000 >= 0x7f800000 - 0x00800000) | (ny = i32(zeroinfnanf(iy)))) { - // Either (x < 0x1p-126 or inf or nan) or (y is 0 or inf or nan). - if (ny) { - if ((iy << 1) == 0) return 1.0; - if (ix == 0x3F800000) return NaN; // original: 1.0 - if ((ix << 1) > (0x7F800000 << 1) || (iy << 1) > (0x7F800000 << 1)) return x + y; - if ((ix << 1) == (0x3F800000 << 1)) return NaN; // original: 1.0 - if (((ix << 1) < (0x3F800000 << 1)) == !(iy >> 31)) return 0; // |x| < 1 && y==inf or |x| > 1 && y==-inf. - return y * y; - } - if (zeroinfnanf(ix)) { - let x2 = x * x; - if ((ix >> 31) && checkintf(iy) == 1) x2 = -x2; - return iy >> 31 ? 1 / x2 : x2; - } - // x and y are non-zero finite. - if (ix >> 31) { - // Finite x < 0. - let yint = checkintf(iy); - if (yint == 0) return (x - x) / (x - x); - if (yint == 1) signBias = SIGN_BIAS; - ix &= 0x7FFFFFFF; - } - if (ix < 0x00800000) { - // Normalize subnormal x so exponent becomes negative. - ix = reinterpret(x * Ox1p23f); - ix &= 0x7FFFFFFF; - ix -= 23 << 23; - } - } - var logx = log2f_inline(ix); - var ylogx = y * logx; // cannot overflow, y is single prec. - if ((reinterpret(ylogx) >> 47 & 0xFFFF) >= 0x80BF) { // reinterpret(126.0) >> 47 - // |y * log(x)| >= 126 - if (ylogx > UPPER_LIMIT) return oflowf(signBias); // overflow - if (ylogx <= LOWER_LIMIT) return uflowf(signBias); // underflow - } - return exp2f_inline(ylogx, signBias); -} - -// -// Lookup data for exp. See: https://git.musl-libc.org/cgit/musl/tree/src/math/exp.c -// - -// @ts-ignore: decorator -@inline -const EXP_TABLE_BITS = 7; - -// @ts-ignore: decorator -@lazy @inline -const EXP_DATA_TAB: StaticArray = [ - 0x0000000000000000, 0x3FF0000000000000, - 0x3C9B3B4F1A88BF6E, 0x3FEFF63DA9FB3335, - 0xBC7160139CD8DC5D, 0x3FEFEC9A3E778061, - 0xBC905E7A108766D1, 0x3FEFE315E86E7F85, - 0x3C8CD2523567F613, 0x3FEFD9B0D3158574, - 0xBC8BCE8023F98EFA, 0x3FEFD06B29DDF6DE, - 0x3C60F74E61E6C861, 0x3FEFC74518759BC8, - 0x3C90A3E45B33D399, 0x3FEFBE3ECAC6F383, - 0x3C979AA65D837B6D, 0x3FEFB5586CF9890F, - 0x3C8EB51A92FDEFFC, 0x3FEFAC922B7247F7, - 0x3C3EBE3D702F9CD1, 0x3FEFA3EC32D3D1A2, - 0xBC6A033489906E0B, 0x3FEF9B66AFFED31B, - 0xBC9556522A2FBD0E, 0x3FEF9301D0125B51, - 0xBC5080EF8C4EEA55, 0x3FEF8ABDC06C31CC, - 0xBC91C923B9D5F416, 0x3FEF829AAEA92DE0, - 0x3C80D3E3E95C55AF, 0x3FEF7A98C8A58E51, - 0xBC801B15EAA59348, 0x3FEF72B83C7D517B, - 0xBC8F1FF055DE323D, 0x3FEF6AF9388C8DEA, - 0x3C8B898C3F1353BF, 0x3FEF635BEB6FCB75, - 0xBC96D99C7611EB26, 0x3FEF5BE084045CD4, - 0x3C9AECF73E3A2F60, 0x3FEF54873168B9AA, - 0xBC8FE782CB86389D, 0x3FEF4D5022FCD91D, - 0x3C8A6F4144A6C38D, 0x3FEF463B88628CD6, - 0x3C807A05B0E4047D, 0x3FEF3F49917DDC96, - 0x3C968EFDE3A8A894, 0x3FEF387A6E756238, - 0x3C875E18F274487D, 0x3FEF31CE4FB2A63F, - 0x3C80472B981FE7F2, 0x3FEF2B4565E27CDD, - 0xBC96B87B3F71085E, 0x3FEF24DFE1F56381, - 0x3C82F7E16D09AB31, 0x3FEF1E9DF51FDEE1, - 0xBC3D219B1A6FBFFA, 0x3FEF187FD0DAD990, - 0x3C8B3782720C0AB4, 0x3FEF1285A6E4030B, - 0x3C6E149289CECB8F, 0x3FEF0CAFA93E2F56, - 0x3C834D754DB0ABB6, 0x3FEF06FE0A31B715, - 0x3C864201E2AC744C, 0x3FEF0170FC4CD831, - 0x3C8FDD395DD3F84A, 0x3FEEFC08B26416FF, - 0xBC86A3803B8E5B04, 0x3FEEF6C55F929FF1, - 0xBC924AEDCC4B5068, 0x3FEEF1A7373AA9CB, - 0xBC9907F81B512D8E, 0x3FEEECAE6D05D866, - 0xBC71D1E83E9436D2, 0x3FEEE7DB34E59FF7, - 0xBC991919B3CE1B15, 0x3FEEE32DC313A8E5, - 0x3C859F48A72A4C6D, 0x3FEEDEA64C123422, - 0xBC9312607A28698A, 0x3FEEDA4504AC801C, - 0xBC58A78F4817895B, 0x3FEED60A21F72E2A, - 0xBC7C2C9B67499A1B, 0x3FEED1F5D950A897, - 0x3C4363ED60C2AC11, 0x3FEECE086061892D, - 0x3C9666093B0664EF, 0x3FEECA41ED1D0057, - 0x3C6ECCE1DAA10379, 0x3FEEC6A2B5C13CD0, - 0x3C93FF8E3F0F1230, 0x3FEEC32AF0D7D3DE, - 0x3C7690CEBB7AAFB0, 0x3FEEBFDAD5362A27, - 0x3C931DBDEB54E077, 0x3FEEBCB299FDDD0D, - 0xBC8F94340071A38E, 0x3FEEB9B2769D2CA7, - 0xBC87DECCDC93A349, 0x3FEEB6DAA2CF6642, - 0xBC78DEC6BD0F385F, 0x3FEEB42B569D4F82, - 0xBC861246EC7B5CF6, 0x3FEEB1A4CA5D920F, - 0x3C93350518FDD78E, 0x3FEEAF4736B527DA, - 0x3C7B98B72F8A9B05, 0x3FEEAD12D497C7FD, - 0x3C9063E1E21C5409, 0x3FEEAB07DD485429, - 0x3C34C7855019C6EA, 0x3FEEA9268A5946B7, - 0x3C9432E62B64C035, 0x3FEEA76F15AD2148, - 0xBC8CE44A6199769F, 0x3FEEA5E1B976DC09, - 0xBC8C33C53BEF4DA8, 0x3FEEA47EB03A5585, - 0xBC845378892BE9AE, 0x3FEEA34634CCC320, - 0xBC93CEDD78565858, 0x3FEEA23882552225, - 0x3C5710AA807E1964, 0x3FEEA155D44CA973, - 0xBC93B3EFBF5E2228, 0x3FEEA09E667F3BCD, - 0xBC6A12AD8734B982, 0x3FEEA012750BDABF, - 0xBC6367EFB86DA9EE, 0x3FEE9FB23C651A2F, - 0xBC80DC3D54E08851, 0x3FEE9F7DF9519484, - 0xBC781F647E5A3ECF, 0x3FEE9F75E8EC5F74, - 0xBC86EE4AC08B7DB0, 0x3FEE9F9A48A58174, - 0xBC8619321E55E68A, 0x3FEE9FEB564267C9, - 0x3C909CCB5E09D4D3, 0x3FEEA0694FDE5D3F, - 0xBC7B32DCB94DA51D, 0x3FEEA11473EB0187, - 0x3C94ECFD5467C06B, 0x3FEEA1ED0130C132, - 0x3C65EBE1ABD66C55, 0x3FEEA2F336CF4E62, - 0xBC88A1C52FB3CF42, 0x3FEEA427543E1A12, - 0xBC9369B6F13B3734, 0x3FEEA589994CCE13, - 0xBC805E843A19FF1E, 0x3FEEA71A4623C7AD, - 0xBC94D450D872576E, 0x3FEEA8D99B4492ED, - 0x3C90AD675B0E8A00, 0x3FEEAAC7D98A6699, - 0x3C8DB72FC1F0EAB4, 0x3FEEACE5422AA0DB, - 0xBC65B6609CC5E7FF, 0x3FEEAF3216B5448C, - 0x3C7BF68359F35F44, 0x3FEEB1AE99157736, - 0xBC93091FA71E3D83, 0x3FEEB45B0B91FFC6, - 0xBC5DA9B88B6C1E29, 0x3FEEB737B0CDC5E5, - 0xBC6C23F97C90B959, 0x3FEEBA44CBC8520F, - 0xBC92434322F4F9AA, 0x3FEEBD829FDE4E50, - 0xBC85CA6CD7668E4B, 0x3FEEC0F170CA07BA, - 0x3C71AFFC2B91CE27, 0x3FEEC49182A3F090, - 0x3C6DD235E10A73BB, 0x3FEEC86319E32323, - 0xBC87C50422622263, 0x3FEECC667B5DE565, - 0x3C8B1C86E3E231D5, 0x3FEED09BEC4A2D33, - 0xBC91BBD1D3BCBB15, 0x3FEED503B23E255D, - 0x3C90CC319CEE31D2, 0x3FEED99E1330B358, - 0x3C8469846E735AB3, 0x3FEEDE6B5579FDBF, - 0xBC82DFCD978E9DB4, 0x3FEEE36BBFD3F37A, - 0x3C8C1A7792CB3387, 0x3FEEE89F995AD3AD, - 0xBC907B8F4AD1D9FA, 0x3FEEEE07298DB666, - 0xBC55C3D956DCAEBA, 0x3FEEF3A2B84F15FB, - 0xBC90A40E3DA6F640, 0x3FEEF9728DE5593A, - 0xBC68D6F438AD9334, 0x3FEEFF76F2FB5E47, - 0xBC91EEE26B588A35, 0x3FEF05B030A1064A, - 0x3C74FFD70A5FDDCD, 0x3FEF0C1E904BC1D2, - 0xBC91BDFBFA9298AC, 0x3FEF12C25BD71E09, - 0x3C736EAE30AF0CB3, 0x3FEF199BDD85529C, - 0x3C8EE3325C9FFD94, 0x3FEF20AB5FFFD07A, - 0x3C84E08FD10959AC, 0x3FEF27F12E57D14B, - 0x3C63CDAF384E1A67, 0x3FEF2F6D9406E7B5, - 0x3C676B2C6C921968, 0x3FEF3720DCEF9069, - 0xBC808A1883CCB5D2, 0x3FEF3F0B555DC3FA, - 0xBC8FAD5D3FFFFA6F, 0x3FEF472D4A07897C, - 0xBC900DAE3875A949, 0x3FEF4F87080D89F2, - 0x3C74A385A63D07A7, 0x3FEF5818DCFBA487, - 0xBC82919E2040220F, 0x3FEF60E316C98398, - 0x3C8E5A50D5C192AC, 0x3FEF69E603DB3285, - 0x3C843A59AC016B4B, 0x3FEF7321F301B460, - 0xBC82D52107B43E1F, 0x3FEF7C97337B9B5F, - 0xBC892AB93B470DC9, 0x3FEF864614F5A129, - 0x3C74B604603A88D3, 0x3FEF902EE78B3FF6, - 0x3C83C5EC519D7271, 0x3FEF9A51FBC74C83, - 0xBC8FF7128FD391F0, 0x3FEFA4AFA2A490DA, - 0xBC8DAE98E223747D, 0x3FEFAF482D8E67F1, - 0x3C8EC3BC41AA2008, 0x3FEFBA1BEE615A27, - 0x3C842B94C3A9EB32, 0x3FEFC52B376BBA97, - 0x3C8A64A931D185EE, 0x3FEFD0765B6E4540, - 0xBC8E37BAE43BE3ED, 0x3FEFDBFDAD9CBE14, - 0x3C77893B4D91CD9D, 0x3FEFE7C1819E90D8, - 0x3C5305C14160CC89, 0x3FEFF3C22B8F71F1 -]; - -// Handle cases that may overflow or underflow when computing the result that -// is scale*(1+TMP) without intermediate rounding. The bit representation of -// scale is in SBITS, however it has a computed exponent that may have -// overflown into the sign bit so that needs to be adjusted before using it as -// a double. (int32_t)KI is the k used in the argument reduction and exponent -// adjustment of scale, positive k here means the result may overflow and -// negative k means the result may underflow. -// @ts-ignore: decorator -@inline -function specialcase(tmp: f64, sbits: u64, ki: u64): f64 { - const - Ox1p_1022 = reinterpret(0x0010000000000000), // 0x1p-1022 - Ox1p1009 = reinterpret(0x7F00000000000000); // 0x1p1009 - - var scale: f64; - if (!(ki & 0x80000000)) { - // k > 0, the exponent of scale might have overflowed by <= 460. - sbits -= u64(1009) << 52; - scale = reinterpret(sbits); - return Ox1p1009 * (scale + scale * tmp); // 0x1p1009 - } - // k < 0, need special care in the subnormal range. - sbits += u64(1022) << 52; - // Note: sbits is signed scale. - scale = reinterpret(sbits); - var y = scale + scale * tmp; - if (abs(y) < 1.0) { - // Round y to the right precision before scaling it into the subnormal - // range to avoid double rounding that can cause 0.5+E/2 ulp error where - // E is the worst-case ulp error outside the subnormal range. So this - // is only useful if the goal is better than 1 ulp worst-case error. - let one = copysign(1.0, y); - let lo = scale - y + scale * tmp; - let hi = one + y; - lo = one - hi + y + lo; - y = (hi + lo) - one; - // Fix the sign of 0. - if (y == 0.0) y = reinterpret(sbits & 0x8000000000000000); - } - return y * Ox1p_1022; -} - -// @ts-ignore: decorator -@inline -export function exp_lut(x: f64): f64 { - const - N = 1 << EXP_TABLE_BITS, - N_MASK = N - 1; - - const - InvLn2N = reinterpret(0x3FF71547652B82FE) * N, // 0x1.71547652b82fep0 - NegLn2hiN = reinterpret(0xBF762E42FEFA0000), // -0x1.62e42fefa0000p-8 - NegLn2loN = reinterpret(0xBD0CF79ABC9E3B3A), // -0x1.cf79abc9e3b3ap-47 - shift = reinterpret(0x4338000000000000); // 0x1.8p52; - - const - C2 = reinterpret(0x3FDFFFFFFFFFFDBD), // __exp_data.poly[0] (0x1.ffffffffffdbdp-2) - C3 = reinterpret(0x3FC555555555543C), // __exp_data.poly[1] (0x1.555555555543cp-3) - C4 = reinterpret(0x3FA55555CF172B91), // __exp_data.poly[2] (0x1.55555cf172b91p-5) - C5 = reinterpret(0x3F81111167A4D017); // __exp_data.poly[3] (0x1.1111167a4d017p-7) - - var ux = reinterpret(x); - var abstop = (ux >> 52 & 0x7FF); - if (abstop - 0x3C9 >= 0x03F) { - if (abstop - 0x3C9 >= 0x80000000) return 1; - if (abstop >= 0x409) { - if (ux == 0xFFF0000000000000) return 0; - if (abstop >= 0x7FF) return 1.0 + x; - return select(0, Infinity, ux >> 63); - } - // Large x is special cased below. - abstop = 0; - } - - // exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)] - // x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N] - var z = InvLn2N * x; - // #if TOINT_INTRINSICS - // kd = roundtoint(z); - // ki = converttoint(z); - // #elif EXP_USE_TOINT_NARROW - // // z - kd is in [-0.5-2^-16, 0.5] in all rounding modes. - // var kd = z + shift; - // var ki = reinterpret(kd) >> 16; - // var kd = ki; - // #else - // z - kd is in [-1, 1] in non-nearest rounding modes. - var kd = z + shift; - var ki = reinterpret(kd); - kd -= shift; -// #endif - var r = x + kd * NegLn2hiN + kd * NegLn2loN; - // 2^(k/N) ~= scale * (1 + tail). - var idx = ((ki & N_MASK) << 1); - var top = ki << (52 - EXP_TABLE_BITS); - - var tail = reinterpret(load(changetype(EXP_DATA_TAB) + (idx << alignof()))); // T[idx] - // This is only a valid scale when -1023*N < k < 1024*N - var sbits = load(changetype(EXP_DATA_TAB) + (idx << alignof()), 1 << alignof()) + top; // T[idx + 1] - // exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (tail + exp(r) - 1). - // Evaluation is optimized assuming superscalar pipelined execution. - var r2 = r * r; - // Without fma the worst case error is 0.25/N ulp larger. - // Worst case error is less than 0.5+1.11/N+(abs poly error * 2^53) ulp. - var tmp = tail + r + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5); - if (abstop == 0) return specialcase(tmp, sbits, ki); - var scale = reinterpret(sbits); - // Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there - // is no spurious underflow here even without fma. - return scale + scale * tmp; -} - -// -// Lookup data for exp2. See: https://git.musl-libc.org/cgit/musl/tree/src/math/exp2.c -// - -// Handle cases that may overflow or underflow when computing the result that -// is scale*(1+TMP) without intermediate rounding. The bit representation of -// scale is in SBITS, however it has a computed exponent that may have -// overflown into the sign bit so that needs to be adjusted before using it as -// a double. (int32_t)KI is the k used in the argument reduction and exponent -// adjustment of scale, positive k here means the result may overflow and -// negative k means the result may underflow. -// @ts-ignore: decorator -@inline -function specialcase2(tmp: f64, sbits: u64, ki: u64): f64 { - const Ox1p_1022 = reinterpret(0x10000000000000); // 0x1p-1022 - var scale: f64; - if ((ki & 0x80000000) == 0) { - // k > 0, the exponent of scale might have overflowed by 1 - sbits -= u64(1) << 52; - scale = reinterpret(sbits); - return 2 * (scale * tmp + scale); - } - // k < 0, need special care in the subnormal range - sbits += u64(1022) << 52; - scale = reinterpret(sbits); - var y = scale * tmp + scale; - if (y < 1.0) { - // Round y to the right precision before scaling it into the subnormal - // range to avoid double rounding that can cause 0.5+E/2 ulp error where - // E is the worst-case ulp error outside the subnormal range. So this - // is only useful if the goal is better than 1 ulp worst-case error. - let hi: f64, lo: f64; - lo = scale - y + scale * tmp; - hi = 1.0 + y; - lo = 1.0 - hi + y + lo; - y = (hi + lo) - 1.0; - } - return y * Ox1p_1022; -} - -// @ts-ignore: decorator -@inline -export function exp2_lut(x: f64): f64 { - const - N = 1 << EXP_TABLE_BITS, - N_MASK = N - 1, - shift = reinterpret(0x4338000000000000) / N; // 0x1.8p52 - - const - C1 = reinterpret(0x3FE62E42FEFA39EF), // 0x1.62e42fefa39efp-1 - C2 = reinterpret(0x3FCEBFBDFF82C424), // 0x1.ebfbdff82c424p-3 - C3 = reinterpret(0x3FAC6B08D70CF4B5), // 0x1.c6b08d70cf4b5p-5 - C4 = reinterpret(0x3F83B2ABD24650CC), // 0x1.3b2abd24650ccp-7 - C5 = reinterpret(0x3F55D7E09B4E3A84); // 0x1.5d7e09b4e3a84p-10 - - var ux = reinterpret(x); - var abstop = (ux >> 52 & 0x7ff); - if (abstop - 0x3C9 >= 0x03F) { - if (abstop - 0x3C9 >= 0x80000000) return 1.0; - if (abstop >= 0x409) { - if (ux == 0xFFF0000000000000) return 0; - if (abstop >= 0x7FF) return 1.0 + x; - if (!(ux >> 63)) return Infinity; - else if (ux >= 0xC090CC0000000000) return 0; - } - if ((ux << 1) > 0x811A000000000000) abstop = 0; // Large x is special cased below. - } - - // exp2(x) = 2^(k/N) * 2^r, with 2^r in [2^(-1/2N),2^(1/2N)]. - // x = k/N + r, with int k and r in [-1/2N, 1/2N] - var kd = x + shift; - var ki = reinterpret(kd); - kd -= shift; // k/N for int k - var r = x - kd; - // 2^(k/N) ~= scale * (1 + tail) - var idx = ((ki & N_MASK) << 1); - var top = ki << (52 - EXP_TABLE_BITS); - - var tail = reinterpret(load(changetype(EXP_DATA_TAB) + (idx << alignof()), 0 << alignof())); // T[idx]) - // This is only a valid scale when -1023*N < k < 1024*N - var sbits = load(changetype(EXP_DATA_TAB) + (idx << alignof()), 1 << alignof()) + top; // T[idx + 1] - // exp2(x) = 2^(k/N) * 2^r ~= scale + scale * (tail + 2^r - 1). - // Evaluation is optimized assuming superscalar pipelined execution - var r2 = r * r; - // Without fma the worst case error is 0.5/N ulp larger. - // Worst case error is less than 0.5+0.86/N+(abs poly error * 2^53) ulp. - var tmp = tail + r * C1 + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5); - if (abstop == 0) return specialcase2(tmp, sbits, ki); - var scale = reinterpret(sbits); - // Note: tmp == 0 or |tmp| > 2^-65 and scale > 2^-928, so there - // is no spurious underflow here even without fma. - return scale * tmp + scale; -} - -// -// Lookup data for log2. See: https://git.musl-libc.org/cgit/musl/tree/src/math/log2.c -// - -// @ts-ignore: decorator -@inline -const LOG2_TABLE_BITS = 6; - -/* Algorithm: - - x = 2^k z - log2(x) = k + log2(c) + log2(z/c) - log2(z/c) = poly(z/c - 1) - -where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls -into the ith one, then table entries are computed as - - tab[i].invc = 1/c - tab[i].logc = (double)log2(c) - tab2[i].chi = (double)c - tab2[i].clo = (double)(c - (double)c) - -where c is near the center of the subinterval and is chosen by trying +-2^29 -floating point invc candidates around 1/center and selecting one for which - - 1) the rounding error in 0x1.8p10 + logc is 0, - 2) the rounding error in z - chi - clo is < 0x1p-64 and - 3) the rounding error in (double)log2(c) is minimized (< 0x1p-68). - -Note: 1) ensures that k + logc can be computed without rounding error, 2) -ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to a -single rounding error when there is no fast fma for z*invc - 1, 3) ensures -that logc + poly(z/c - 1) has small error, however near x == 1 when -|log2(x)| < 0x1p-4, this is not enough so that is special cased. */ - -// @ts-ignore: decorator -@lazy @inline -const LOG2_DATA_TAB1: StaticArray = [ - // invc , logc - reinterpret(0x3FF724286BB1ACF8), reinterpret(0xBFE1095FEECDB000), - reinterpret(0x3FF6E1F766D2CCA1), reinterpret(0xBFE08494BD76D000), - reinterpret(0x3FF6A13D0E30D48A), reinterpret(0xBFE00143AEE8F800), - reinterpret(0x3FF661EC32D06C85), reinterpret(0xBFDEFEC5360B4000), - reinterpret(0x3FF623FA951198F8), reinterpret(0xBFDDFDD91AB7E000), - reinterpret(0x3FF5E75BA4CF026C), reinterpret(0xBFDCFFAE0CC79000), - reinterpret(0x3FF5AC055A214FB8), reinterpret(0xBFDC043811FDA000), - reinterpret(0x3FF571ED0F166E1E), reinterpret(0xBFDB0B67323AE000), - reinterpret(0x3FF53909590BF835), reinterpret(0xBFDA152F5A2DB000), - reinterpret(0x3FF5014FED61ADDD), reinterpret(0xBFD9217F5AF86000), - reinterpret(0x3FF4CAB88E487BD0), reinterpret(0xBFD8304DB0719000), - reinterpret(0x3FF49539B4334FEE), reinterpret(0xBFD74189F9A9E000), - reinterpret(0x3FF460CBDFAFD569), reinterpret(0xBFD6552BB5199000), - reinterpret(0x3FF42D664EE4B953), reinterpret(0xBFD56B23A29B1000), - reinterpret(0x3FF3FB01111DD8A6), reinterpret(0xBFD483650F5FA000), - reinterpret(0x3FF3C995B70C5836), reinterpret(0xBFD39DE937F6A000), - reinterpret(0x3FF3991C4AB6FD4A), reinterpret(0xBFD2BAA1538D6000), - reinterpret(0x3FF3698E0CE099B5), reinterpret(0xBFD1D98340CA4000), - reinterpret(0x3FF33AE48213E7B2), reinterpret(0xBFD0FA853A40E000), - reinterpret(0x3FF30D191985BDB1), reinterpret(0xBFD01D9C32E73000), - reinterpret(0x3FF2E025CAB271D7), reinterpret(0xBFCE857DA2FA6000), - reinterpret(0x3FF2B404CF13CD82), reinterpret(0xBFCCD3C8633D8000), - reinterpret(0x3FF288B02C7CCB50), reinterpret(0xBFCB26034C14A000), - reinterpret(0x3FF25E2263944DE5), reinterpret(0xBFC97C1C2F4FE000), - reinterpret(0x3FF234563D8615B1), reinterpret(0xBFC7D6023F800000), - reinterpret(0x3FF20B46E33EAF38), reinterpret(0xBFC633A71A05E000), - reinterpret(0x3FF1E2EEFDCDA3DD), reinterpret(0xBFC494F5E9570000), - reinterpret(0x3FF1BB4A580B3930), reinterpret(0xBFC2F9E424E0A000), - reinterpret(0x3FF19453847F2200), reinterpret(0xBFC162595AFDC000), - reinterpret(0x3FF16E06C0D5D73C), reinterpret(0xBFBF9C9A75BD8000), - reinterpret(0x3FF1485F47B7E4C2), reinterpret(0xBFBC7B575BF9C000), - reinterpret(0x3FF12358AD0085D1), reinterpret(0xBFB960C60FF48000), - reinterpret(0x3FF0FEF00F532227), reinterpret(0xBFB64CE247B60000), - reinterpret(0x3FF0DB2077D03A8F), reinterpret(0xBFB33F78B2014000), - reinterpret(0x3FF0B7E6D65980D9), reinterpret(0xBFB0387D1A42C000), - reinterpret(0x3FF0953EFE7B408D), reinterpret(0xBFAA6F9208B50000), - reinterpret(0x3FF07325CAC53B83), reinterpret(0xBFA47A954F770000), - reinterpret(0x3FF05197E40D1B5C), reinterpret(0xBF9D23A8C50C0000), - reinterpret(0x3FF03091C1208EA2), reinterpret(0xBF916A2629780000), - reinterpret(0x3FF0101025B37E21), reinterpret(0xBF7720F8D8E80000), - reinterpret(0x3FEFC07EF9CAA76B), reinterpret(0x3F86FE53B1500000), - reinterpret(0x3FEF4465D3F6F184), reinterpret(0x3FA11CCCE10F8000), - reinterpret(0x3FEECC079F84107F), reinterpret(0x3FAC4DFC8C8B8000), - reinterpret(0x3FEE573A99975AE8), reinterpret(0x3FB3AA321E574000), - reinterpret(0x3FEDE5D6F0BD3DE6), reinterpret(0x3FB918A0D08B8000), - reinterpret(0x3FED77B681FF38B3), reinterpret(0x3FBE72E9DA044000), - reinterpret(0x3FED0CB5724DE943), reinterpret(0x3FC1DCD2507F6000), - reinterpret(0x3FECA4B2DC0E7563), reinterpret(0x3FC476AB03DEA000), - reinterpret(0x3FEC3F8EE8D6CB51), reinterpret(0x3FC7074377E22000), - reinterpret(0x3FEBDD2B4F020C4C), reinterpret(0x3FC98EDE8BA94000), - reinterpret(0x3FEB7D6C006015CA), reinterpret(0x3FCC0DB86AD2E000), - reinterpret(0x3FEB20366E2E338F), reinterpret(0x3FCE840AAFCEE000), - reinterpret(0x3FEAC57026295039), reinterpret(0x3FD0790AB4678000), - reinterpret(0x3FEA6D01BC2731DD), reinterpret(0x3FD1AC056801C000), - reinterpret(0x3FEA16D3BC3FF18B), reinterpret(0x3FD2DB11D4FEE000), - reinterpret(0x3FE9C2D14967FEAD), reinterpret(0x3FD406464EC58000), - reinterpret(0x3FE970E4F47C9902), reinterpret(0x3FD52DBE093AF000), - reinterpret(0x3FE920FB3982BCF2), reinterpret(0x3FD651902050D000), - reinterpret(0x3FE8D30187F759F1), reinterpret(0x3FD771D2CDEAF000), - reinterpret(0x3FE886E5EBB9F66D), reinterpret(0x3FD88E9C857D9000), - reinterpret(0x3FE83C97B658B994), reinterpret(0x3FD9A80155E16000), - reinterpret(0x3FE7F405FFC61022), reinterpret(0x3FDABE186ED3D000), - reinterpret(0x3FE7AD22181415CA), reinterpret(0x3FDBD0F2AEA0E000), - reinterpret(0x3FE767DCF99EFF8C), reinterpret(0x3FDCE0A43DBF4000) -]; - -// @ts-ignore: decorator -@lazy @inline -const LOG2_DATA_TAB2: StaticArray = [ - // chi , clo - reinterpret(0x3FE6200012B90A8E), reinterpret(0x3C8904AB0644B605), - reinterpret(0x3FE66000045734A6), reinterpret(0x3C61FF9BEA62F7A9), - reinterpret(0x3FE69FFFC325F2C5), reinterpret(0x3C827ECFCB3C90BA), - reinterpret(0x3FE6E00038B95A04), reinterpret(0x3C88FF8856739326), - reinterpret(0x3FE71FFFE09994E3), reinterpret(0x3C8AFD40275F82B1), - reinterpret(0x3FE7600015590E10), reinterpret(0xBC72FD75B4238341), - reinterpret(0x3FE7A00012655BD5), reinterpret(0x3C7808E67C242B76), - reinterpret(0x3FE7E0003259E9A6), reinterpret(0xBC6208E426F622B7), - reinterpret(0x3FE81FFFEDB4B2D2), reinterpret(0xBC8402461EA5C92F), - reinterpret(0x3FE860002DFAFCC3), reinterpret(0x3C6DF7F4A2F29A1F), - reinterpret(0x3FE89FFFF78C6B50), reinterpret(0xBC8E0453094995FD), - reinterpret(0x3FE8E00039671566), reinterpret(0xBC8A04F3BEC77B45), - reinterpret(0x3FE91FFFE2BF1745), reinterpret(0xBC77FA34400E203C), - reinterpret(0x3FE95FFFCC5C9FD1), reinterpret(0xBC76FF8005A0695D), - reinterpret(0x3FE9A0003BBA4767), reinterpret(0x3C70F8C4C4EC7E03), - reinterpret(0x3FE9DFFFE7B92DA5), reinterpret(0x3C8E7FD9478C4602), - reinterpret(0x3FEA1FFFD72EFDAF), reinterpret(0xBC6A0C554DCDAE7E), - reinterpret(0x3FEA5FFFDE04FF95), reinterpret(0x3C867DA98CE9B26B), - reinterpret(0x3FEA9FFFCA5E8D2B), reinterpret(0xBC8284C9B54C13DE), - reinterpret(0x3FEADFFFDDAD03EA), reinterpret(0x3C5812C8EA602E3C), - reinterpret(0x3FEB1FFFF10D3D4D), reinterpret(0xBC8EFADDAD27789C), - reinterpret(0x3FEB5FFFCE21165A), reinterpret(0x3C53CB1719C61237), - reinterpret(0x3FEB9FFFD950E674), reinterpret(0x3C73F7D94194CE00), - reinterpret(0x3FEBE000139CA8AF), reinterpret(0x3C750AC4215D9BC0), - reinterpret(0x3FEC20005B46DF99), reinterpret(0x3C6BEEA653E9C1C9), - reinterpret(0x3FEC600040B9F7AE), reinterpret(0xBC7C079F274A70D6), - reinterpret(0x3FECA0006255FD8A), reinterpret(0xBC7A0B4076E84C1F), - reinterpret(0x3FECDFFFD94C095D), reinterpret(0x3C88F933F99AB5D7), - reinterpret(0x3FED1FFFF975D6CF), reinterpret(0xBC582C08665FE1BE), - reinterpret(0x3FED5FFFA2561C93), reinterpret(0xBC7B04289BD295F3), - reinterpret(0x3FED9FFF9D228B0C), reinterpret(0x3C870251340FA236), - reinterpret(0x3FEDE00065BC7E16), reinterpret(0xBC75011E16A4D80C), - reinterpret(0x3FEE200002F64791), reinterpret(0x3C89802F09EF62E0), - reinterpret(0x3FEE600057D7A6D8), reinterpret(0xBC7E0B75580CF7FA), - reinterpret(0x3FEEA00027EDC00C), reinterpret(0xBC8C848309459811), - reinterpret(0x3FEEE0006CF5CB7C), reinterpret(0xBC8F8027951576F4), - reinterpret(0x3FEF2000782B7DCC), reinterpret(0xBC8F81D97274538F), - reinterpret(0x3FEF6000260C450A), reinterpret(0xBC4071002727FFDC), - reinterpret(0x3FEF9FFFE88CD533), reinterpret(0xBC581BDCE1FDA8B0), - reinterpret(0x3FEFDFFFD50F8689), reinterpret(0x3C87F91ACB918E6E), - reinterpret(0x3FF0200004292367), reinterpret(0x3C9B7FF365324681), - reinterpret(0x3FF05FFFE3E3D668), reinterpret(0x3C86FA08DDAE957B), - reinterpret(0x3FF0A0000A85A757), reinterpret(0xBC57E2DE80D3FB91), - reinterpret(0x3FF0E0001A5F3FCC), reinterpret(0xBC91823305C5F014), - reinterpret(0x3FF11FFFF8AFBAF5), reinterpret(0xBC8BFABB6680BAC2), - reinterpret(0x3FF15FFFE54D91AD), reinterpret(0xBC9D7F121737E7EF), - reinterpret(0x3FF1A00011AC36E1), reinterpret(0x3C9C000A0516F5FF), - reinterpret(0x3FF1E00019C84248), reinterpret(0xBC9082FBE4DA5DA0), - reinterpret(0x3FF220000FFE5E6E), reinterpret(0xBC88FDD04C9CFB43), - reinterpret(0x3FF26000269FD891), reinterpret(0x3C8CFE2A7994D182), - reinterpret(0x3FF2A00029A6E6DA), reinterpret(0xBC700273715E8BC5), - reinterpret(0x3FF2DFFFE0293E39), reinterpret(0x3C9B7C39DAB2A6F9), - reinterpret(0x3FF31FFFF7DCF082), reinterpret(0x3C7DF1336EDC5254), - reinterpret(0x3FF35FFFF05A8B60), reinterpret(0xBC9E03564CCD31EB), - reinterpret(0x3FF3A0002E0EAECC), reinterpret(0x3C75F0E74BD3A477), - reinterpret(0x3FF3E000043BB236), reinterpret(0x3C9C7DCB149D8833), - reinterpret(0x3FF4200002D187FF), reinterpret(0x3C7E08AFCF2D3D28), - reinterpret(0x3FF460000D387CB1), reinterpret(0x3C820837856599A6), - reinterpret(0x3FF4A00004569F89), reinterpret(0xBC89FA5C904FBCD2), - reinterpret(0x3FF4E000043543F3), reinterpret(0xBC781125ED175329), - reinterpret(0x3FF51FFFCC027F0F), reinterpret(0x3C9883D8847754DC), - reinterpret(0x3FF55FFFFD87B36F), reinterpret(0xBC8709E731D02807), - reinterpret(0x3FF59FFFF21DF7BA), reinterpret(0x3C87F79F68727B02), - reinterpret(0x3FF5DFFFEBFC3481), reinterpret(0xBC9180902E30E93E) -]; - -// @ts-ignore: decorator -@inline -export function log2_lut(x: f64): f64 { - const N_MASK = (1 << LOG2_TABLE_BITS) - 1; - - const - LO: u64 = 0x3FEEA4AF00000000, // reinterpret(1.0 - 0x1.5b51p-5) - HI: u64 = 0x3FF0B55900000000; // reinterpret(1.0 + 0x1.6ab2p-5) - - const - InvLn2hi = reinterpret(0x3FF7154765200000), // 0x1.7154765200000p+0 - InvLn2lo = reinterpret(0x3DE705FC2EEFA200), // 0x1.705fc2eefa200p-33 - Ox1p52 = reinterpret(0x4330000000000000); // 0x1p52 - - const - B0 = reinterpret(0xBFE71547652B82FE), // -0x1.71547652b82fep-1 - B1 = reinterpret(0x3FDEC709DC3A03F7), // 0x1.ec709dc3a03f7p-2 - B2 = reinterpret(0xBFD71547652B7C3F), // -0x1.71547652b7c3fp-2 - B3 = reinterpret(0x3FD2776C50F05BE4), // 0x1.2776c50f05be4p-2 - B4 = reinterpret(0xBFCEC709DD768FE5), // -0x1.ec709dd768fe5p-3 - B5 = reinterpret(0x3FCA61761EC4E736), // 0x1.a61761ec4e736p-3 - B6 = reinterpret(0xBFC7153FBC64A79B), // -0x1.7153fbc64a79bp-3 - B7 = reinterpret(0x3FC484D154F01B4A), // 0x1.484d154f01b4ap-3 - B8 = reinterpret(0xBFC289E4A72C383C), // -0x1.289e4a72c383cp-3 - B9 = reinterpret(0x3FC0B32F285AEE66); // 0x1.0b32f285aee66p-3 - - const - A0 = reinterpret(0xBFE71547652B8339), // -0x1.71547652b8339p-1 - A1 = reinterpret(0x3FDEC709DC3A04BE), // 0x1.ec709dc3a04bep-2 - A2 = reinterpret(0xBFD7154764702FFB), // -0x1.7154764702ffbp-2 - A3 = reinterpret(0x3FD2776C50034C48), // 0x1.2776c50034c48p-2 - A4 = reinterpret(0xBFCEC7B328EA92BC), // -0x1.ec7b328ea92bcp-3 - A5 = reinterpret(0x3FCA6225E117F92E); // 0x1.a6225e117f92ep-3 - - var ix = reinterpret(x); - if (ix - LO < HI - LO) { - let r = x - 1.0; -// #if __FP_FAST_FMA -// hi = r * InvLn2hi; -// lo = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -hi); -// #else - let rhi = reinterpret(reinterpret(r) & 0xFFFFFFFF00000000); - let rlo = r - rhi; - let hi = rhi * InvLn2hi; - let lo = rlo * InvLn2hi + r * InvLn2lo; -// #endif - let r2 = r * r; // rounding error: 0x1p-62 - let r4 = r2 * r2; - // Worst-case error is less than 0.54 ULP (0.55 ULP without fma) - let p = r2 * (B0 + r * B1); - let y = hi + p; - lo += hi - y + p; - lo += r4 * (B2 + r * B3 + r2 * (B4 + r * B5) + - r4 * (B6 + r * B7 + r2 * (B8 + r * B9))); - return y + lo; - } - var top = (ix >> 48); - if (top - 0x0010 >= 0x7ff0 - 0x0010) { - // x < 0x1p-1022 or inf or nan. - if ((ix << 1) == 0) return -1.0 / (x * x); - if (ix == 0x7FF0000000000000) return x; // log(inf) == inf - if ((top & 0x8000) || (top & 0x7FF0) == 0x7FF0) return (x - x) / (x - x); - // x is subnormal, normalize it. - ix = reinterpret(x * Ox1p52); - ix -= u64(52) << 52; - } - - // x = 2^k z; where z is in range [OFF,2*OFF) and exact. - // The range is split into N subintervals. - // The ith subinterval contains z and c is near its center. - var tmp = ix - 0x3FE6000000000000; - var i = ((tmp >> (52 - LOG2_TABLE_BITS)) & N_MASK); - var k = tmp >> 52; - var iz = ix - (tmp & 0xFFF0000000000000); - - var invc = load(changetype(LOG2_DATA_TAB1) + (i << (1 + alignof())), 0 << alignof()); // T[i].invc; - var logc = load(changetype(LOG2_DATA_TAB1) + (i << (1 + alignof())), 1 << alignof()); // T[i].logc; - var z = reinterpret(iz); - var kd = k; - - // log2(x) = log2(z/c) + log2(c) + k. - // r ~= z/c - 1, |r| < 1/(2*N). -// #if __FP_FAST_FMA -// // rounding error: 0x1p-55/N. -// r = __builtin_fma(z, invc, -1.0); -// t1 = r * InvLn2hi; -// t2 = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -t1); -// #else - // rounding error: 0x1p-55/N + 0x1p-65. - var chi = load(changetype(LOG2_DATA_TAB2) + (i << (1 + alignof())), 0 << alignof()); // T[i].chi; - var clo = load(changetype(LOG2_DATA_TAB2) + (i << (1 + alignof())), 1 << alignof()); // T[i].clo; - - var r = (z - chi - clo) * invc; - var rhi = reinterpret(reinterpret(r) & 0xFFFFFFFF00000000); - var rlo = r - rhi; - var t1 = rhi * InvLn2hi; - var t2 = rlo * InvLn2hi + r * InvLn2lo; -// #endif - - // hi + lo = r/ln2 + log2(c) + k - var t3 = kd + logc; - var hi = t3 + t1; - var lo = t3 - hi + t1 + t2; - - // log2(r+1) = r/ln2 + r^2*poly(r) - // Evaluation is optimized assuming superscalar pipelined execution - var r2 = r * r; // rounding error: 0x1p-54/N^2 - // Worst-case error if |y| > 0x1p-4: 0.547 ULP (0.550 ULP without fma). - // ~ 0.5 + 2/N/ln2 + abs-poly-error*0x1p56 ULP (+ 0.003 ULP without fma). - var p = A0 + r * A1 + r2 * (A2 + r * A3) + (r2 * r2) * (A4 + r * A5); - return lo + r2 * p + hi; -} - -// -// Lookup data for log. See: https://git.musl-libc.org/cgit/musl/tree/src/math/log.c -// - -// @ts-ignore: decorator -@inline -const LOG_TABLE_BITS = 7; - -/* Algorithm: - - x = 2^k z - log(x) = k ln2 + log(c) + log(z/c) - log(z/c) = poly(z/c - 1) - -where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls -into the ith one, then table entries are computed as - - tab[i].invc = 1/c - tab[i].logc = (double)log(c) - tab2[i].chi = (double)c - tab2[i].clo = (double)(c - (double)c) - -where c is near the center of the subinterval and is chosen by trying +-2^29 -floating point invc candidates around 1/center and selecting one for which - - 1) the rounding error in 0x1.8p9 + logc is 0, - 2) the rounding error in z - chi - clo is < 0x1p-66 and - 3) the rounding error in (double)log(c) is minimized (< 0x1p-66). - -Note: 1) ensures that k*ln2hi + logc can be computed without rounding error, -2) ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to -a single rounding error when there is no fast fma for z*invc - 1, 3) ensures -that logc + poly(z/c - 1) has small error, however near x == 1 when -|log(x)| < 0x1p-4, this is not enough so that is special cased.*/ - -// @ts-ignore: decorator -@lazy @inline -const LOG_DATA_TAB1: StaticArray = [ - // invc , logc - reinterpret(0x3FF734F0C3E0DE9F), reinterpret(0xBFD7CC7F79E69000), - reinterpret(0x3FF713786A2CE91F), reinterpret(0xBFD76FEEC20D0000), - reinterpret(0x3FF6F26008FAB5A0), reinterpret(0xBFD713E31351E000), - reinterpret(0x3FF6D1A61F138C7D), reinterpret(0xBFD6B85B38287800), - reinterpret(0x3FF6B1490BC5B4D1), reinterpret(0xBFD65D5590807800), - reinterpret(0x3FF69147332F0CBA), reinterpret(0xBFD602D076180000), - reinterpret(0x3FF6719F18224223), reinterpret(0xBFD5A8CA86909000), - reinterpret(0x3FF6524F99A51ED9), reinterpret(0xBFD54F4356035000), - reinterpret(0x3FF63356AA8F24C4), reinterpret(0xBFD4F637C36B4000), - reinterpret(0x3FF614B36B9DDC14), reinterpret(0xBFD49DA7FDA85000), - reinterpret(0x3FF5F66452C65C4C), reinterpret(0xBFD445923989A800), - reinterpret(0x3FF5D867B5912C4F), reinterpret(0xBFD3EDF439B0B800), - reinterpret(0x3FF5BABCCB5B90DE), reinterpret(0xBFD396CE448F7000), - reinterpret(0x3FF59D61F2D91A78), reinterpret(0xBFD3401E17BDA000), - reinterpret(0x3FF5805612465687), reinterpret(0xBFD2E9E2EF468000), - reinterpret(0x3FF56397CEE76BD3), reinterpret(0xBFD2941B3830E000), - reinterpret(0x3FF54725E2A77F93), reinterpret(0xBFD23EC58CDA8800), - reinterpret(0x3FF52AFF42064583), reinterpret(0xBFD1E9E129279000), - reinterpret(0x3FF50F22DBB2BDDF), reinterpret(0xBFD1956D2B48F800), - reinterpret(0x3FF4F38F4734DED7), reinterpret(0xBFD141679AB9F800), - reinterpret(0x3FF4D843CFDE2840), reinterpret(0xBFD0EDD094EF9800), - reinterpret(0x3FF4BD3EC078A3C8), reinterpret(0xBFD09AA518DB1000), - reinterpret(0x3FF4A27FC3E0258A), reinterpret(0xBFD047E65263B800), - reinterpret(0x3FF4880524D48434), reinterpret(0xBFCFEB224586F000), - reinterpret(0x3FF46DCE1B192D0B), reinterpret(0xBFCF474A7517B000), - reinterpret(0x3FF453D9D3391854), reinterpret(0xBFCEA4443D103000), - reinterpret(0x3FF43A2744B4845A), reinterpret(0xBFCE020D44E9B000), - reinterpret(0x3FF420B54115F8FB), reinterpret(0xBFCD60A22977F000), - reinterpret(0x3FF40782DA3EF4B1), reinterpret(0xBFCCC00104959000), - reinterpret(0x3FF3EE8F5D57FE8F), reinterpret(0xBFCC202956891000), - reinterpret(0x3FF3D5D9A00B4CE9), reinterpret(0xBFCB81178D811000), - reinterpret(0x3FF3BD60C010C12B), reinterpret(0xBFCAE2C9CCD3D000), - reinterpret(0x3FF3A5242B75DAB8), reinterpret(0xBFCA45402E129000), - reinterpret(0x3FF38D22CD9FD002), reinterpret(0xBFC9A877681DF000), - reinterpret(0x3FF3755BC5847A1C), reinterpret(0xBFC90C6D69483000), - reinterpret(0x3FF35DCE49AD36E2), reinterpret(0xBFC87120A645C000), - reinterpret(0x3FF34679984DD440), reinterpret(0xBFC7D68FB4143000), - reinterpret(0x3FF32F5CCEFFCB24), reinterpret(0xBFC73CB83C627000), - reinterpret(0x3FF3187775A10D49), reinterpret(0xBFC6A39A9B376000), - reinterpret(0x3FF301C8373E3990), reinterpret(0xBFC60B3154B7A000), - reinterpret(0x3FF2EB4EBB95F841), reinterpret(0xBFC5737D76243000), - reinterpret(0x3FF2D50A0219A9D1), reinterpret(0xBFC4DC7B8FC23000), - reinterpret(0x3FF2BEF9A8B7FD2A), reinterpret(0xBFC4462C51D20000), - reinterpret(0x3FF2A91C7A0C1BAB), reinterpret(0xBFC3B08ABC830000), - reinterpret(0x3FF293726014B530), reinterpret(0xBFC31B996B490000), - reinterpret(0x3FF27DFA5757A1F5), reinterpret(0xBFC2875490A44000), - reinterpret(0x3FF268B39B1D3BBF), reinterpret(0xBFC1F3B9F879A000), - reinterpret(0x3FF2539D838FF5BD), reinterpret(0xBFC160C8252CA000), - reinterpret(0x3FF23EB7AAC9083B), reinterpret(0xBFC0CE7F57F72000), - reinterpret(0x3FF22A012BA940B6), reinterpret(0xBFC03CDC49FEA000), - reinterpret(0x3FF2157996CC4132), reinterpret(0xBFBF57BDBC4B8000), - reinterpret(0x3FF201201DD2FC9B), reinterpret(0xBFBE370896404000), - reinterpret(0x3FF1ECF4494D480B), reinterpret(0xBFBD17983EF94000), - reinterpret(0x3FF1D8F5528F6569), reinterpret(0xBFBBF9674ED8A000), - reinterpret(0x3FF1C52311577E7C), reinterpret(0xBFBADC79202F6000), - reinterpret(0x3FF1B17C74CB26E9), reinterpret(0xBFB9C0C3E7288000), - reinterpret(0x3FF19E010C2C1AB6), reinterpret(0xBFB8A646B372C000), - reinterpret(0x3FF18AB07BB670BD), reinterpret(0xBFB78D01B3AC0000), - reinterpret(0x3FF1778A25EFBCB6), reinterpret(0xBFB674F145380000), - reinterpret(0x3FF1648D354C31DA), reinterpret(0xBFB55E0E6D878000), - reinterpret(0x3FF151B990275FDD), reinterpret(0xBFB4485CDEA1E000), - reinterpret(0x3FF13F0EA432D24C), reinterpret(0xBFB333D94D6AA000), - reinterpret(0x3FF12C8B7210F9DA), reinterpret(0xBFB22079F8C56000), - reinterpret(0x3FF11A3028ECB531), reinterpret(0xBFB10E4698622000), - reinterpret(0x3FF107FBDA8434AF), reinterpret(0xBFAFFA6C6AD20000), - reinterpret(0x3FF0F5EE0F4E6BB3), reinterpret(0xBFADDA8D4A774000), - reinterpret(0x3FF0E4065D2A9FCE), reinterpret(0xBFABBCECE4850000), - reinterpret(0x3FF0D244632CA521), reinterpret(0xBFA9A1894012C000), - reinterpret(0x3FF0C0A77CE2981A), reinterpret(0xBFA788583302C000), - reinterpret(0x3FF0AF2F83C636D1), reinterpret(0xBFA5715E67D68000), - reinterpret(0x3FF09DDB98A01339), reinterpret(0xBFA35C8A49658000), - reinterpret(0x3FF08CABAF52E7DF), reinterpret(0xBFA149E364154000), - reinterpret(0x3FF07B9F2F4E28FB), reinterpret(0xBF9E72C082EB8000), - reinterpret(0x3FF06AB58C358F19), reinterpret(0xBF9A55F152528000), - reinterpret(0x3FF059EEA5ECF92C), reinterpret(0xBF963D62CF818000), - reinterpret(0x3FF04949CDD12C90), reinterpret(0xBF9228FB8CAA0000), - reinterpret(0x3FF038C6C6F0ADA9), reinterpret(0xBF8C317B20F90000), - reinterpret(0x3FF02865137932A9), reinterpret(0xBF8419355DAA0000), - reinterpret(0x3FF0182427EA7348), reinterpret(0xBF781203C2EC0000), - reinterpret(0x3FF008040614B195), reinterpret(0xBF60040979240000), - reinterpret(0x3FEFE01FF726FA1A), reinterpret(0x3F6FEFF384900000), - reinterpret(0x3FEFA11CC261EA74), reinterpret(0x3F87DC41353D0000), - reinterpret(0x3FEF6310B081992E), reinterpret(0x3F93CEA3C4C28000), - reinterpret(0x3FEF25F63CEEADCD), reinterpret(0x3F9B9FC114890000), - reinterpret(0x3FEEE9C8039113E7), reinterpret(0x3FA1B0D8CE110000), - reinterpret(0x3FEEAE8078CBB1AB), reinterpret(0x3FA58A5BD001C000), - reinterpret(0x3FEE741AA29D0C9B), reinterpret(0x3FA95C8340D88000), - reinterpret(0x3FEE3A91830A99B5), reinterpret(0x3FAD276AEF578000), - reinterpret(0x3FEE01E009609A56), reinterpret(0x3FB07598E598C000), - reinterpret(0x3FEDCA01E577BB98), reinterpret(0x3FB253F5E30D2000), - reinterpret(0x3FED92F20B7C9103), reinterpret(0x3FB42EDD8B380000), - reinterpret(0x3FED5CAC66FB5CCE), reinterpret(0x3FB606598757C000), - reinterpret(0x3FED272CAA5EDE9D), reinterpret(0x3FB7DA76356A0000), - reinterpret(0x3FECF26E3E6B2CCD), reinterpret(0x3FB9AB434E1C6000), - reinterpret(0x3FECBE6DA2A77902), reinterpret(0x3FBB78C7BB0D6000), - reinterpret(0x3FEC8B266D37086D), reinterpret(0x3FBD431332E72000), - reinterpret(0x3FEC5894BD5D5804), reinterpret(0x3FBF0A3171DE6000), - reinterpret(0x3FEC26B533BB9F8C), reinterpret(0x3FC067152B914000), - reinterpret(0x3FEBF583EEECE73F), reinterpret(0x3FC147858292B000), - reinterpret(0x3FEBC4FD75DB96C1), reinterpret(0x3FC2266ECDCA3000), - reinterpret(0x3FEB951E0C864A28), reinterpret(0x3FC303D7A6C55000), - reinterpret(0x3FEB65E2C5EF3E2C), reinterpret(0x3FC3DFC33C331000), - reinterpret(0x3FEB374867C9888B), reinterpret(0x3FC4BA366B7A8000), - reinterpret(0x3FEB094B211D304A), reinterpret(0x3FC5933928D1F000), - reinterpret(0x3FEADBE885F2EF7E), reinterpret(0x3FC66ACD2418F000), - reinterpret(0x3FEAAF1D31603DA2), reinterpret(0x3FC740F8EC669000), - reinterpret(0x3FEA82E63FD358A7), reinterpret(0x3FC815C0F51AF000), - reinterpret(0x3FEA5740EF09738B), reinterpret(0x3FC8E92954F68000), - reinterpret(0x3FEA2C2A90AB4B27), reinterpret(0x3FC9BB3602F84000), - reinterpret(0x3FEA01A01393F2D1), reinterpret(0x3FCA8BED1C2C0000), - reinterpret(0x3FE9D79F24DB3C1B), reinterpret(0x3FCB5B515C01D000), - reinterpret(0x3FE9AE2505C7B190), reinterpret(0x3FCC2967CCBCC000), - reinterpret(0x3FE9852EF297CE2F), reinterpret(0x3FCCF635D5486000), - reinterpret(0x3FE95CBAEEA44B75), reinterpret(0x3FCDC1BD3446C000), - reinterpret(0x3FE934C69DE74838), reinterpret(0x3FCE8C01B8CFE000), - reinterpret(0x3FE90D4F2F6752E6), reinterpret(0x3FCF5509C0179000), - reinterpret(0x3FE8E6528EFFD79D), reinterpret(0x3FD00E6C121FB800), - reinterpret(0x3FE8BFCE9FCC007C), reinterpret(0x3FD071B80E93D000), - reinterpret(0x3FE899C0DABEC30E), reinterpret(0x3FD0D46B9E867000), - reinterpret(0x3FE87427AA2317FB), reinterpret(0x3FD13687334BD000), - reinterpret(0x3FE84F00ACB39A08), reinterpret(0x3FD1980D67234800), - reinterpret(0x3FE82A49E8653E55), reinterpret(0x3FD1F8FFE0CC8000), - reinterpret(0x3FE8060195F40260), reinterpret(0x3FD2595FD7636800), - reinterpret(0x3FE7E22563E0A329), reinterpret(0x3FD2B9300914A800), - reinterpret(0x3FE7BEB377DCB5AD), reinterpret(0x3FD3187210436000), - reinterpret(0x3FE79BAA679725C2), reinterpret(0x3FD377266DEC1800), - reinterpret(0x3FE77907F2170657), reinterpret(0x3FD3D54FFBAF3000), - reinterpret(0x3FE756CADBD6130C), reinterpret(0x3FD432EEE32FE000) -]; - -// @ts-ignore: decorator -@lazy @inline -const LOG_DATA_TAB2: StaticArray = [ - // chi , clo - reinterpret(0x3FE61000014FB66B), reinterpret(0x3C7E026C91425B3C), - reinterpret(0x3FE63000034DB495), reinterpret(0x3C8DBFEA48005D41), - reinterpret(0x3FE650000D94D478), reinterpret(0x3C8E7FA786D6A5B7), - reinterpret(0x3FE67000074E6FAD), reinterpret(0x3C61FCEA6B54254C), - reinterpret(0x3FE68FFFFEDF0FAE), reinterpret(0xBC7C7E274C590EFD), - reinterpret(0x3FE6B0000763C5BC), reinterpret(0xBC8AC16848DCDA01), - reinterpret(0x3FE6D0001E5CC1F6), reinterpret(0x3C833F1C9D499311), - reinterpret(0x3FE6EFFFEB05F63E), reinterpret(0xBC7E80041AE22D53), - reinterpret(0x3FE710000E869780), reinterpret(0x3C7BFF6671097952), - reinterpret(0x3FE72FFFFC67E912), reinterpret(0x3C8C00E226BD8724), - reinterpret(0x3FE74FFFDF81116A), reinterpret(0xBC6E02916EF101D2), - reinterpret(0x3FE770000F679C90), reinterpret(0xBC67FC71CD549C74), - reinterpret(0x3FE78FFFFA7EC835), reinterpret(0x3C81BEC19EF50483), - reinterpret(0x3FE7AFFFFE20C2E6), reinterpret(0xBC707E1729CC6465), - reinterpret(0x3FE7CFFFED3FC900), reinterpret(0xBC808072087B8B1C), - reinterpret(0x3FE7EFFFE9261A76), reinterpret(0x3C8DC0286D9DF9AE), - reinterpret(0x3FE81000049CA3E8), reinterpret(0x3C897FD251E54C33), - reinterpret(0x3FE8300017932C8F), reinterpret(0xBC8AFEE9B630F381), - reinterpret(0x3FE850000633739C), reinterpret(0x3C89BFBF6B6535BC), - reinterpret(0x3FE87000204289C6), reinterpret(0xBC8BBF65F3117B75), - reinterpret(0x3FE88FFFEBF57904), reinterpret(0xBC89006EA23DCB57), - reinterpret(0x3FE8B00022BC04DF), reinterpret(0xBC7D00DF38E04B0A), - reinterpret(0x3FE8CFFFE50C1B8A), reinterpret(0xBC88007146FF9F05), - reinterpret(0x3FE8EFFFFC918E43), reinterpret(0x3C83817BD07A7038), - reinterpret(0x3FE910001EFA5FC7), reinterpret(0x3C893E9176DFB403), - reinterpret(0x3FE9300013467BB9), reinterpret(0x3C7F804E4B980276), - reinterpret(0x3FE94FFFE6EE076F), reinterpret(0xBC8F7EF0D9FF622E), - reinterpret(0x3FE96FFFDE3C12D1), reinterpret(0xBC7082AA962638BA), - reinterpret(0x3FE98FFFF4458A0D), reinterpret(0xBC87801B9164A8EF), - reinterpret(0x3FE9AFFFDD982E3E), reinterpret(0xBC8740E08A5A9337), - reinterpret(0x3FE9CFFFED49FB66), reinterpret(0x3C3FCE08C19BE000), - reinterpret(0x3FE9F00020F19C51), reinterpret(0xBC8A3FAA27885B0A), - reinterpret(0x3FEA10001145B006), reinterpret(0x3C74FF489958DA56), - reinterpret(0x3FEA300007BBF6FA), reinterpret(0x3C8CBEAB8A2B6D18), - reinterpret(0x3FEA500010971D79), reinterpret(0x3C88FECADD787930), - reinterpret(0x3FEA70001DF52E48), reinterpret(0xBC8F41763DD8ABDB), - reinterpret(0x3FEA90001C593352), reinterpret(0xBC8EBF0284C27612), - reinterpret(0x3FEAB0002A4F3E4B), reinterpret(0xBC69FD043CFF3F5F), - reinterpret(0x3FEACFFFD7AE1ED1), reinterpret(0xBC823EE7129070B4), - reinterpret(0x3FEAEFFFEE510478), reinterpret(0x3C6A063EE00EDEA3), - reinterpret(0x3FEB0FFFDB650D5B), reinterpret(0x3C5A06C8381F0AB9), - reinterpret(0x3FEB2FFFFEAACA57), reinterpret(0xBC79011E74233C1D), - reinterpret(0x3FEB4FFFD995BADC), reinterpret(0xBC79FF1068862A9F), - reinterpret(0x3FEB7000249E659C), reinterpret(0x3C8AFF45D0864F3E), - reinterpret(0x3FEB8FFFF9871640), reinterpret(0x3C7CFE7796C2C3F9), - reinterpret(0x3FEBAFFFD204CB4F), reinterpret(0xBC63FF27EEF22BC4), - reinterpret(0x3FEBCFFFD2415C45), reinterpret(0xBC6CFFB7EE3BEA21), - reinterpret(0x3FEBEFFFF86309DF), reinterpret(0xBC814103972E0B5C), - reinterpret(0x3FEC0FFFE1B57653), reinterpret(0x3C8BC16494B76A19), - reinterpret(0x3FEC2FFFF1FA57E3), reinterpret(0xBC64FEEF8D30C6ED), - reinterpret(0x3FEC4FFFDCBFE424), reinterpret(0xBC843F68BCEC4775), - reinterpret(0x3FEC6FFFED54B9F7), reinterpret(0x3C847EA3F053E0EC), - reinterpret(0x3FEC8FFFEB998FD5), reinterpret(0x3C7383068DF992F1), - reinterpret(0x3FECB0002125219A), reinterpret(0xBC68FD8E64180E04), - reinterpret(0x3FECCFFFDD94469C), reinterpret(0x3C8E7EBE1CC7EA72), - reinterpret(0x3FECEFFFEAFDC476), reinterpret(0x3C8EBE39AD9F88FE), - reinterpret(0x3FED1000169AF82B), reinterpret(0x3C757D91A8B95A71), - reinterpret(0x3FED30000D0FF71D), reinterpret(0x3C89C1906970C7DA), - reinterpret(0x3FED4FFFEA790FC4), reinterpret(0xBC580E37C558FE0C), - reinterpret(0x3FED70002EDC87E5), reinterpret(0xBC7F80D64DC10F44), - reinterpret(0x3FED900021DC82AA), reinterpret(0xBC747C8F94FD5C5C), - reinterpret(0x3FEDAFFFD86B0283), reinterpret(0x3C8C7F1DC521617E), - reinterpret(0x3FEDD000296C4739), reinterpret(0x3C88019EB2FFB153), - reinterpret(0x3FEDEFFFE54490F5), reinterpret(0x3C6E00D2C652CC89), - reinterpret(0x3FEE0FFFCDABF694), reinterpret(0xBC7F8340202D69D2), - reinterpret(0x3FEE2FFFDB52C8DD), reinterpret(0x3C7B00C1CA1B0864), - reinterpret(0x3FEE4FFFF24216EF), reinterpret(0x3C72FFA8B094AB51), - reinterpret(0x3FEE6FFFE88A5E11), reinterpret(0xBC57F673B1EFBE59), - reinterpret(0x3FEE9000119EFF0D), reinterpret(0xBC84808D5E0BC801), - reinterpret(0x3FEEAFFFDFA51744), reinterpret(0x3C780006D54320B5), - reinterpret(0x3FEED0001A127FA1), reinterpret(0xBC5002F860565C92), - reinterpret(0x3FEEF00007BABCC4), reinterpret(0xBC8540445D35E611), - reinterpret(0x3FEF0FFFF57A8D02), reinterpret(0xBC4FFB3139EF9105), - reinterpret(0x3FEF30001EE58AC7), reinterpret(0x3C8A81ACF2731155), - reinterpret(0x3FEF4FFFF5823494), reinterpret(0x3C8A3F41D4D7C743), - reinterpret(0x3FEF6FFFFCA94C6B), reinterpret(0xBC6202F41C987875), - reinterpret(0x3FEF8FFFE1F9C441), reinterpret(0x3C777DD1F477E74B), - reinterpret(0x3FEFAFFFD2E0E37E), reinterpret(0xBC6F01199A7CA331), - reinterpret(0x3FEFD0001C77E49E), reinterpret(0x3C7181EE4BCEACB1), - reinterpret(0x3FEFEFFFF7E0C331), reinterpret(0xBC6E05370170875A), - reinterpret(0x3FF00FFFF465606E), reinterpret(0xBC8A7EAD491C0ADA), - reinterpret(0x3FF02FFFF3867A58), reinterpret(0xBC977F69C3FCB2E0), - reinterpret(0x3FF04FFFFDFC0D17), reinterpret(0x3C97BFFE34CB945B), - reinterpret(0x3FF0700003CD4D82), reinterpret(0x3C820083C0E456CB), - reinterpret(0x3FF08FFFF9F2CBE8), reinterpret(0xBC6DFFDFBE37751A), - reinterpret(0x3FF0B000010CDA65), reinterpret(0xBC913F7FAEE626EB), - reinterpret(0x3FF0D00001A4D338), reinterpret(0x3C807DFA79489FF7), - reinterpret(0x3FF0EFFFFADAFDFD), reinterpret(0xBC77040570D66BC0), - reinterpret(0x3FF110000BBAFD96), reinterpret(0x3C8E80D4846D0B62), - reinterpret(0x3FF12FFFFAE5F45D), reinterpret(0x3C9DBFFA64FD36EF), - reinterpret(0x3FF150000DD59AD9), reinterpret(0x3C9A0077701250AE), - reinterpret(0x3FF170000F21559A), reinterpret(0x3C8DFDF9E2E3DEEE), - reinterpret(0x3FF18FFFFC275426), reinterpret(0x3C910030DC3B7273), - reinterpret(0x3FF1B000123D3C59), reinterpret(0x3C997F7980030188), - reinterpret(0x3FF1CFFFF8299EB7), reinterpret(0xBC65F932AB9F8C67), - reinterpret(0x3FF1EFFFF48AD400), reinterpret(0x3C937FBF9DA75BEB), - reinterpret(0x3FF210000C8B86A4), reinterpret(0x3C9F806B91FD5B22), - reinterpret(0x3FF2300003854303), reinterpret(0x3C93FFC2EB9FBF33), - reinterpret(0x3FF24FFFFFBCF684), reinterpret(0x3C7601E77E2E2E72), - reinterpret(0x3FF26FFFF52921D9), reinterpret(0x3C7FFCBB767F0C61), - reinterpret(0x3FF2900014933A3C), reinterpret(0xBC7202CA3C02412B), - reinterpret(0x3FF2B00014556313), reinterpret(0xBC92808233F21F02), - reinterpret(0x3FF2CFFFEBFE523B), reinterpret(0xBC88FF7E384FDCF2), - reinterpret(0x3FF2F0000BB8AD96), reinterpret(0xBC85FF51503041C5), - reinterpret(0x3FF30FFFFB7AE2AF), reinterpret(0xBC810071885E289D), - reinterpret(0x3FF32FFFFEAC5F7F), reinterpret(0xBC91FF5D3FB7B715), - reinterpret(0x3FF350000CA66756), reinterpret(0x3C957F82228B82BD), - reinterpret(0x3FF3700011FBF721), reinterpret(0x3C8000BAC40DD5CC), - reinterpret(0x3FF38FFFF9592FB9), reinterpret(0xBC943F9D2DB2A751), - reinterpret(0x3FF3B00004DDD242), reinterpret(0x3C857F6B707638E1), - reinterpret(0x3FF3CFFFF5B2C957), reinterpret(0x3C7A023A10BF1231), - reinterpret(0x3FF3EFFFEAB0B418), reinterpret(0x3C987F6D66B152B0), - reinterpret(0x3FF410001532AFF4), reinterpret(0x3C67F8375F198524), - reinterpret(0x3FF4300017478B29), reinterpret(0x3C8301E672DC5143), - reinterpret(0x3FF44FFFE795B463), reinterpret(0x3C89FF69B8B2895A), - reinterpret(0x3FF46FFFE80475E0), reinterpret(0xBC95C0B19BC2F254), - reinterpret(0x3FF48FFFEF6FC1E7), reinterpret(0x3C9B4009F23A2A72), - reinterpret(0x3FF4AFFFE5BEA704), reinterpret(0xBC94FFB7BF0D7D45), - reinterpret(0x3FF4D000171027DE), reinterpret(0xBC99C06471DC6A3D), - reinterpret(0x3FF4F0000FF03EE2), reinterpret(0x3C977F890B85531C), - reinterpret(0x3FF5100012DC4BD1), reinterpret(0x3C6004657166A436), - reinterpret(0x3FF530001605277A), reinterpret(0xBC96BFCECE233209), - reinterpret(0x3FF54FFFECDB704C), reinterpret(0xBC8902720505A1D7), - reinterpret(0x3FF56FFFEF5F54A9), reinterpret(0x3C9BBFE60EC96412), - reinterpret(0x3FF5900017E61012), reinterpret(0x3C887EC581AFEF90), - reinterpret(0x3FF5B00003C93E92), reinterpret(0xBC9F41080ABF0CC0), - reinterpret(0x3FF5D0001D4919BC), reinterpret(0xBC98812AFB254729), - reinterpret(0x3FF5EFFFE7B87A89), reinterpret(0xBC947EB780ED6904) -]; - -// @ts-ignore: decorator -@inline -export function log_lut(x: f64): f64 { - const N_MASK = (1 << LOG_TABLE_BITS) - 1; - - const - B0 = reinterpret(0xBFE0000000000000), // -0x1p-1 - B1 = reinterpret(0x3FD5555555555577), // 0x1.5555555555577p-2 - B2 = reinterpret(0xBFCFFFFFFFFFFDCB), // -0x1.ffffffffffdcbp-3 - B3 = reinterpret(0x3FC999999995DD0C), // 0x1.999999995dd0cp-3 - B4 = reinterpret(0xBFC55555556745A7), // -0x1.55555556745a7p-3 - B5 = reinterpret(0x3FC24924A344DE30), // 0x1.24924a344de3p-3 - B6 = reinterpret(0xBFBFFFFFA4423D65), // -0x1.fffffa4423d65p-4 - B7 = reinterpret(0x3FBC7184282AD6CA), // 0x1.c7184282ad6cap-4 - B8 = reinterpret(0xBFB999EB43B068FF), // -0x1.999eb43b068ffp-4 - B9 = reinterpret(0x3FB78182F7AFD085), // 0x1.78182f7afd085p-4 - B10 = reinterpret(0xBFB5521375D145CD); // -0x1.5521375d145cdp-4 - - const - A0 = reinterpret(0xBFE0000000000001), // -0x1.0000000000001p-1 - A1 = reinterpret(0x3FD555555551305B), // 0x1.555555551305bp-2 - A2 = reinterpret(0xBFCFFFFFFFEB4590), // -0x1.fffffffeb459p-3 - A3 = reinterpret(0x3FC999B324F10111), // 0x1.999b324f10111p-3 - A4 = reinterpret(0xBFC55575E506C89F); // -0x1.55575e506c89fp-3 - - const - LO: u64 = 0x3FEE000000000000, - HI: u64 = 0x3FF1090000000000; - - const - Ln2hi = reinterpret(0x3FE62E42FEFA3800), // 0x1.62e42fefa3800p-1 - Ln2lo = reinterpret(0x3D2EF35793C76730), // 0x1.ef35793c76730p-45 - Ox1p27 = reinterpret(0x41A0000000000000), // 0x1p27 - Ox1p52 = reinterpret(0x4330000000000000); // 0x1p52 - - var ix = reinterpret(x); - if (ix - LO < HI - LO) { - let r = x - 1.0; - let r2 = r * r; - let r3 = r2 * r; - let y = - r3 * (B1 + r * B2 + r2 * B3 + - r3 * (B4 + r * B5 + r2 * B6 + - r3 * (B7 + r * B8 + r2 * B9 + r3 * B10))); - // Worst-case error is around 0.507 ULP - let w = r * Ox1p27; - let rhi = r + w - w; - let rlo = r - rhi; - w = rhi * rhi * B0; // B[0] == -0.5 - let hi = r + w; - let lo = r - hi + w; - lo += B0 * rlo * (rhi + r); - return y + lo + hi; - } - var top = u32(ix >> 48); - if (top - 0x0010 >= 0x7FF0 - 0x0010) { - // x < 0x1p-1022 or inf or nan - if ((ix << 1) == 0) return -1.0 / (x * x); - if (ix == reinterpret(Infinity)) return x; // log(inf) == inf - if ((top & 0x8000) || (top & 0x7FF0) == 0x7FF0) return (x - x) / (x - x); - // x is subnormal, normalize it - ix = reinterpret(x * Ox1p52); - ix -= u64(52) << 52; - } - - // x = 2^k z; where z is in range [OFF,2*OFF) and exact. - // The range is split into N subintervals. - // The ith subinterval contains z and c is near its center. - var tmp = ix - 0x3FE6000000000000; - var i = ((tmp >> (52 - LOG_TABLE_BITS)) & N_MASK); - var k = tmp >> 52; - var iz = ix - (tmp & (u64(0xFFF) << 52)); - - var invc = load(changetype(LOG_DATA_TAB1) + (i << (1 + alignof())), 0 << alignof()); // T[i].invc; - var logc = load(changetype(LOG_DATA_TAB1) + (i << (1 + alignof())), 1 << alignof()); // T[i].logc; - var z = reinterpret(iz); - - // log(x) = log1p(z/c-1) + log(c) + k*Ln2. - // r ~= z/c - 1, |r| < 1/(2*N) -// #if __FP_FAST_FMA -// // rounding error: 0x1p-55/N -// r = __builtin_fma(z, invc, -1.0); -// #else - // rounding error: 0x1p-55/N + 0x1p-66 - const chi = load(changetype(LOG_DATA_TAB2) + (i << (1 + alignof())), 0 << alignof()); // T2[i].chi - const clo = load(changetype(LOG_DATA_TAB2) + (i << (1 + alignof())), 1 << alignof()); // T2[i].clo - var r = (z - chi - clo) * invc; -// #endif - var kd = k; - - // hi + lo = r + log(c) + k*Ln2 - var w = kd * Ln2hi + logc; - var hi = w + r; - var lo = w - hi + r + kd * Ln2lo; - - // log(x) = lo + (log1p(r) - r) + hi - var r2 = r * r; // rounding error: 0x1p-54/N^2 - // Worst case error if |y| > 0x1p-5: - // 0.5 + 4.13/N + abs-poly-error*2^57 ULP (+ 0.002 ULP without fma) - // Worst case error if |y| > 0x1p-4: - // 0.5 + 2.06/N + abs-poly-error*2^56 ULP (+ 0.001 ULP without fma). - return lo + r2 * A0 + r * r2 * (A1 + r * A2 + r2 * (A3 + r * A4)) + hi; -} - -// -// Lookup data for pow. See: https://git.musl-libc.org/cgit/musl/tree/src/math/pow.c -// - -// @ts-ignore: decorator -@inline -const POW_LOG_TABLE_BITS = 7; - -/* Algorithm: - - x = 2^k z - log(x) = k ln2 + log(c) + log(z/c) - log(z/c) = poly(z/c - 1) - -where z is in [0x1.69555p-1; 0x1.69555p0] which is split into N subintervals -and z falls into the ith one, then table entries are computed as - - tab[i].invc = 1/c - tab[i].logc = round(0x1p43*log(c))/0x1p43 - tab[i].logctail = (double)(log(c) - logc) - -where c is chosen near the center of the subinterval such that 1/c has only a -few precision bits so z/c - 1 is exactly representible as double: - - 1/c = center < 1 ? round(N/center)/N : round(2*N/center)/N/2 - -Note: |z/c - 1| < 1/N for the chosen c, |log(c) - logc - logctail| < 0x1p-97, -the last few bits of logc are rounded away so k*ln2hi + logc has no rounding -error and the interval for z is selected such that near x == 1, where log(x) -is tiny, large cancellation error is avoided in logc + poly(z/c - 1). */ - -// @ts-ignore: decorator -@lazy @inline -const POW_LOG_DATA_TAB: StaticArray = [ - // invc ,pad, logc , logctail - reinterpret(0x3FF6A00000000000), 0, reinterpret(0xBFD62C82F2B9C800), reinterpret(0x3CFAB42428375680), - reinterpret(0x3FF6800000000000), 0, reinterpret(0xBFD5D1BDBF580800), reinterpret(0xBD1CA508D8E0F720), - reinterpret(0x3FF6600000000000), 0, reinterpret(0xBFD5767717455800), reinterpret(0xBD2362A4D5B6506D), - reinterpret(0x3FF6400000000000), 0, reinterpret(0xBFD51AAD872DF800), reinterpret(0xBCE684E49EB067D5), - reinterpret(0x3FF6200000000000), 0, reinterpret(0xBFD4BE5F95777800), reinterpret(0xBD041B6993293EE0), - reinterpret(0x3FF6000000000000), 0, reinterpret(0xBFD4618BC21C6000), reinterpret(0x3D13D82F484C84CC), - reinterpret(0x3FF5E00000000000), 0, reinterpret(0xBFD404308686A800), reinterpret(0x3CDC42F3ED820B3A), - reinterpret(0x3FF5C00000000000), 0, reinterpret(0xBFD3A64C55694800), reinterpret(0x3D20B1C686519460), - reinterpret(0x3FF5A00000000000), 0, reinterpret(0xBFD347DD9A988000), reinterpret(0x3D25594DD4C58092), - reinterpret(0x3FF5800000000000), 0, reinterpret(0xBFD2E8E2BAE12000), reinterpret(0x3D267B1E99B72BD8), - reinterpret(0x3FF5600000000000), 0, reinterpret(0xBFD2895A13DE8800), reinterpret(0x3D15CA14B6CFB03F), - reinterpret(0x3FF5600000000000), 0, reinterpret(0xBFD2895A13DE8800), reinterpret(0x3D15CA14B6CFB03F), - reinterpret(0x3FF5400000000000), 0, reinterpret(0xBFD22941FBCF7800), reinterpret(0xBD165A242853DA76), - reinterpret(0x3FF5200000000000), 0, reinterpret(0xBFD1C898C1699800), reinterpret(0xBD1FAFBC68E75404), - reinterpret(0x3FF5000000000000), 0, reinterpret(0xBFD1675CABABA800), reinterpret(0x3D1F1FC63382A8F0), - reinterpret(0x3FF4E00000000000), 0, reinterpret(0xBFD1058BF9AE4800), reinterpret(0xBD26A8C4FD055A66), - reinterpret(0x3FF4C00000000000), 0, reinterpret(0xBFD0A324E2739000), reinterpret(0xBD0C6BEE7EF4030E), - reinterpret(0x3FF4A00000000000), 0, reinterpret(0xBFD0402594B4D000), reinterpret(0xBCF036B89EF42D7F), - reinterpret(0x3FF4A00000000000), 0, reinterpret(0xBFD0402594B4D000), reinterpret(0xBCF036B89EF42D7F), - reinterpret(0x3FF4800000000000), 0, reinterpret(0xBFCFB9186D5E4000), reinterpret(0x3D0D572AAB993C87), - reinterpret(0x3FF4600000000000), 0, reinterpret(0xBFCEF0ADCBDC6000), reinterpret(0x3D2B26B79C86AF24), - reinterpret(0x3FF4400000000000), 0, reinterpret(0xBFCE27076E2AF000), reinterpret(0xBD172F4F543FFF10), - reinterpret(0x3FF4200000000000), 0, reinterpret(0xBFCD5C216B4FC000), reinterpret(0x3D21BA91BBCA681B), - reinterpret(0x3FF4000000000000), 0, reinterpret(0xBFCC8FF7C79AA000), reinterpret(0x3D27794F689F8434), - reinterpret(0x3FF4000000000000), 0, reinterpret(0xBFCC8FF7C79AA000), reinterpret(0x3D27794F689F8434), - reinterpret(0x3FF3E00000000000), 0, reinterpret(0xBFCBC286742D9000), reinterpret(0x3D194EB0318BB78F), - reinterpret(0x3FF3C00000000000), 0, reinterpret(0xBFCAF3C94E80C000), reinterpret(0x3CBA4E633FCD9066), - reinterpret(0x3FF3A00000000000), 0, reinterpret(0xBFCA23BC1FE2B000), reinterpret(0xBD258C64DC46C1EA), - reinterpret(0x3FF3A00000000000), 0, reinterpret(0xBFCA23BC1FE2B000), reinterpret(0xBD258C64DC46C1EA), - reinterpret(0x3FF3800000000000), 0, reinterpret(0xBFC9525A9CF45000), reinterpret(0xBD2AD1D904C1D4E3), - reinterpret(0x3FF3600000000000), 0, reinterpret(0xBFC87FA06520D000), reinterpret(0x3D2BBDBF7FDBFA09), - reinterpret(0x3FF3400000000000), 0, reinterpret(0xBFC7AB890210E000), reinterpret(0x3D2BDB9072534A58), - reinterpret(0x3FF3400000000000), 0, reinterpret(0xBFC7AB890210E000), reinterpret(0x3D2BDB9072534A58), - reinterpret(0x3FF3200000000000), 0, reinterpret(0xBFC6D60FE719D000), reinterpret(0xBD10E46AA3B2E266), - reinterpret(0x3FF3000000000000), 0, reinterpret(0xBFC5FF3070A79000), reinterpret(0xBD1E9E439F105039), - reinterpret(0x3FF3000000000000), 0, reinterpret(0xBFC5FF3070A79000), reinterpret(0xBD1E9E439F105039), - reinterpret(0x3FF2E00000000000), 0, reinterpret(0xBFC526E5E3A1B000), reinterpret(0xBD20DE8B90075B8F), - reinterpret(0x3FF2C00000000000), 0, reinterpret(0xBFC44D2B6CCB8000), reinterpret(0x3D170CC16135783C), - reinterpret(0x3FF2C00000000000), 0, reinterpret(0xBFC44D2B6CCB8000), reinterpret(0x3D170CC16135783C), - reinterpret(0x3FF2A00000000000), 0, reinterpret(0xBFC371FC201E9000), reinterpret(0x3CF178864D27543A), - reinterpret(0x3FF2800000000000), 0, reinterpret(0xBFC29552F81FF000), reinterpret(0xBD248D301771C408), - reinterpret(0x3FF2600000000000), 0, reinterpret(0xBFC1B72AD52F6000), reinterpret(0xBD2E80A41811A396), - reinterpret(0x3FF2600000000000), 0, reinterpret(0xBFC1B72AD52F6000), reinterpret(0xBD2E80A41811A396), - reinterpret(0x3FF2400000000000), 0, reinterpret(0xBFC0D77E7CD09000), reinterpret(0x3D0A699688E85BF4), - reinterpret(0x3FF2400000000000), 0, reinterpret(0xBFC0D77E7CD09000), reinterpret(0x3D0A699688E85BF4), - reinterpret(0x3FF2200000000000), 0, reinterpret(0xBFBFEC9131DBE000), reinterpret(0xBD2575545CA333F2), - reinterpret(0x3FF2000000000000), 0, reinterpret(0xBFBE27076E2B0000), reinterpret(0x3D2A342C2AF0003C), - reinterpret(0x3FF2000000000000), 0, reinterpret(0xBFBE27076E2B0000), reinterpret(0x3D2A342C2AF0003C), - reinterpret(0x3FF1E00000000000), 0, reinterpret(0xBFBC5E548F5BC000), reinterpret(0xBD1D0C57585FBE06), - reinterpret(0x3FF1C00000000000), 0, reinterpret(0xBFBA926D3A4AE000), reinterpret(0x3D253935E85BAAC8), - reinterpret(0x3FF1C00000000000), 0, reinterpret(0xBFBA926D3A4AE000), reinterpret(0x3D253935E85BAAC8), - reinterpret(0x3FF1A00000000000), 0, reinterpret(0xBFB8C345D631A000), reinterpret(0x3D137C294D2F5668), - reinterpret(0x3FF1A00000000000), 0, reinterpret(0xBFB8C345D631A000), reinterpret(0x3D137C294D2F5668), - reinterpret(0x3FF1800000000000), 0, reinterpret(0xBFB6F0D28AE56000), reinterpret(0xBD269737C93373DA), - reinterpret(0x3FF1600000000000), 0, reinterpret(0xBFB51B073F062000), reinterpret(0x3D1F025B61C65E57), - reinterpret(0x3FF1600000000000), 0, reinterpret(0xBFB51B073F062000), reinterpret(0x3D1F025B61C65E57), - reinterpret(0x3FF1400000000000), 0, reinterpret(0xBFB341D7961BE000), reinterpret(0x3D2C5EDACCF913DF), - reinterpret(0x3FF1400000000000), 0, reinterpret(0xBFB341D7961BE000), reinterpret(0x3D2C5EDACCF913DF), - reinterpret(0x3FF1200000000000), 0, reinterpret(0xBFB16536EEA38000), reinterpret(0x3D147C5E768FA309), - reinterpret(0x3FF1000000000000), 0, reinterpret(0xBFAF0A30C0118000), reinterpret(0x3D2D599E83368E91), - reinterpret(0x3FF1000000000000), 0, reinterpret(0xBFAF0A30C0118000), reinterpret(0x3D2D599E83368E91), - reinterpret(0x3FF0E00000000000), 0, reinterpret(0xBFAB42DD71198000), reinterpret(0x3D1C827AE5D6704C), - reinterpret(0x3FF0E00000000000), 0, reinterpret(0xBFAB42DD71198000), reinterpret(0x3D1C827AE5D6704C), - reinterpret(0x3FF0C00000000000), 0, reinterpret(0xBFA77458F632C000), reinterpret(0xBD2CFC4634F2A1EE), - reinterpret(0x3FF0C00000000000), 0, reinterpret(0xBFA77458F632C000), reinterpret(0xBD2CFC4634F2A1EE), - reinterpret(0x3FF0A00000000000), 0, reinterpret(0xBFA39E87B9FEC000), reinterpret(0x3CF502B7F526FEAA), - reinterpret(0x3FF0A00000000000), 0, reinterpret(0xBFA39E87B9FEC000), reinterpret(0x3CF502B7F526FEAA), - reinterpret(0x3FF0800000000000), 0, reinterpret(0xBF9F829B0E780000), reinterpret(0xBD2980267C7E09E4), - reinterpret(0x3FF0800000000000), 0, reinterpret(0xBF9F829B0E780000), reinterpret(0xBD2980267C7E09E4), - reinterpret(0x3FF0600000000000), 0, reinterpret(0xBF97B91B07D58000), reinterpret(0xBD288D5493FAA639), - reinterpret(0x3FF0400000000000), 0, reinterpret(0xBF8FC0A8B0FC0000), reinterpret(0xBCDF1E7CF6D3A69C), - reinterpret(0x3FF0400000000000), 0, reinterpret(0xBF8FC0A8B0FC0000), reinterpret(0xBCDF1E7CF6D3A69C), - reinterpret(0x3FF0200000000000), 0, reinterpret(0xBF7FE02A6B100000), reinterpret(0xBD19E23F0DDA40E4), - reinterpret(0x3FF0200000000000), 0, reinterpret(0xBF7FE02A6B100000), reinterpret(0xBD19E23F0DDA40E4), - reinterpret(0x3FF0000000000000), 0, 0, 0, - reinterpret(0x3FF0000000000000), 0, 0, 0, - reinterpret(0x3FEFC00000000000), 0, reinterpret(0x3F80101575890000), reinterpret(0xBD10C76B999D2BE8), - reinterpret(0x3FEF800000000000), 0, reinterpret(0x3F90205658938000), reinterpret(0xBD23DC5B06E2F7D2), - reinterpret(0x3FEF400000000000), 0, reinterpret(0x3F98492528C90000), reinterpret(0xBD2AA0BA325A0C34), - reinterpret(0x3FEF000000000000), 0, reinterpret(0x3FA0415D89E74000), reinterpret(0x3D0111C05CF1D753), - reinterpret(0x3FEEC00000000000), 0, reinterpret(0x3FA466AED42E0000), reinterpret(0xBD2C167375BDFD28), - reinterpret(0x3FEE800000000000), 0, reinterpret(0x3FA894AA149FC000), reinterpret(0xBD197995D05A267D), - reinterpret(0x3FEE400000000000), 0, reinterpret(0x3FACCB73CDDDC000), reinterpret(0xBD1A68F247D82807), - reinterpret(0x3FEE200000000000), 0, reinterpret(0x3FAEEA31C006C000), reinterpret(0xBD0E113E4FC93B7B), - reinterpret(0x3FEDE00000000000), 0, reinterpret(0x3FB1973BD1466000), reinterpret(0xBD25325D560D9E9B), - reinterpret(0x3FEDA00000000000), 0, reinterpret(0x3FB3BDF5A7D1E000), reinterpret(0x3D2CC85EA5DB4ED7), - reinterpret(0x3FED600000000000), 0, reinterpret(0x3FB5E95A4D97A000), reinterpret(0xBD2C69063C5D1D1E), - reinterpret(0x3FED400000000000), 0, reinterpret(0x3FB700D30AEAC000), reinterpret(0x3CEC1E8DA99DED32), - reinterpret(0x3FED000000000000), 0, reinterpret(0x3FB9335E5D594000), reinterpret(0x3D23115C3ABD47DA), - reinterpret(0x3FECC00000000000), 0, reinterpret(0x3FBB6AC88DAD6000), reinterpret(0xBD1390802BF768E5), - reinterpret(0x3FECA00000000000), 0, reinterpret(0x3FBC885801BC4000), reinterpret(0x3D2646D1C65AACD3), - reinterpret(0x3FEC600000000000), 0, reinterpret(0x3FBEC739830A2000), reinterpret(0xBD2DC068AFE645E0), - reinterpret(0x3FEC400000000000), 0, reinterpret(0x3FBFE89139DBE000), reinterpret(0xBD2534D64FA10AFD), - reinterpret(0x3FEC000000000000), 0, reinterpret(0x3FC1178E8227E000), reinterpret(0x3D21EF78CE2D07F2), - reinterpret(0x3FEBE00000000000), 0, reinterpret(0x3FC1AA2B7E23F000), reinterpret(0x3D2CA78E44389934), - reinterpret(0x3FEBA00000000000), 0, reinterpret(0x3FC2D1610C868000), reinterpret(0x3D039D6CCB81B4A1), - reinterpret(0x3FEB800000000000), 0, reinterpret(0x3FC365FCB0159000), reinterpret(0x3CC62FA8234B7289), - reinterpret(0x3FEB400000000000), 0, reinterpret(0x3FC4913D8333B000), reinterpret(0x3D25837954FDB678), - reinterpret(0x3FEB200000000000), 0, reinterpret(0x3FC527E5E4A1B000), reinterpret(0x3D2633E8E5697DC7), - reinterpret(0x3FEAE00000000000), 0, reinterpret(0x3FC6574EBE8C1000), reinterpret(0x3D19CF8B2C3C2E78), - reinterpret(0x3FEAC00000000000), 0, reinterpret(0x3FC6F0128B757000), reinterpret(0xBD25118DE59C21E1), - reinterpret(0x3FEAA00000000000), 0, reinterpret(0x3FC7898D85445000), reinterpret(0xBD1C661070914305), - reinterpret(0x3FEA600000000000), 0, reinterpret(0x3FC8BEAFEB390000), reinterpret(0xBD073D54AAE92CD1), - reinterpret(0x3FEA400000000000), 0, reinterpret(0x3FC95A5ADCF70000), reinterpret(0x3D07F22858A0FF6F), - reinterpret(0x3FEA000000000000), 0, reinterpret(0x3FCA93ED3C8AE000), reinterpret(0xBD28724350562169), - reinterpret(0x3FE9E00000000000), 0, reinterpret(0x3FCB31D8575BD000), reinterpret(0xBD0C358D4EACE1AA), - reinterpret(0x3FE9C00000000000), 0, reinterpret(0x3FCBD087383BE000), reinterpret(0xBD2D4BC4595412B6), - reinterpret(0x3FE9A00000000000), 0, reinterpret(0x3FCC6FFBC6F01000), reinterpret(0xBCF1EC72C5962BD2), - reinterpret(0x3FE9600000000000), 0, reinterpret(0x3FCDB13DB0D49000), reinterpret(0xBD2AFF2AF715B035), - reinterpret(0x3FE9400000000000), 0, reinterpret(0x3FCE530EFFE71000), reinterpret(0x3CC212276041F430), - reinterpret(0x3FE9200000000000), 0, reinterpret(0x3FCEF5ADE4DD0000), reinterpret(0xBCCA211565BB8E11), - reinterpret(0x3FE9000000000000), 0, reinterpret(0x3FCF991C6CB3B000), reinterpret(0x3D1BCBECCA0CDF30), - reinterpret(0x3FE8C00000000000), 0, reinterpret(0x3FD07138604D5800), reinterpret(0x3CF89CDB16ED4E91), - reinterpret(0x3FE8A00000000000), 0, reinterpret(0x3FD0C42D67616000), reinterpret(0x3D27188B163CEAE9), - reinterpret(0x3FE8800000000000), 0, reinterpret(0x3FD1178E8227E800), reinterpret(0xBD2C210E63A5F01C), - reinterpret(0x3FE8600000000000), 0, reinterpret(0x3FD16B5CCBACF800), reinterpret(0x3D2B9ACDF7A51681), - reinterpret(0x3FE8400000000000), 0, reinterpret(0x3FD1BF99635A6800), reinterpret(0x3D2CA6ED5147BDB7), - reinterpret(0x3FE8200000000000), 0, reinterpret(0x3FD214456D0EB800), reinterpret(0x3D0A87DEBA46BAEA), - reinterpret(0x3FE7E00000000000), 0, reinterpret(0x3FD2BEF07CDC9000), reinterpret(0x3D2A9CFA4A5004F4), - reinterpret(0x3FE7C00000000000), 0, reinterpret(0x3FD314F1E1D36000), reinterpret(0xBD28E27AD3213CB8), - reinterpret(0x3FE7A00000000000), 0, reinterpret(0x3FD36B6776BE1000), reinterpret(0x3D116ECDB0F177C8), - reinterpret(0x3FE7800000000000), 0, reinterpret(0x3FD3C25277333000), reinterpret(0x3D183B54B606BD5C), - reinterpret(0x3FE7600000000000), 0, reinterpret(0x3FD419B423D5E800), reinterpret(0x3D08E436EC90E09D), - reinterpret(0x3FE7400000000000), 0, reinterpret(0x3FD4718DC271C800), reinterpret(0xBD2F27CE0967D675), - reinterpret(0x3FE7200000000000), 0, reinterpret(0x3FD4C9E09E173000), reinterpret(0xBD2E20891B0AD8A4), - reinterpret(0x3FE7000000000000), 0, reinterpret(0x3FD522AE0738A000), reinterpret(0x3D2EBE708164C759), - reinterpret(0x3FE6E00000000000), 0, reinterpret(0x3FD57BF753C8D000), reinterpret(0x3D1FADEDEE5D40EF), - reinterpret(0x3FE6C00000000000), 0, reinterpret(0x3FD5D5BDDF596000), reinterpret(0xBD0A0B2A08A465DC) -]; - -// Returns 0 if not int, 1 if odd int, 2 if even int. The argument is -// the bit representation of a non-zero finite floating-point value. -// @ts-ignore: decorator -@inline -function checkint(iy: u64): i32 { - var e = iy >> 52 & 0x7FF; - if (e < 0x3FF ) return 0; - if (e > 0x3FF + 52) return 2; - e = u64(1) << (0x3FF + 52 - e); - if (iy & (e - 1)) return 0; - if (iy & e ) return 1; - return 2; -} - -// @ts-ignore: decorator -@inline -function xflow(sign: u32, y: f64): f64 { - return select(-y, y, sign) * y; -} - -// @ts-ignore: decorator -@inline -function uflow(sign: u32): f64 { - return xflow(sign, reinterpret(0x1000000000000000)); // 0x1p-767 -} - -// @ts-ignore: decorator -@inline -function oflow(sign: u32): f64 { - return xflow(sign, reinterpret(0x7000000000000000)); // 0x1p769 -} - -// Returns 1 if input is the bit representation of 0, infinity or nan. -// @ts-ignore: decorator -@inline -function zeroinfnan(u: u64): bool { - return (u << 1) - 1 >= 0xFFE0000000000000 - 1; -} - -// @ts-ignore: decorator -@lazy -var log_tail: f64 = 0; - -// Compute y+TAIL = log(x) where the rounded result is y and TAIL has about -// additional 15 bits precision. IX is the bit representation of x, but -// normalized in the subnormal range using the sign bit for the exponent. -// @ts-ignore: decorator -@inline -function log_inline(ix: u64): f64 { - const N = 1 << POW_LOG_TABLE_BITS; - const N_MASK = N - 1; - - const - Ln2hi = reinterpret(0x3FE62E42FEFA3800), - Ln2lo = reinterpret(0x3D2EF35793C76730); - - const - A0 = reinterpret(0xBFE0000000000000), - A1 = reinterpret(0xBFE5555555555560), - A2 = reinterpret(0x3FE0000000000006), - A3 = reinterpret(0x3FE999999959554E), - A4 = reinterpret(0xBFE555555529A47A), - A5 = reinterpret(0xBFF2495B9B4845E9), - A6 = reinterpret(0x3FF0002B8B263FC3); - - // x = 2^k z; where z is in range [OFF,2*OFF) and exact. - // The range is split into N subintervals. - // The ith subinterval contains z and c is near its center. - var tmp = ix - 0x3fE6955500000000; - var i = ((tmp >> (52 - POW_LOG_TABLE_BITS)) & N_MASK); - var k = tmp >> 52; - var iz = ix - (tmp & u64(0xFFF) << 52); - var z = reinterpret(iz); - var kd = k; - - // log(x) = k*Ln2 + log(c) + log1p(z/c-1). - var invc = load(changetype(POW_LOG_DATA_TAB) + (i << (2 + alignof())), 0 << alignof()); // tab[i].invc - var logc = load(changetype(POW_LOG_DATA_TAB) + (i << (2 + alignof())), 2 << alignof()); // tab[i].logc - var logctail = load(changetype(POW_LOG_DATA_TAB) + (i << (2 + alignof())), 3 << alignof()); // tab[i].logctail - - // Note: 1/c is j/N or j/N/2 where j is an integer in [N,2N) and - // |z/c - 1| < 1/N, so r = z/c - 1 is exactly representible. - // Split z such that rhi, rlo and rhi*rhi are exact and |rlo| <= |r|. - var zhi = reinterpret((iz + u64(0x80000000)) & 0xFFFFFFFF00000000); - var zlo = z - zhi; - var rhi = zhi * invc - 1.0; - var rlo = zlo * invc; - var r = rhi + rlo; - - // k * Ln2 + log(c) + r. - var t1 = kd * Ln2hi + logc; - var t2 = t1 + r; - var lo1 = kd * Ln2lo + logctail; - var lo2 = t1 - t2 + r; - - // Evaluation is optimized assuming superscalar pipelined execution. - var ar = A0 * r; // A[0] = -0.5 - var ar2 = r * ar; - var ar3 = r * ar2; - // k * Ln2 + log(c) + r + A[0] * r * r. - var arhi = A0 * rhi; - var arhi2 = rhi * arhi; - var hi = t2 + arhi2; - var lo3 = rlo * (ar + arhi); - var lo4 = t2 - hi + arhi2; - - // p = log1p(r) - r - A[0] * r * r. - var p = ar3 * (A1 + r * A2 + ar2 * (A3 + r * A4 + ar2 * (A5 + r * A6))); - var lo = lo1 + lo2 + lo3 + lo4 + p; - var y = hi + lo; - log_tail = hi - y + lo; - - return y; -} - -// @ts-ignore: decorator -@inline -const SIGN_BIAS = 0x800 << EXP_TABLE_BITS; - -// Computes sign*exp(x+xtail) where |xtail| < 2^-8/N and |xtail| <= |x|. -// The sign_bias argument is SIGN_BIAS or 0 and sets the sign to -1 or 1. -// @ts-ignore: decorator -@inline -function exp_inline(x: f64, xtail: f64, sign_bias: u32): f64 { - const N = 1 << EXP_TABLE_BITS; - const N_MASK = N - 1; - - const - InvLn2N = reinterpret(0x3FF71547652B82FE) * N, // 0x1.71547652b82fep0 - NegLn2hiN = reinterpret(0xBF762E42FEFA0000), // -0x1.62e42fefa0000p-8 - NegLn2loN = reinterpret(0xBD0CF79ABC9E3B3A), // -0x1.cf79abc9e3b3ap-47 - shift = reinterpret(0x4338000000000000); // 0x1.8p52 - - const - C2 = reinterpret(0x3FDFFFFFFFFFFDBD), // __exp_data.poly[0] (0x1.ffffffffffdbdp-2) - C3 = reinterpret(0x3FC555555555543C), // __exp_data.poly[1] (0x1.555555555543cp-3) - C4 = reinterpret(0x3FA55555CF172B91), // __exp_data.poly[2] (0x1.55555cf172b91p-5) - C5 = reinterpret(0x3F81111167A4D017); // __exp_data.poly[3] (0x1.1111167a4d017p-7) - - var abstop: u32; - var ki: u64, top: u64, sbits: u64; - var idx: usize; - // double_t for better performance on targets with FLT_EVAL_METHOD==2. - var kd: f64, z: f64, r: f64, r2: f64, scale: f64, tail: f64, tmp: f64; - - var ux = reinterpret(x); - abstop = (ux >> 52) & 0x7FF; - if (abstop - 0x3C9 >= 0x03F) { - if (abstop - 0x3C9 >= 0x80000000) { - // Avoid spurious underflow for tiny x. - // Note: 0 is common input. - return select(-1.0, 1.0, sign_bias); - } - if (abstop >= 0x409) { // top12(1024.0) - // Note: inf and nan are already handled. - return ux >> 63 ? uflow(sign_bias) : oflow(sign_bias); - } - // Large x is special cased below. - abstop = 0; - } - - // exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]. - // x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N]. - z = InvLn2N * x; - -// #if TOINT_INTRINSICS -// kd = roundtoint(z); -// ki = converttoint(z); -// #elif EXP_USE_TOINT_NARROW -// // z - kd is in [-0.5-2^-16, 0.5] in all rounding modes. -// kd = eval_as_double(z + shift); -// ki = asuint64(kd) >> 16; -// kd = (double_t)(int32_t)ki; -// #else - // z - kd is in [-1, 1] in non-nearest rounding modes - kd = z + shift; - ki = reinterpret(kd); - kd -= shift; -// #endif - r = x + kd * NegLn2hiN + kd * NegLn2loN; - // The code assumes 2^-200 < |xtail| < 2^-8/N - r += xtail; - // 2^(k/N) ~= scale * (1 + tail) - idx = ((ki & N_MASK) << 1); - top = (ki + sign_bias) << (52 - EXP_TABLE_BITS); - - tail = reinterpret(load(changetype(EXP_DATA_TAB) + (idx << alignof()))); - // This is only a valid scale when -1023*N < k < 1024*N - sbits = load(changetype(EXP_DATA_TAB) + (idx << alignof()), 1 << alignof()) + top; - // exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (tail + exp(r) - 1). - // Evaluation is optimized assuming superscalar pipelined execution. - r2 = r * r; - // Without fma the worst case error is 0.25/N ulp larger. - // Worst case error is less than 0.5+1.11/N+(abs poly error * 2^53) ulp - tmp = tail + r + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5); - if (abstop == 0) return specialcase(tmp, sbits, ki); - scale = reinterpret(sbits); - // Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there - // is no spurious underflow here even without fma. - return scale + scale * tmp; -} - -// @ts-ignore: decorator -@inline -export function pow_lut(x: f64, y: f64): f64 { - const Ox1p52 = reinterpret(0x4330000000000000); // 0x1p52 - - var sign_bias: u32 = 0; - var ix = reinterpret(x); - var iy = reinterpret(y); - var topx = ix >> 52; - var topy = iy >> 52; - - if (topx - 0x001 >= 0x7FF - 0x001 || (topy & 0x7FF) - 0x3BE >= 0x43e - 0x3BE) { - // Note: if |y| > 1075 * ln2 * 2^53 ~= 0x1.749p62 then pow(x,y) = inf/0 - // and if |y| < 2^-54 / 1075 ~= 0x1.e7b6p-65 then pow(x,y) = +-1. - // Special cases: (x < 0x1p-126 or inf or nan) or - // (|y| < 0x1p-65 or |y| >= 0x1p63 or nan). - if (zeroinfnan(iy)) { - if ((iy << 1) == 0) return 1.0; - if (ix == 0x3FF0000000000000) return NaN; // original: 1.0 - if ((ix << 1) > 0xFFE0000000000000 || (iy << 1) > 0xFFE0000000000000) return x + y; - if ((ix << 1) == 0x7FE0000000000000) return NaN; // original: 1.0 - if (((ix << 1) < 0x7FE0000000000000) == !(iy >> 63)) return 0; // |x|<1 && y==inf or |x|>1 && y==-inf. - return y * y; - } - if (zeroinfnan(ix)) { - let x2 = x * x; - if (i32(ix >> 63) && checkint(iy) == 1) x2 = -x2; - return iy >> 63 ? 1 / x2 : x2; - } - // Here x and y are non-zero finite - if (ix >> 63) { - // Finite x < 0 - let yint = checkint(iy); - if (yint == 0) return (x - x) / (x - x); - if (yint == 1) sign_bias = SIGN_BIAS; - ix &= 0x7FFFFFFFFFFFFFFF; - topx &= 0x7FF; - } - if ((topy & 0x7FF) - 0x3BE >= 0x43E - 0x3BE) { - // Note: sign_bias == 0 here because y is not odd. - if (ix == 0x3FF0000000000000) return 1; - if ((topy & 0x7FF) < 0x3BE) return 1; // |y| < 2^-65, x^y ~= 1 + y*log(x). - return (ix > 0x3FF0000000000000) == (topy < 0x800) ? Infinity : 0; - } - if (topx == 0) { - // Normalize subnormal x so exponent becomes negative. - ix = reinterpret(x * Ox1p52); - ix &= 0x7FFFFFFFFFFFFFFF; - ix -= u64(52) << 52; - } - } - - var hi = log_inline(ix); - var lo = log_tail; - var ehi: f64, elo: f64; -// #if __FP_FAST_FMA -// ehi = y * hi; -// elo = y * lo + __builtin_fma(y, hi, -ehi); -// #else - var yhi = reinterpret(iy & 0xFFFFFFFFF8000000); - var ylo = y - yhi; - var lhi = reinterpret(reinterpret(hi) & 0xFFFFFFFFF8000000); - var llo = hi - lhi + lo; - ehi = yhi * lhi; - elo = ylo * lhi + y * llo; // |elo| < |ehi| * 2^-25. -// #endif - return exp_inline(ehi, elo, sign_bias); -} diff --git a/tests/compiler/binary.untouched.wat b/tests/compiler/binary.untouched.wat index 006f491026..dadafbef01 100644 --- a/tests/compiler/binary.untouched.wat +++ b/tests/compiler/binary.untouched.wat @@ -130,8 +130,8 @@ (local $24 f64) (local $25 f64) (local $26 f64) - (local $27 f64) - (local $28 f64) + (local $27 i32) + (local $28 i32) (local $29 f64) (local $30 f64) (local $31 f64) @@ -140,6 +140,10 @@ (local $34 f64) (local $35 f64) (local $36 f64) + (local $37 f64) + (local $38 f64) + (local $39 f64) + (local $40 i32) local.get $1 f64.abs f64.const 2 @@ -612,52 +616,52 @@ local.get $14 f64.const 1 f64.sub - local.set $22 - local.get $22 - local.get $22 + local.set $23 + local.get $23 + local.get $23 f64.mul f64.const 0.5 - local.get $22 + local.get $23 f64.const 0.3333333333333333 - local.get $22 + local.get $23 f64.const 0.25 f64.mul f64.sub f64.mul f64.sub f64.mul - local.set $25 + local.set $26 f64.const 1.4426950216293335 - local.get $22 + local.get $23 f64.mul - local.set $23 - local.get $22 + local.set $24 + local.get $23 f64.const 1.9259629911266175e-08 f64.mul - local.get $25 + local.get $26 f64.const 1.4426950408889634 f64.mul f64.sub - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 + local.set $18 + local.get $25 + local.get $18 local.get $24 - local.get $17 - local.get $23 f64.sub f64.sub - local.set $18 + local.set $19 else i32.const 0 - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.lt_s @@ -666,10 +670,10 @@ f64.const 9007199254740992 f64.mul local.set $14 - local.get $12 + local.get $28 i32.const 53 i32.sub - local.set $12 + local.set $28 local.get $14 i64.reinterpret_f64 i64.const 32 @@ -677,30 +681,30 @@ i32.wrap_i64 local.set $7 end - local.get $12 + local.get $28 local.get $7 i32.const 20 i32.shr_s i32.const 1023 i32.sub i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048575 i32.and - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 1072693248 i32.or local.set $7 - local.get $13 + local.get $27 i32.const 235662 i32.le_s if i32.const 0 local.set $10 else - local.get $13 + local.get $27 i32.const 767610 i32.lt_s if @@ -709,10 +713,10 @@ else i32.const 0 local.set $10 - local.get $12 + local.get $28 i32.const 1 i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.sub @@ -734,29 +738,29 @@ f64.const 1 local.get $10 select - local.set $32 + local.set $34 local.get $14 - local.get $32 + local.get $34 f64.sub - local.set $23 + local.set $24 f64.const 1 local.get $14 - local.get $32 + local.get $34 f64.add f64.div - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.mul - local.set $26 - local.get $26 - local.set $28 - local.get $28 + local.set $17 + local.get $17 + local.set $30 + local.get $30 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $28 + local.set $30 local.get $7 i32.const 1 i32.shr_s @@ -772,42 +776,42 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $30 + local.set $32 local.get $14 - local.get $30 local.get $32 + local.get $34 f64.sub f64.sub - local.set $31 + local.set $33 + local.get $25 local.get $24 - local.get $23 - local.get $28 local.get $30 + local.get $32 f64.mul f64.sub - local.get $28 - local.get $31 + local.get $30 + local.get $33 f64.mul f64.sub f64.mul - local.set $29 - local.get $26 - local.get $26 + local.set $31 + local.get $17 + local.get $17 f64.mul - local.set $27 - local.get $27 - local.get $27 + local.set $29 + local.get $29 + local.get $29 f64.mul f64.const 0.5999999999999946 - local.get $27 + local.get $29 f64.const 0.4285714285785502 - local.get $27 + local.get $29 f64.const 0.33333332981837743 - local.get $27 + local.get $29 f64.const 0.272728123808534 - local.get $27 + local.get $29 f64.const 0.23066074577556175 - local.get $27 + local.get $29 f64.const 0.20697501780033842 f64.mul f64.add @@ -820,143 +824,143 @@ f64.mul f64.add f64.mul - local.set $21 - local.get $21 - local.get $29 - local.get $28 - local.get $26 + local.set $22 + local.get $22 + local.get $31 + local.get $30 + local.get $17 f64.add f64.mul f64.add - local.set $21 - local.get $28 - local.get $28 + local.set $22 + local.get $30 + local.get $30 f64.mul - local.set $27 + local.set $29 f64.const 3 - local.get $27 + local.get $29 f64.add - local.get $21 + local.get $22 f64.add - local.set $30 - local.get $30 + local.set $32 + local.get $32 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $30 - local.get $21 - local.get $30 + local.set $32 + local.get $22 + local.get $32 f64.const 3 f64.sub - local.get $27 + local.get $29 f64.sub f64.sub - local.set $31 - local.get $28 - local.get $30 - f64.mul - local.set $23 - local.get $29 + local.set $33 local.get $30 + local.get $32 f64.mul + local.set $24 local.get $31 - local.get $26 + local.get $32 + f64.mul + local.get $33 + local.get $17 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $19 - local.get $19 + local.set $20 + local.get $20 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $19 + local.set $20 + local.get $25 + local.get $20 local.get $24 - local.get $19 - local.get $23 f64.sub f64.sub - local.set $20 + local.set $21 f64.const 0.9617967009544373 - local.get $19 + local.get $20 f64.mul - local.set $33 + local.set $35 f64.const 1.350039202129749e-08 f64.const 0 local.get $10 select - local.set $34 + local.set $36 f64.const -7.028461650952758e-09 - local.get $19 - f64.mul local.get $20 + f64.mul + local.get $21 f64.const 0.9617966939259756 f64.mul f64.add - local.get $34 + local.get $36 f64.add - local.set $35 - local.get $12 + local.set $37 + local.get $28 f64.convert_i32_s - local.set $22 + local.set $23 f64.const 0.5849624872207642 f64.const 0 local.get $10 select - local.set $36 - local.get $33 + local.set $38 local.get $35 + local.get $37 f64.add - local.get $36 + local.get $38 f64.add - local.get $22 + local.get $23 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 - local.get $35 - local.get $17 - local.get $22 + local.set $18 + local.get $37 + local.get $18 + local.get $23 f64.sub - local.get $36 + local.get $38 f64.sub - local.get $33 + local.get $35 f64.sub f64.sub - local.set $18 + local.set $19 end local.get $1 - local.set $36 - local.get $36 + local.set $39 + local.get $39 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $36 + local.set $39 local.get $1 - local.get $36 + local.get $39 f64.sub - local.get $17 + local.get $18 f64.mul local.get $1 - local.get $18 + local.get $19 f64.mul f64.add - local.set $20 - local.get $36 - local.get $17 + local.set $21 + local.get $39 + local.get $18 f64.mul - local.set $19 + local.set $20 + local.get $21 local.get $20 - local.get $19 f64.add local.set $15 local.get $15 @@ -966,18 +970,18 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 + local.set $27 local.get $2 i32.wrap_i64 - local.set $11 - local.get $13 + local.set $40 + local.get $27 i32.const 1083179008 i32.ge_s if - local.get $13 + local.get $27 i32.const 1083179008 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -989,11 +993,11 @@ f64.mul return end - local.get $20 + local.get $21 f64.const 8.008566259537294e-17 f64.add local.get $15 - local.get $19 + local.get $20 f64.sub f64.gt if @@ -1005,16 +1009,16 @@ return end else - local.get $13 + local.get $27 i32.const 2147483647 i32.and i32.const 1083231232 i32.ge_s if - local.get $13 + local.get $27 i32.const -1064252416 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -1026,9 +1030,9 @@ f64.mul return end - local.get $20 + local.get $21 local.get $15 - local.get $19 + local.get $20 f64.sub f64.le if @@ -1041,31 +1045,31 @@ end end end - local.get $13 + local.get $27 i32.const 2147483647 i32.and - local.set $11 - local.get $11 + local.set $40 + local.get $40 i32.const 20 i32.shr_s i32.const 1023 i32.sub local.set $10 i32.const 0 - local.set $12 - local.get $11 + local.set $28 + local.get $40 i32.const 1071644672 i32.gt_s if - local.get $13 + local.get $27 i32.const 1048576 local.get $10 i32.const 1 i32.add i32.shr_s i32.add - local.set $12 - local.get $12 + local.set $28 + local.get $28 i32.const 2147483647 i32.and i32.const 20 @@ -1074,8 +1078,8 @@ i32.sub local.set $10 f64.const 0 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 local.get $10 i32.shr_s @@ -1086,8 +1090,8 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 i32.and i32.const 1048576 @@ -1096,71 +1100,71 @@ local.get $10 i32.sub i32.shr_s - local.set $12 - local.get $13 + local.set $28 + local.get $27 i32.const 0 i32.lt_s if i32.const 0 - local.get $12 + local.get $28 i32.sub - local.set $12 + local.set $28 end - local.get $19 - local.get $22 + local.get $20 + local.get $23 f64.sub - local.set $19 + local.set $20 end + local.get $21 local.get $20 - local.get $19 f64.add - local.set $22 - local.get $22 + local.set $23 + local.get $23 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $22 - local.get $22 + local.set $23 + local.get $23 f64.const 0.6931471824645996 f64.mul - local.set $23 + local.set $24 + local.get $21 + local.get $23 local.get $20 - local.get $22 - local.get $19 f64.sub f64.sub f64.const 0.6931471805599453 f64.mul - local.get $22 + local.get $23 f64.const -1.904654299957768e-09 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add local.set $15 - local.get $24 + local.get $25 local.get $15 - local.get $23 + local.get $24 f64.sub f64.sub - local.set $25 + local.set $26 local.get $15 local.get $15 f64.mul - local.set $22 + local.set $23 local.get $15 - local.get $22 + local.get $23 f64.const 0.16666666666666602 - local.get $22 + local.get $23 f64.const -2.7777777777015593e-03 - local.get $22 + local.get $23 f64.const 6.613756321437934e-05 - local.get $22 + local.get $23 f64.const -1.6533902205465252e-06 - local.get $22 + local.get $23 f64.const 4.1381367970572385e-08 f64.mul f64.add @@ -1172,23 +1176,23 @@ f64.add f64.mul f64.sub - local.set $17 + local.set $18 local.get $15 - local.get $17 + local.get $18 f64.mul - local.get $17 + local.get $18 f64.const 2 f64.sub f64.div - local.get $25 + local.get $26 local.get $15 - local.get $25 + local.get $26 f64.mul f64.add f64.sub - local.set $21 + local.set $22 f64.const 1 - local.get $21 + local.get $22 local.get $15 f64.sub f64.sub @@ -1198,21 +1202,21 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 - local.get $13 - local.get $12 + local.set $27 + local.get $27 + local.get $28 i32.const 20 i32.shl i32.add - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 20 i32.shr_s i32.const 0 i32.le_s if local.get $15 - local.get $12 + local.get $28 call $~lib/math/NativeMath.scalbn local.set $15 else @@ -1220,7 +1224,7 @@ i64.reinterpret_f64 i64.const 4294967295 i64.and - local.get $13 + local.get $27 i64.extend_i32_s i64.const 32 i64.shl @@ -1231,7 +1235,6 @@ local.get $16 local.get $15 f64.mul - return ) (func $~lib/math/NativeMathf.mod (; 2 ;) (param $0 f32) (param $1 f32) (result f32) (local $2 i32) diff --git a/tests/compiler/mandelbrot.untouched.wat b/tests/compiler/mandelbrot.untouched.wat index f54940891c..9a22c3c314 100644 --- a/tests/compiler/mandelbrot.untouched.wat +++ b/tests/compiler/mandelbrot.untouched.wat @@ -214,7 +214,6 @@ f64.const 0.6931471803691238 f64.mul f64.add - return ) (func $~lib/math/NativeMath.log2 (; 1 ;) (param $0 f64) (result f64) (local $1 i64) @@ -468,7 +467,6 @@ local.get $15 local.get $14 f64.add - return ) (func $../../examples/mandelbrot/assembly/index/computeLine (; 2 ;) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (local $4 f64) diff --git a/tests/compiler/resolve-binary.untouched.wat b/tests/compiler/resolve-binary.untouched.wat index 8795682e7f..8aec85024e 100644 --- a/tests/compiler/resolve-binary.untouched.wat +++ b/tests/compiler/resolve-binary.untouched.wat @@ -776,8 +776,8 @@ (local $24 f64) (local $25 f64) (local $26 f64) - (local $27 f64) - (local $28 f64) + (local $27 i32) + (local $28 i32) (local $29 f64) (local $30 f64) (local $31 f64) @@ -786,6 +786,10 @@ (local $34 f64) (local $35 f64) (local $36 f64) + (local $37 f64) + (local $38 f64) + (local $39 f64) + (local $40 i32) local.get $1 f64.abs f64.const 2 @@ -1258,52 +1262,52 @@ local.get $14 f64.const 1 f64.sub - local.set $22 - local.get $22 - local.get $22 + local.set $23 + local.get $23 + local.get $23 f64.mul f64.const 0.5 - local.get $22 + local.get $23 f64.const 0.3333333333333333 - local.get $22 + local.get $23 f64.const 0.25 f64.mul f64.sub f64.mul f64.sub f64.mul - local.set $25 + local.set $26 f64.const 1.4426950216293335 - local.get $22 + local.get $23 f64.mul - local.set $23 - local.get $22 + local.set $24 + local.get $23 f64.const 1.9259629911266175e-08 f64.mul - local.get $25 + local.get $26 f64.const 1.4426950408889634 f64.mul f64.sub - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 + local.set $18 + local.get $25 + local.get $18 local.get $24 - local.get $17 - local.get $23 f64.sub f64.sub - local.set $18 + local.set $19 else i32.const 0 - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.lt_s @@ -1312,10 +1316,10 @@ f64.const 9007199254740992 f64.mul local.set $14 - local.get $12 + local.get $28 i32.const 53 i32.sub - local.set $12 + local.set $28 local.get $14 i64.reinterpret_f64 i64.const 32 @@ -1323,30 +1327,30 @@ i32.wrap_i64 local.set $7 end - local.get $12 + local.get $28 local.get $7 i32.const 20 i32.shr_s i32.const 1023 i32.sub i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048575 i32.and - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 1072693248 i32.or local.set $7 - local.get $13 + local.get $27 i32.const 235662 i32.le_s if i32.const 0 local.set $10 else - local.get $13 + local.get $27 i32.const 767610 i32.lt_s if @@ -1355,10 +1359,10 @@ else i32.const 0 local.set $10 - local.get $12 + local.get $28 i32.const 1 i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.sub @@ -1380,29 +1384,29 @@ f64.const 1 local.get $10 select - local.set $32 + local.set $34 local.get $14 - local.get $32 + local.get $34 f64.sub - local.set $23 + local.set $24 f64.const 1 local.get $14 - local.get $32 + local.get $34 f64.add f64.div - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.mul - local.set $26 - local.get $26 - local.set $28 - local.get $28 + local.set $17 + local.get $17 + local.set $30 + local.get $30 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $28 + local.set $30 local.get $7 i32.const 1 i32.shr_s @@ -1418,42 +1422,42 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $30 + local.set $32 local.get $14 - local.get $30 local.get $32 + local.get $34 f64.sub f64.sub - local.set $31 + local.set $33 + local.get $25 local.get $24 - local.get $23 - local.get $28 local.get $30 + local.get $32 f64.mul f64.sub - local.get $28 - local.get $31 + local.get $30 + local.get $33 f64.mul f64.sub f64.mul - local.set $29 - local.get $26 - local.get $26 + local.set $31 + local.get $17 + local.get $17 f64.mul - local.set $27 - local.get $27 - local.get $27 + local.set $29 + local.get $29 + local.get $29 f64.mul f64.const 0.5999999999999946 - local.get $27 + local.get $29 f64.const 0.4285714285785502 - local.get $27 + local.get $29 f64.const 0.33333332981837743 - local.get $27 + local.get $29 f64.const 0.272728123808534 - local.get $27 + local.get $29 f64.const 0.23066074577556175 - local.get $27 + local.get $29 f64.const 0.20697501780033842 f64.mul f64.add @@ -1466,143 +1470,143 @@ f64.mul f64.add f64.mul - local.set $21 - local.get $21 - local.get $29 - local.get $28 - local.get $26 + local.set $22 + local.get $22 + local.get $31 + local.get $30 + local.get $17 f64.add f64.mul f64.add - local.set $21 - local.get $28 - local.get $28 + local.set $22 + local.get $30 + local.get $30 f64.mul - local.set $27 + local.set $29 f64.const 3 - local.get $27 + local.get $29 f64.add - local.get $21 + local.get $22 f64.add - local.set $30 - local.get $30 + local.set $32 + local.get $32 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $30 - local.get $21 - local.get $30 + local.set $32 + local.get $22 + local.get $32 f64.const 3 f64.sub - local.get $27 + local.get $29 f64.sub f64.sub - local.set $31 - local.get $28 - local.get $30 - f64.mul - local.set $23 - local.get $29 + local.set $33 local.get $30 + local.get $32 f64.mul + local.set $24 local.get $31 - local.get $26 + local.get $32 + f64.mul + local.get $33 + local.get $17 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $19 - local.get $19 + local.set $20 + local.get $20 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $19 + local.set $20 + local.get $25 + local.get $20 local.get $24 - local.get $19 - local.get $23 f64.sub f64.sub - local.set $20 + local.set $21 f64.const 0.9617967009544373 - local.get $19 + local.get $20 f64.mul - local.set $33 + local.set $35 f64.const 1.350039202129749e-08 f64.const 0 local.get $10 select - local.set $34 + local.set $36 f64.const -7.028461650952758e-09 - local.get $19 - f64.mul local.get $20 + f64.mul + local.get $21 f64.const 0.9617966939259756 f64.mul f64.add - local.get $34 + local.get $36 f64.add - local.set $35 - local.get $12 + local.set $37 + local.get $28 f64.convert_i32_s - local.set $22 + local.set $23 f64.const 0.5849624872207642 f64.const 0 local.get $10 select - local.set $36 - local.get $33 + local.set $38 local.get $35 + local.get $37 f64.add - local.get $36 + local.get $38 f64.add - local.get $22 + local.get $23 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 - local.get $35 - local.get $17 - local.get $22 + local.set $18 + local.get $37 + local.get $18 + local.get $23 f64.sub - local.get $36 + local.get $38 f64.sub - local.get $33 + local.get $35 f64.sub f64.sub - local.set $18 + local.set $19 end local.get $1 - local.set $36 - local.get $36 + local.set $39 + local.get $39 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $36 + local.set $39 local.get $1 - local.get $36 + local.get $39 f64.sub - local.get $17 + local.get $18 f64.mul local.get $1 - local.get $18 + local.get $19 f64.mul f64.add - local.set $20 - local.get $36 - local.get $17 + local.set $21 + local.get $39 + local.get $18 f64.mul - local.set $19 + local.set $20 + local.get $21 local.get $20 - local.get $19 f64.add local.set $15 local.get $15 @@ -1612,18 +1616,18 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 + local.set $27 local.get $2 i32.wrap_i64 - local.set $11 - local.get $13 + local.set $40 + local.get $27 i32.const 1083179008 i32.ge_s if - local.get $13 + local.get $27 i32.const 1083179008 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -1635,11 +1639,11 @@ f64.mul return end - local.get $20 + local.get $21 f64.const 8.008566259537294e-17 f64.add local.get $15 - local.get $19 + local.get $20 f64.sub f64.gt if @@ -1651,16 +1655,16 @@ return end else - local.get $13 + local.get $27 i32.const 2147483647 i32.and i32.const 1083231232 i32.ge_s if - local.get $13 + local.get $27 i32.const -1064252416 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -1672,9 +1676,9 @@ f64.mul return end - local.get $20 + local.get $21 local.get $15 - local.get $19 + local.get $20 f64.sub f64.le if @@ -1687,31 +1691,31 @@ end end end - local.get $13 + local.get $27 i32.const 2147483647 i32.and - local.set $11 - local.get $11 + local.set $40 + local.get $40 i32.const 20 i32.shr_s i32.const 1023 i32.sub local.set $10 i32.const 0 - local.set $12 - local.get $11 + local.set $28 + local.get $40 i32.const 1071644672 i32.gt_s if - local.get $13 + local.get $27 i32.const 1048576 local.get $10 i32.const 1 i32.add i32.shr_s i32.add - local.set $12 - local.get $12 + local.set $28 + local.get $28 i32.const 2147483647 i32.and i32.const 20 @@ -1720,8 +1724,8 @@ i32.sub local.set $10 f64.const 0 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 local.get $10 i32.shr_s @@ -1732,8 +1736,8 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 i32.and i32.const 1048576 @@ -1742,71 +1746,71 @@ local.get $10 i32.sub i32.shr_s - local.set $12 - local.get $13 + local.set $28 + local.get $27 i32.const 0 i32.lt_s if i32.const 0 - local.get $12 + local.get $28 i32.sub - local.set $12 + local.set $28 end - local.get $19 - local.get $22 + local.get $20 + local.get $23 f64.sub - local.set $19 + local.set $20 end + local.get $21 local.get $20 - local.get $19 f64.add - local.set $22 - local.get $22 + local.set $23 + local.get $23 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $22 - local.get $22 + local.set $23 + local.get $23 f64.const 0.6931471824645996 f64.mul - local.set $23 + local.set $24 + local.get $21 + local.get $23 local.get $20 - local.get $22 - local.get $19 f64.sub f64.sub f64.const 0.6931471805599453 f64.mul - local.get $22 + local.get $23 f64.const -1.904654299957768e-09 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add local.set $15 - local.get $24 + local.get $25 local.get $15 - local.get $23 + local.get $24 f64.sub f64.sub - local.set $25 + local.set $26 local.get $15 local.get $15 f64.mul - local.set $22 + local.set $23 local.get $15 - local.get $22 + local.get $23 f64.const 0.16666666666666602 - local.get $22 + local.get $23 f64.const -2.7777777777015593e-03 - local.get $22 + local.get $23 f64.const 6.613756321437934e-05 - local.get $22 + local.get $23 f64.const -1.6533902205465252e-06 - local.get $22 + local.get $23 f64.const 4.1381367970572385e-08 f64.mul f64.add @@ -1818,23 +1822,23 @@ f64.add f64.mul f64.sub - local.set $17 + local.set $18 local.get $15 - local.get $17 + local.get $18 f64.mul - local.get $17 + local.get $18 f64.const 2 f64.sub f64.div - local.get $25 + local.get $26 local.get $15 - local.get $25 + local.get $26 f64.mul f64.add f64.sub - local.set $21 + local.set $22 f64.const 1 - local.get $21 + local.get $22 local.get $15 f64.sub f64.sub @@ -1844,21 +1848,21 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 - local.get $13 - local.get $12 + local.set $27 + local.get $27 + local.get $28 i32.const 20 i32.shl i32.add - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 20 i32.shr_s i32.const 0 i32.le_s if local.get $15 - local.get $12 + local.get $28 call $~lib/math/NativeMath.scalbn local.set $15 else @@ -1866,7 +1870,7 @@ i64.reinterpret_f64 i64.const 4294967295 i64.and - local.get $13 + local.get $27 i64.extend_i32_s i64.const 32 i64.shl @@ -1877,7 +1881,6 @@ local.get $16 local.get $15 f64.mul - return ) (func $~lib/util/number/genDigits (; 16 ;) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) (local $7 i32) diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index b97f9fbd68..bc57e0fd38 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -4224,7 +4224,7 @@ if i32.const 0 i32.const 4032 - i32.const 1411 + i32.const 1381 i32.const 4 call $~lib/builtins/abort unreachable @@ -5691,7 +5691,7 @@ if i32.const 4864 i32.const 4032 - i32.const 1418 + i32.const 1388 i32.const 24 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index d0363e5fd5..086cd2fcff 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -7004,7 +7004,7 @@ if i32.const 0 i32.const 4032 - i32.const 1411 + i32.const 1381 i32.const 4 call $~lib/builtins/abort unreachable @@ -9274,7 +9274,7 @@ if i32.const 4864 i32.const 4032 - i32.const 1418 + i32.const 1388 i32.const 24 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/libm.untouched.wat b/tests/compiler/std/libm.untouched.wat index a9c2383973..0cc9ed5453 100644 --- a/tests/compiler/std/libm.untouched.wat +++ b/tests/compiler/std/libm.untouched.wat @@ -796,7 +796,6 @@ f64.const 0.6931471803691238 f64.mul f64.add - return ) (func $~lib/math/NativeMath.acosh (; 6 ;) (param $0 f64) (result f64) (local $1 i64) @@ -3471,7 +3470,6 @@ local.get $5 call $~lib/math/NativeMath.scalbn end - return ) (func $~lib/math/NativeMath.cosh (; 30 ;) (param $0 f64) (result f64) (local $1 i64) @@ -4340,7 +4338,6 @@ local.get $15 local.get $14 f64.add - return ) (func $../../lib/libm/assembly/libm/log2 (; 45 ;) (param $0 f64) (result f64) local.get $0 @@ -4394,8 +4391,8 @@ (local $24 f64) (local $25 f64) (local $26 f64) - (local $27 f64) - (local $28 f64) + (local $27 i32) + (local $28 i32) (local $29 f64) (local $30 f64) (local $31 f64) @@ -4404,6 +4401,10 @@ (local $34 f64) (local $35 f64) (local $36 f64) + (local $37 f64) + (local $38 f64) + (local $39 f64) + (local $40 i32) local.get $1 f64.abs f64.const 2 @@ -4876,52 +4877,52 @@ local.get $14 f64.const 1 f64.sub - local.set $22 - local.get $22 - local.get $22 + local.set $23 + local.get $23 + local.get $23 f64.mul f64.const 0.5 - local.get $22 + local.get $23 f64.const 0.3333333333333333 - local.get $22 + local.get $23 f64.const 0.25 f64.mul f64.sub f64.mul f64.sub f64.mul - local.set $25 + local.set $26 f64.const 1.4426950216293335 - local.get $22 + local.get $23 f64.mul - local.set $23 - local.get $22 + local.set $24 + local.get $23 f64.const 1.9259629911266175e-08 f64.mul - local.get $25 + local.get $26 f64.const 1.4426950408889634 f64.mul f64.sub - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 + local.set $18 + local.get $25 + local.get $18 local.get $24 - local.get $17 - local.get $23 f64.sub f64.sub - local.set $18 + local.set $19 else i32.const 0 - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.lt_s @@ -4930,10 +4931,10 @@ f64.const 9007199254740992 f64.mul local.set $14 - local.get $12 + local.get $28 i32.const 53 i32.sub - local.set $12 + local.set $28 local.get $14 i64.reinterpret_f64 i64.const 32 @@ -4941,30 +4942,30 @@ i32.wrap_i64 local.set $7 end - local.get $12 + local.get $28 local.get $7 i32.const 20 i32.shr_s i32.const 1023 i32.sub i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048575 i32.and - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 1072693248 i32.or local.set $7 - local.get $13 + local.get $27 i32.const 235662 i32.le_s if i32.const 0 local.set $10 else - local.get $13 + local.get $27 i32.const 767610 i32.lt_s if @@ -4973,10 +4974,10 @@ else i32.const 0 local.set $10 - local.get $12 + local.get $28 i32.const 1 i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.sub @@ -4998,29 +4999,29 @@ f64.const 1 local.get $10 select - local.set $32 + local.set $34 local.get $14 - local.get $32 + local.get $34 f64.sub - local.set $23 + local.set $24 f64.const 1 local.get $14 - local.get $32 + local.get $34 f64.add f64.div - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.mul - local.set $26 - local.get $26 - local.set $28 - local.get $28 + local.set $17 + local.get $17 + local.set $30 + local.get $30 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $28 + local.set $30 local.get $7 i32.const 1 i32.shr_s @@ -5036,42 +5037,42 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $30 + local.set $32 local.get $14 - local.get $30 local.get $32 + local.get $34 f64.sub f64.sub - local.set $31 + local.set $33 + local.get $25 local.get $24 - local.get $23 - local.get $28 local.get $30 + local.get $32 f64.mul f64.sub - local.get $28 - local.get $31 + local.get $30 + local.get $33 f64.mul f64.sub f64.mul - local.set $29 - local.get $26 - local.get $26 + local.set $31 + local.get $17 + local.get $17 f64.mul - local.set $27 - local.get $27 - local.get $27 + local.set $29 + local.get $29 + local.get $29 f64.mul f64.const 0.5999999999999946 - local.get $27 + local.get $29 f64.const 0.4285714285785502 - local.get $27 + local.get $29 f64.const 0.33333332981837743 - local.get $27 + local.get $29 f64.const 0.272728123808534 - local.get $27 + local.get $29 f64.const 0.23066074577556175 - local.get $27 + local.get $29 f64.const 0.20697501780033842 f64.mul f64.add @@ -5084,143 +5085,143 @@ f64.mul f64.add f64.mul - local.set $21 - local.get $21 - local.get $29 - local.get $28 - local.get $26 + local.set $22 + local.get $22 + local.get $31 + local.get $30 + local.get $17 f64.add f64.mul f64.add - local.set $21 - local.get $28 - local.get $28 + local.set $22 + local.get $30 + local.get $30 f64.mul - local.set $27 + local.set $29 f64.const 3 - local.get $27 + local.get $29 f64.add - local.get $21 + local.get $22 f64.add - local.set $30 - local.get $30 + local.set $32 + local.get $32 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $30 - local.get $21 - local.get $30 + local.set $32 + local.get $22 + local.get $32 f64.const 3 f64.sub - local.get $27 + local.get $29 f64.sub f64.sub - local.set $31 - local.get $28 - local.get $30 - f64.mul - local.set $23 - local.get $29 + local.set $33 local.get $30 + local.get $32 f64.mul + local.set $24 local.get $31 - local.get $26 + local.get $32 + f64.mul + local.get $33 + local.get $17 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $19 - local.get $19 + local.set $20 + local.get $20 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $19 + local.set $20 + local.get $25 + local.get $20 local.get $24 - local.get $19 - local.get $23 f64.sub f64.sub - local.set $20 + local.set $21 f64.const 0.9617967009544373 - local.get $19 + local.get $20 f64.mul - local.set $33 + local.set $35 f64.const 1.350039202129749e-08 f64.const 0 local.get $10 select - local.set $34 + local.set $36 f64.const -7.028461650952758e-09 - local.get $19 - f64.mul local.get $20 + f64.mul + local.get $21 f64.const 0.9617966939259756 f64.mul f64.add - local.get $34 + local.get $36 f64.add - local.set $35 - local.get $12 + local.set $37 + local.get $28 f64.convert_i32_s - local.set $22 + local.set $23 f64.const 0.5849624872207642 f64.const 0 local.get $10 select - local.set $36 - local.get $33 + local.set $38 local.get $35 + local.get $37 f64.add - local.get $36 + local.get $38 f64.add - local.get $22 + local.get $23 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 - local.get $35 - local.get $17 - local.get $22 + local.set $18 + local.get $37 + local.get $18 + local.get $23 f64.sub - local.get $36 + local.get $38 f64.sub - local.get $33 + local.get $35 f64.sub f64.sub - local.set $18 + local.set $19 end local.get $1 - local.set $36 - local.get $36 + local.set $39 + local.get $39 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $36 + local.set $39 local.get $1 - local.get $36 + local.get $39 f64.sub - local.get $17 + local.get $18 f64.mul local.get $1 - local.get $18 + local.get $19 f64.mul f64.add - local.set $20 - local.get $36 - local.get $17 + local.set $21 + local.get $39 + local.get $18 f64.mul - local.set $19 + local.set $20 + local.get $21 local.get $20 - local.get $19 f64.add local.set $15 local.get $15 @@ -5230,18 +5231,18 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 + local.set $27 local.get $2 i32.wrap_i64 - local.set $11 - local.get $13 + local.set $40 + local.get $27 i32.const 1083179008 i32.ge_s if - local.get $13 + local.get $27 i32.const 1083179008 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -5253,11 +5254,11 @@ f64.mul return end - local.get $20 + local.get $21 f64.const 8.008566259537294e-17 f64.add local.get $15 - local.get $19 + local.get $20 f64.sub f64.gt if @@ -5269,16 +5270,16 @@ return end else - local.get $13 + local.get $27 i32.const 2147483647 i32.and i32.const 1083231232 i32.ge_s if - local.get $13 + local.get $27 i32.const -1064252416 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -5290,9 +5291,9 @@ f64.mul return end - local.get $20 + local.get $21 local.get $15 - local.get $19 + local.get $20 f64.sub f64.le if @@ -5305,31 +5306,31 @@ end end end - local.get $13 + local.get $27 i32.const 2147483647 i32.and - local.set $11 - local.get $11 + local.set $40 + local.get $40 i32.const 20 i32.shr_s i32.const 1023 i32.sub local.set $10 i32.const 0 - local.set $12 - local.get $11 + local.set $28 + local.get $40 i32.const 1071644672 i32.gt_s if - local.get $13 + local.get $27 i32.const 1048576 local.get $10 i32.const 1 i32.add i32.shr_s i32.add - local.set $12 - local.get $12 + local.set $28 + local.get $28 i32.const 2147483647 i32.and i32.const 20 @@ -5338,8 +5339,8 @@ i32.sub local.set $10 f64.const 0 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 local.get $10 i32.shr_s @@ -5350,8 +5351,8 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 i32.and i32.const 1048576 @@ -5360,71 +5361,71 @@ local.get $10 i32.sub i32.shr_s - local.set $12 - local.get $13 + local.set $28 + local.get $27 i32.const 0 i32.lt_s if i32.const 0 - local.get $12 + local.get $28 i32.sub - local.set $12 + local.set $28 end - local.get $19 - local.get $22 + local.get $20 + local.get $23 f64.sub - local.set $19 + local.set $20 end + local.get $21 local.get $20 - local.get $19 f64.add - local.set $22 - local.get $22 + local.set $23 + local.get $23 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $22 - local.get $22 + local.set $23 + local.get $23 f64.const 0.6931471824645996 f64.mul - local.set $23 + local.set $24 + local.get $21 + local.get $23 local.get $20 - local.get $22 - local.get $19 f64.sub f64.sub f64.const 0.6931471805599453 f64.mul - local.get $22 + local.get $23 f64.const -1.904654299957768e-09 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add local.set $15 - local.get $24 + local.get $25 local.get $15 - local.get $23 + local.get $24 f64.sub f64.sub - local.set $25 + local.set $26 local.get $15 local.get $15 f64.mul - local.set $22 + local.set $23 local.get $15 - local.get $22 + local.get $23 f64.const 0.16666666666666602 - local.get $22 + local.get $23 f64.const -2.7777777777015593e-03 - local.get $22 + local.get $23 f64.const 6.613756321437934e-05 - local.get $22 + local.get $23 f64.const -1.6533902205465252e-06 - local.get $22 + local.get $23 f64.const 4.1381367970572385e-08 f64.mul f64.add @@ -5436,23 +5437,23 @@ f64.add f64.mul f64.sub - local.set $17 + local.set $18 local.get $15 - local.get $17 + local.get $18 f64.mul - local.get $17 + local.get $18 f64.const 2 f64.sub f64.div - local.get $25 + local.get $26 local.get $15 - local.get $25 + local.get $26 f64.mul f64.add f64.sub - local.set $21 + local.set $22 f64.const 1 - local.get $21 + local.get $22 local.get $15 f64.sub f64.sub @@ -5462,21 +5463,21 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 - local.get $13 - local.get $12 + local.set $27 + local.get $27 + local.get $28 i32.const 20 i32.shl i32.add - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 20 i32.shr_s i32.const 0 i32.le_s if local.get $15 - local.get $12 + local.get $28 call $~lib/math/NativeMath.scalbn local.set $15 else @@ -5484,7 +5485,7 @@ i64.reinterpret_f64 i64.const 4294967295 i64.and - local.get $13 + local.get $27 i64.extend_i32_s i64.const 32 i64.shl @@ -5495,7 +5496,6 @@ local.get $16 local.get $15 f64.mul - return ) (func $../../lib/libm/assembly/libm/pow (; 49 ;) (param $0 f64) (param $1 f64) (result f64) local.get $0 @@ -7362,7 +7362,6 @@ f32.const 0.6931381225585938 f32.mul f32.add - return ) (func $~lib/math/NativeMathf.acosh (; 69 ;) (param $0 f32) (result f32) (local $1 i32) @@ -9457,7 +9456,6 @@ local.get $5 call $~lib/math/NativeMathf.scalbn end - return ) (func $~lib/math/NativeMathf.cosh (; 91 ;) (param $0 f32) (result f32) (local $1 i32) @@ -10121,7 +10119,6 @@ f32.add local.get $14 f32.add - return ) (func $../../lib/libm/assembly/libmf/log2 (; 105 ;) (param $0 f32) (result f32) local.get $0 diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index e131578265..633e9a775a 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -8706,7 +8706,7 @@ if i32.const 0 i32.const 336 - i32.const 1411 + i32.const 1381 i32.const 4 call $~lib/builtins/abort unreachable @@ -8720,7 +8720,7 @@ if i32.const 384 i32.const 336 - i32.const 1418 + i32.const 1388 i32.const 24 call $~lib/builtins/abort unreachable @@ -8764,7 +8764,7 @@ if i32.const 384 i32.const 336 - i32.const 2800 + i32.const 2750 i32.const 24 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/math.untouched.wat b/tests/compiler/std/math.untouched.wat index 59e9b16cdb..6c8196486b 100644 --- a/tests/compiler/std/math.untouched.wat +++ b/tests/compiler/std/math.untouched.wat @@ -1479,7 +1479,6 @@ f64.const 0.6931471803691238 f64.mul f64.add - return ) (func $~lib/math/NativeMath.acosh (; 52 ;) (param $0 f64) (result f64) (local $1 i64) @@ -1941,7 +1940,6 @@ f32.const 0.6931381225585938 f32.mul f32.add - return ) (func $~lib/math/NativeMathf.acosh (; 56 ;) (param $0 f32) (result f32) (local $1 i32) @@ -6106,7 +6104,6 @@ local.get $5 call $~lib/math/NativeMath.scalbn end - return ) (func $~lib/math/NativeMath.cosh (; 91 ;) (param $0 f64) (result f64) (local $1 i64) @@ -6664,7 +6661,6 @@ local.get $5 call $~lib/math/NativeMathf.scalbn end - return ) (func $~lib/math/NativeMathf.cosh (; 95 ;) (param $0 f32) (result f32) (local $1 i32) @@ -7991,7 +7987,6 @@ local.get $15 local.get $14 f64.add - return ) (func $std/math/test_log2 (; 116 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 i32) (result i32) local.get $0 @@ -8211,7 +8206,6 @@ f32.add local.get $14 f32.add - return ) (func $std/math/test_log2f (; 118 ;) (param $0 f32) (param $1 f32) (param $2 f32) (param $3 i32) (result i32) local.get $0 @@ -8878,8 +8872,8 @@ (local $24 f64) (local $25 f64) (local $26 f64) - (local $27 f64) - (local $28 f64) + (local $27 i32) + (local $28 i32) (local $29 f64) (local $30 f64) (local $31 f64) @@ -8888,6 +8882,10 @@ (local $34 f64) (local $35 f64) (local $36 f64) + (local $37 f64) + (local $38 f64) + (local $39 f64) + (local $40 i32) local.get $1 f64.abs f64.const 2 @@ -9360,52 +9358,52 @@ local.get $14 f64.const 1 f64.sub - local.set $22 - local.get $22 - local.get $22 + local.set $23 + local.get $23 + local.get $23 f64.mul f64.const 0.5 - local.get $22 + local.get $23 f64.const 0.3333333333333333 - local.get $22 + local.get $23 f64.const 0.25 f64.mul f64.sub f64.mul f64.sub f64.mul - local.set $25 + local.set $26 f64.const 1.4426950216293335 - local.get $22 + local.get $23 f64.mul - local.set $23 - local.get $22 + local.set $24 + local.get $23 f64.const 1.9259629911266175e-08 f64.mul - local.get $25 + local.get $26 f64.const 1.4426950408889634 f64.mul f64.sub - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 + local.set $18 + local.get $25 + local.get $18 local.get $24 - local.get $17 - local.get $23 f64.sub f64.sub - local.set $18 + local.set $19 else i32.const 0 - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.lt_s @@ -9414,10 +9412,10 @@ f64.const 9007199254740992 f64.mul local.set $14 - local.get $12 + local.get $28 i32.const 53 i32.sub - local.set $12 + local.set $28 local.get $14 i64.reinterpret_f64 i64.const 32 @@ -9425,30 +9423,30 @@ i32.wrap_i64 local.set $7 end - local.get $12 + local.get $28 local.get $7 i32.const 20 i32.shr_s i32.const 1023 i32.sub i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048575 i32.and - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 1072693248 i32.or local.set $7 - local.get $13 + local.get $27 i32.const 235662 i32.le_s if i32.const 0 local.set $10 else - local.get $13 + local.get $27 i32.const 767610 i32.lt_s if @@ -9457,10 +9455,10 @@ else i32.const 0 local.set $10 - local.get $12 + local.get $28 i32.const 1 i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.sub @@ -9482,29 +9480,29 @@ f64.const 1 local.get $10 select - local.set $32 + local.set $34 local.get $14 - local.get $32 + local.get $34 f64.sub - local.set $23 + local.set $24 f64.const 1 local.get $14 - local.get $32 + local.get $34 f64.add f64.div - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.mul - local.set $26 - local.get $26 - local.set $28 - local.get $28 + local.set $17 + local.get $17 + local.set $30 + local.get $30 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $28 + local.set $30 local.get $7 i32.const 1 i32.shr_s @@ -9520,42 +9518,42 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $30 + local.set $32 local.get $14 - local.get $30 local.get $32 + local.get $34 f64.sub f64.sub - local.set $31 + local.set $33 + local.get $25 local.get $24 - local.get $23 - local.get $28 local.get $30 + local.get $32 f64.mul f64.sub - local.get $28 - local.get $31 + local.get $30 + local.get $33 f64.mul f64.sub f64.mul - local.set $29 - local.get $26 - local.get $26 + local.set $31 + local.get $17 + local.get $17 f64.mul - local.set $27 - local.get $27 - local.get $27 + local.set $29 + local.get $29 + local.get $29 f64.mul f64.const 0.5999999999999946 - local.get $27 + local.get $29 f64.const 0.4285714285785502 - local.get $27 + local.get $29 f64.const 0.33333332981837743 - local.get $27 + local.get $29 f64.const 0.272728123808534 - local.get $27 + local.get $29 f64.const 0.23066074577556175 - local.get $27 + local.get $29 f64.const 0.20697501780033842 f64.mul f64.add @@ -9568,143 +9566,143 @@ f64.mul f64.add f64.mul - local.set $21 - local.get $21 - local.get $29 - local.get $28 - local.get $26 + local.set $22 + local.get $22 + local.get $31 + local.get $30 + local.get $17 f64.add f64.mul f64.add - local.set $21 - local.get $28 - local.get $28 + local.set $22 + local.get $30 + local.get $30 f64.mul - local.set $27 + local.set $29 f64.const 3 - local.get $27 + local.get $29 f64.add - local.get $21 + local.get $22 f64.add - local.set $30 - local.get $30 + local.set $32 + local.get $32 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $30 - local.get $21 - local.get $30 + local.set $32 + local.get $22 + local.get $32 f64.const 3 f64.sub - local.get $27 + local.get $29 f64.sub f64.sub - local.set $31 - local.get $28 - local.get $30 - f64.mul - local.set $23 - local.get $29 + local.set $33 local.get $30 + local.get $32 f64.mul + local.set $24 local.get $31 - local.get $26 + local.get $32 + f64.mul + local.get $33 + local.get $17 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $19 - local.get $19 + local.set $20 + local.get $20 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $19 + local.set $20 + local.get $25 + local.get $20 local.get $24 - local.get $19 - local.get $23 f64.sub f64.sub - local.set $20 + local.set $21 f64.const 0.9617967009544373 - local.get $19 + local.get $20 f64.mul - local.set $33 + local.set $35 f64.const 1.350039202129749e-08 f64.const 0 local.get $10 select - local.set $34 + local.set $36 f64.const -7.028461650952758e-09 - local.get $19 - f64.mul local.get $20 + f64.mul + local.get $21 f64.const 0.9617966939259756 f64.mul f64.add - local.get $34 + local.get $36 f64.add - local.set $35 - local.get $12 + local.set $37 + local.get $28 f64.convert_i32_s - local.set $22 + local.set $23 f64.const 0.5849624872207642 f64.const 0 local.get $10 select - local.set $36 - local.get $33 + local.set $38 local.get $35 + local.get $37 f64.add - local.get $36 + local.get $38 f64.add - local.get $22 + local.get $23 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 - local.get $35 - local.get $17 - local.get $22 + local.set $18 + local.get $37 + local.get $18 + local.get $23 f64.sub - local.get $36 + local.get $38 f64.sub - local.get $33 + local.get $35 f64.sub f64.sub - local.set $18 + local.set $19 end local.get $1 - local.set $36 - local.get $36 + local.set $39 + local.get $39 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $36 + local.set $39 local.get $1 - local.get $36 + local.get $39 f64.sub - local.get $17 + local.get $18 f64.mul local.get $1 - local.get $18 + local.get $19 f64.mul f64.add - local.set $20 - local.get $36 - local.get $17 + local.set $21 + local.get $39 + local.get $18 f64.mul - local.set $19 + local.set $20 + local.get $21 local.get $20 - local.get $19 f64.add local.set $15 local.get $15 @@ -9714,18 +9712,18 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 + local.set $27 local.get $2 i32.wrap_i64 - local.set $11 - local.get $13 + local.set $40 + local.get $27 i32.const 1083179008 i32.ge_s if - local.get $13 + local.get $27 i32.const 1083179008 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -9737,11 +9735,11 @@ f64.mul return end - local.get $20 + local.get $21 f64.const 8.008566259537294e-17 f64.add local.get $15 - local.get $19 + local.get $20 f64.sub f64.gt if @@ -9753,16 +9751,16 @@ return end else - local.get $13 + local.get $27 i32.const 2147483647 i32.and i32.const 1083231232 i32.ge_s if - local.get $13 + local.get $27 i32.const -1064252416 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -9774,9 +9772,9 @@ f64.mul return end - local.get $20 + local.get $21 local.get $15 - local.get $19 + local.get $20 f64.sub f64.le if @@ -9789,31 +9787,31 @@ end end end - local.get $13 + local.get $27 i32.const 2147483647 i32.and - local.set $11 - local.get $11 + local.set $40 + local.get $40 i32.const 20 i32.shr_s i32.const 1023 i32.sub local.set $10 i32.const 0 - local.set $12 - local.get $11 + local.set $28 + local.get $40 i32.const 1071644672 i32.gt_s if - local.get $13 + local.get $27 i32.const 1048576 local.get $10 i32.const 1 i32.add i32.shr_s i32.add - local.set $12 - local.get $12 + local.set $28 + local.get $28 i32.const 2147483647 i32.and i32.const 20 @@ -9822,8 +9820,8 @@ i32.sub local.set $10 f64.const 0 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 local.get $10 i32.shr_s @@ -9834,8 +9832,8 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 i32.and i32.const 1048576 @@ -9844,71 +9842,71 @@ local.get $10 i32.sub i32.shr_s - local.set $12 - local.get $13 + local.set $28 + local.get $27 i32.const 0 i32.lt_s if i32.const 0 - local.get $12 + local.get $28 i32.sub - local.set $12 + local.set $28 end - local.get $19 - local.get $22 + local.get $20 + local.get $23 f64.sub - local.set $19 + local.set $20 end + local.get $21 local.get $20 - local.get $19 f64.add - local.set $22 - local.get $22 + local.set $23 + local.get $23 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $22 - local.get $22 + local.set $23 + local.get $23 f64.const 0.6931471824645996 f64.mul - local.set $23 + local.set $24 + local.get $21 + local.get $23 local.get $20 - local.get $22 - local.get $19 f64.sub f64.sub f64.const 0.6931471805599453 f64.mul - local.get $22 + local.get $23 f64.const -1.904654299957768e-09 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add local.set $15 - local.get $24 + local.get $25 local.get $15 - local.get $23 + local.get $24 f64.sub f64.sub - local.set $25 + local.set $26 local.get $15 local.get $15 f64.mul - local.set $22 + local.set $23 local.get $15 - local.get $22 + local.get $23 f64.const 0.16666666666666602 - local.get $22 + local.get $23 f64.const -2.7777777777015593e-03 - local.get $22 + local.get $23 f64.const 6.613756321437934e-05 - local.get $22 + local.get $23 f64.const -1.6533902205465252e-06 - local.get $22 + local.get $23 f64.const 4.1381367970572385e-08 f64.mul f64.add @@ -9920,23 +9918,23 @@ f64.add f64.mul f64.sub - local.set $17 + local.set $18 local.get $15 - local.get $17 + local.get $18 f64.mul - local.get $17 + local.get $18 f64.const 2 f64.sub f64.div - local.get $25 + local.get $26 local.get $15 - local.get $25 + local.get $26 f64.mul f64.add f64.sub - local.set $21 + local.set $22 f64.const 1 - local.get $21 + local.get $22 local.get $15 f64.sub f64.sub @@ -9946,21 +9944,21 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 - local.get $13 - local.get $12 + local.set $27 + local.get $27 + local.get $28 i32.const 20 i32.shl i32.add - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 20 i32.shr_s i32.const 0 i32.le_s if local.get $15 - local.get $12 + local.get $28 call $~lib/math/NativeMath.scalbn local.set $15 else @@ -9968,7 +9966,7 @@ i64.reinterpret_f64 i64.const 4294967295 i64.and - local.get $13 + local.get $27 i64.extend_i32_s i64.const 32 i64.shl @@ -9979,7 +9977,6 @@ local.get $16 local.get $15 f64.mul - return ) (func $std/math/test_pow (; 128 ;) (param $0 f64) (param $1 f64) (param $2 f64) (param $3 f64) (param $4 i32) (result i32) local.get $0 @@ -11113,7 +11110,7 @@ if i32.const 0 i32.const 336 - i32.const 1411 + i32.const 1381 i32.const 4 call $~lib/builtins/abort unreachable @@ -11128,7 +11125,7 @@ if i32.const 384 i32.const 336 - i32.const 1418 + i32.const 1388 i32.const 24 call $~lib/builtins/abort unreachable @@ -11183,7 +11180,7 @@ if i32.const 384 i32.const 336 - i32.const 2800 + i32.const 2750 i32.const 24 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/operator-overloading.untouched.wat b/tests/compiler/std/operator-overloading.untouched.wat index 23adaf9723..9ad7da3082 100644 --- a/tests/compiler/std/operator-overloading.untouched.wat +++ b/tests/compiler/std/operator-overloading.untouched.wat @@ -466,8 +466,8 @@ (local $24 f64) (local $25 f64) (local $26 f64) - (local $27 f64) - (local $28 f64) + (local $27 i32) + (local $28 i32) (local $29 f64) (local $30 f64) (local $31 f64) @@ -476,6 +476,10 @@ (local $34 f64) (local $35 f64) (local $36 f64) + (local $37 f64) + (local $38 f64) + (local $39 f64) + (local $40 i32) local.get $1 f64.abs f64.const 2 @@ -948,52 +952,52 @@ local.get $14 f64.const 1 f64.sub - local.set $22 - local.get $22 - local.get $22 + local.set $23 + local.get $23 + local.get $23 f64.mul f64.const 0.5 - local.get $22 + local.get $23 f64.const 0.3333333333333333 - local.get $22 + local.get $23 f64.const 0.25 f64.mul f64.sub f64.mul f64.sub f64.mul - local.set $25 + local.set $26 f64.const 1.4426950216293335 - local.get $22 + local.get $23 f64.mul - local.set $23 - local.get $22 + local.set $24 + local.get $23 f64.const 1.9259629911266175e-08 f64.mul - local.get $25 + local.get $26 f64.const 1.4426950408889634 f64.mul f64.sub - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 + local.set $18 + local.get $25 + local.get $18 local.get $24 - local.get $17 - local.get $23 f64.sub f64.sub - local.set $18 + local.set $19 else i32.const 0 - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.lt_s @@ -1002,10 +1006,10 @@ f64.const 9007199254740992 f64.mul local.set $14 - local.get $12 + local.get $28 i32.const 53 i32.sub - local.set $12 + local.set $28 local.get $14 i64.reinterpret_f64 i64.const 32 @@ -1013,30 +1017,30 @@ i32.wrap_i64 local.set $7 end - local.get $12 + local.get $28 local.get $7 i32.const 20 i32.shr_s i32.const 1023 i32.sub i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048575 i32.and - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 1072693248 i32.or local.set $7 - local.get $13 + local.get $27 i32.const 235662 i32.le_s if i32.const 0 local.set $10 else - local.get $13 + local.get $27 i32.const 767610 i32.lt_s if @@ -1045,10 +1049,10 @@ else i32.const 0 local.set $10 - local.get $12 + local.get $28 i32.const 1 i32.add - local.set $12 + local.set $28 local.get $7 i32.const 1048576 i32.sub @@ -1070,29 +1074,29 @@ f64.const 1 local.get $10 select - local.set $32 + local.set $34 local.get $14 - local.get $32 + local.get $34 f64.sub - local.set $23 + local.set $24 f64.const 1 local.get $14 - local.get $32 + local.get $34 f64.add f64.div - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.mul - local.set $26 - local.get $26 - local.set $28 - local.get $28 + local.set $17 + local.get $17 + local.set $30 + local.get $30 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $28 + local.set $30 local.get $7 i32.const 1 i32.shr_s @@ -1108,42 +1112,42 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $30 + local.set $32 local.get $14 - local.get $30 local.get $32 + local.get $34 f64.sub f64.sub - local.set $31 + local.set $33 + local.get $25 local.get $24 - local.get $23 - local.get $28 local.get $30 + local.get $32 f64.mul f64.sub - local.get $28 - local.get $31 + local.get $30 + local.get $33 f64.mul f64.sub f64.mul - local.set $29 - local.get $26 - local.get $26 + local.set $31 + local.get $17 + local.get $17 f64.mul - local.set $27 - local.get $27 - local.get $27 + local.set $29 + local.get $29 + local.get $29 f64.mul f64.const 0.5999999999999946 - local.get $27 + local.get $29 f64.const 0.4285714285785502 - local.get $27 + local.get $29 f64.const 0.33333332981837743 - local.get $27 + local.get $29 f64.const 0.272728123808534 - local.get $27 + local.get $29 f64.const 0.23066074577556175 - local.get $27 + local.get $29 f64.const 0.20697501780033842 f64.mul f64.add @@ -1156,143 +1160,143 @@ f64.mul f64.add f64.mul - local.set $21 - local.get $21 - local.get $29 - local.get $28 - local.get $26 + local.set $22 + local.get $22 + local.get $31 + local.get $30 + local.get $17 f64.add f64.mul f64.add - local.set $21 - local.get $28 - local.get $28 + local.set $22 + local.get $30 + local.get $30 f64.mul - local.set $27 + local.set $29 f64.const 3 - local.get $27 + local.get $29 f64.add - local.get $21 + local.get $22 f64.add - local.set $30 - local.get $30 + local.set $32 + local.get $32 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $30 - local.get $21 - local.get $30 + local.set $32 + local.get $22 + local.get $32 f64.const 3 f64.sub - local.get $27 + local.get $29 f64.sub f64.sub - local.set $31 - local.get $28 - local.get $30 - f64.mul - local.set $23 - local.get $29 + local.set $33 local.get $30 + local.get $32 f64.mul + local.set $24 local.get $31 - local.get $26 + local.get $32 + f64.mul + local.get $33 + local.get $17 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add - local.set $19 - local.get $19 + local.set $20 + local.get $20 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $19 + local.set $20 + local.get $25 + local.get $20 local.get $24 - local.get $19 - local.get $23 f64.sub f64.sub - local.set $20 + local.set $21 f64.const 0.9617967009544373 - local.get $19 + local.get $20 f64.mul - local.set $33 + local.set $35 f64.const 1.350039202129749e-08 f64.const 0 local.get $10 select - local.set $34 + local.set $36 f64.const -7.028461650952758e-09 - local.get $19 - f64.mul local.get $20 + f64.mul + local.get $21 f64.const 0.9617966939259756 f64.mul f64.add - local.get $34 + local.get $36 f64.add - local.set $35 - local.get $12 + local.set $37 + local.get $28 f64.convert_i32_s - local.set $22 + local.set $23 f64.const 0.5849624872207642 f64.const 0 local.get $10 select - local.set $36 - local.get $33 + local.set $38 local.get $35 + local.get $37 f64.add - local.get $36 + local.get $38 f64.add - local.get $22 + local.get $23 f64.add - local.set $17 - local.get $17 + local.set $18 + local.get $18 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $17 - local.get $35 - local.get $17 - local.get $22 + local.set $18 + local.get $37 + local.get $18 + local.get $23 f64.sub - local.get $36 + local.get $38 f64.sub - local.get $33 + local.get $35 f64.sub f64.sub - local.set $18 + local.set $19 end local.get $1 - local.set $36 - local.get $36 + local.set $39 + local.get $39 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $36 + local.set $39 local.get $1 - local.get $36 + local.get $39 f64.sub - local.get $17 + local.get $18 f64.mul local.get $1 - local.get $18 + local.get $19 f64.mul f64.add - local.set $20 - local.get $36 - local.get $17 + local.set $21 + local.get $39 + local.get $18 f64.mul - local.set $19 + local.set $20 + local.get $21 local.get $20 - local.get $19 f64.add local.set $15 local.get $15 @@ -1302,18 +1306,18 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 + local.set $27 local.get $2 i32.wrap_i64 - local.set $11 - local.get $13 + local.set $40 + local.get $27 i32.const 1083179008 i32.ge_s if - local.get $13 + local.get $27 i32.const 1083179008 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -1325,11 +1329,11 @@ f64.mul return end - local.get $20 + local.get $21 f64.const 8.008566259537294e-17 f64.add local.get $15 - local.get $19 + local.get $20 f64.sub f64.gt if @@ -1341,16 +1345,16 @@ return end else - local.get $13 + local.get $27 i32.const 2147483647 i32.and i32.const 1083231232 i32.ge_s if - local.get $13 + local.get $27 i32.const -1064252416 i32.sub - local.get $11 + local.get $40 i32.or i32.const 0 i32.ne @@ -1362,9 +1366,9 @@ f64.mul return end - local.get $20 + local.get $21 local.get $15 - local.get $19 + local.get $20 f64.sub f64.le if @@ -1377,31 +1381,31 @@ end end end - local.get $13 + local.get $27 i32.const 2147483647 i32.and - local.set $11 - local.get $11 + local.set $40 + local.get $40 i32.const 20 i32.shr_s i32.const 1023 i32.sub local.set $10 i32.const 0 - local.set $12 - local.get $11 + local.set $28 + local.get $40 i32.const 1071644672 i32.gt_s if - local.get $13 + local.get $27 i32.const 1048576 local.get $10 i32.const 1 i32.add i32.shr_s i32.add - local.set $12 - local.get $12 + local.set $28 + local.get $28 i32.const 2147483647 i32.and i32.const 20 @@ -1410,8 +1414,8 @@ i32.sub local.set $10 f64.const 0 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 local.get $10 i32.shr_s @@ -1422,8 +1426,8 @@ i64.const 32 i64.shl f64.reinterpret_i64 - local.set $22 - local.get $12 + local.set $23 + local.get $28 i32.const 1048575 i32.and i32.const 1048576 @@ -1432,71 +1436,71 @@ local.get $10 i32.sub i32.shr_s - local.set $12 - local.get $13 + local.set $28 + local.get $27 i32.const 0 i32.lt_s if i32.const 0 - local.get $12 + local.get $28 i32.sub - local.set $12 + local.set $28 end - local.get $19 - local.get $22 + local.get $20 + local.get $23 f64.sub - local.set $19 + local.set $20 end + local.get $21 local.get $20 - local.get $19 f64.add - local.set $22 - local.get $22 + local.set $23 + local.get $23 i64.reinterpret_f64 i64.const -4294967296 i64.and f64.reinterpret_i64 - local.set $22 - local.get $22 + local.set $23 + local.get $23 f64.const 0.6931471824645996 f64.mul - local.set $23 + local.set $24 + local.get $21 + local.get $23 local.get $20 - local.get $22 - local.get $19 f64.sub f64.sub f64.const 0.6931471805599453 f64.mul - local.get $22 + local.get $23 f64.const -1.904654299957768e-09 f64.mul f64.add - local.set $24 - local.get $23 + local.set $25 local.get $24 + local.get $25 f64.add local.set $15 - local.get $24 + local.get $25 local.get $15 - local.get $23 + local.get $24 f64.sub f64.sub - local.set $25 + local.set $26 local.get $15 local.get $15 f64.mul - local.set $22 + local.set $23 local.get $15 - local.get $22 + local.get $23 f64.const 0.16666666666666602 - local.get $22 + local.get $23 f64.const -2.7777777777015593e-03 - local.get $22 + local.get $23 f64.const 6.613756321437934e-05 - local.get $22 + local.get $23 f64.const -1.6533902205465252e-06 - local.get $22 + local.get $23 f64.const 4.1381367970572385e-08 f64.mul f64.add @@ -1508,23 +1512,23 @@ f64.add f64.mul f64.sub - local.set $17 + local.set $18 local.get $15 - local.get $17 + local.get $18 f64.mul - local.get $17 + local.get $18 f64.const 2 f64.sub f64.div - local.get $25 + local.get $26 local.get $15 - local.get $25 + local.get $26 f64.mul f64.add f64.sub - local.set $21 + local.set $22 f64.const 1 - local.get $21 + local.get $22 local.get $15 f64.sub f64.sub @@ -1534,21 +1538,21 @@ i64.const 32 i64.shr_u i32.wrap_i64 - local.set $13 - local.get $13 - local.get $12 + local.set $27 + local.get $27 + local.get $28 i32.const 20 i32.shl i32.add - local.set $13 - local.get $13 + local.set $27 + local.get $27 i32.const 20 i32.shr_s i32.const 0 i32.le_s if local.get $15 - local.get $12 + local.get $28 call $~lib/math/NativeMath.scalbn local.set $15 else @@ -1556,7 +1560,7 @@ i64.reinterpret_f64 i64.const 4294967295 i64.and - local.get $13 + local.get $27 i64.extend_i32_s i64.const 32 i64.shl @@ -1567,7 +1571,6 @@ local.get $16 local.get $15 f64.mul - return ) (func $std/operator-overloading/Tester.pow (; 13 ;) (param $0 i32) (param $1 i32) (result i32) (local $2 i32)