diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 7c22e8a91b..181c295d3d 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1402,6 +1402,39 @@ interface IMath { trunc(x: T): T; } +interface IIntegerMath { + /** Returns the absolute value of `x`. */ + abs(x: T): T; + /** Returns the number of leading zero bits in the 32-bit or 64-bit binary representation of `x`. */ + clz(x: T): T; + /** Returns the number of leading zero bits in the 32-bit binary representation of `x`. */ + clz32(x: T): T; + /** Returns the lowest-valued number of its arguments. */ + min(x: T, y: T): T; + /** Returns the largest-valued number of its arguments. */ + max(x: T, y: T): T; + /** Returns same value as input without changes. */ + ceil(x: T): T; + /** Returns same value as input without changes. */ + floor(x: T): T; + /** Returns same value as input without changes. */ + round(x: T): T; + /** Returns same value as input without changes. */ + trunc(x: T): T; + /** Returns the result of the C-like 32-bit multiplication of `a` and `b`. */ + imul(x: T, y: T): T; + /** Returns `base` to the power of `exponent`. */ + pow(base: T, exponent: T): T; + /** Returns the base 2 logarithm of `x` as `floor(log2(x))` */ + log2(x: T): T; + /** Returns the sign of `x`, indicating whether the number is positive, negative or zero. */ + sign(x: T): i32; + /** Returns whether the sign bit of `x` is set */ + signbit(x: T): bool; + /** Returns the square root of `x` as `floor(sqrt(x))`. */ + sqrt(x: T): T; +} + interface INativeMath extends IMath { /** Contains sin value produced after Math/Mathf.sincos */ sincos_sin: T; @@ -1427,6 +1460,8 @@ declare const NativeMathf: INativeMath; declare const Math: IMath; /** Alias of {@link NativeMathf} or {@link JSMath} respectively. Defaults to `NativeMathf`. */ declare const Mathf: IMath; +/** Integer math implemented natively. */ +declare const IntegerMath: IIntegerMath; declare class Date { /** Returns the UTC timestamp in milliseconds of the specified date. */ diff --git a/std/assembly/math.ts b/std/assembly/math.ts index f899f1b082..ab94a32fe4 100644 --- a/std/assembly/math.ts +++ b/std/assembly/math.ts @@ -2625,6 +2625,194 @@ export namespace NativeMathf { } } +export namespace IntegerMath { + + @inline + export function abs(x: T): T { + if (isInteger()) { + return builtin_abs(x); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function clz(x: T): T { + if (isInteger()) { + return builtin_clz(x); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function clz32(x: T): T { + if (isInteger()) { + return builtin_clz(x); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function min(x: T, y: T): T { + if (isInteger()) { + return builtin_min(x, y); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function max(x: T, y: T): T { + if (isInteger()) { + return builtin_max(x, y); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function ceil(x: T): T { + return x; + } + + @inline + export function floor(x: T): T { + return x; + } + + @inline + export function round(x: T): T { + return x; + } + + @inline + export function trunc(x: T): T { + return x; + } + + @inline + export function imul(x: T, y: T): T { + if (isInteger()) { + return (x * y); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function pow(x: T, y: i32): T { + if (isInteger()) { + if (sizeof() == 8) return ipow64(x, y); + if (sizeof() <= 4) return ipow32(x, y); + } + throw new TypeError("Unexpected generic type"); + } + + // floor(log2(x)) + @inline + export function log2(x: T): T { + if (isInteger()) { + if (isSigned()) { + if (x <= 0) throw new RangeError("Math.log2 received negative or zero argument"); + } else { + if (!x) throw new RangeError("Math.log2 received zero argument"); + } + if (sizeof() <= 4) return ilog2_32(x); + if (sizeof() == 8) return ilog2_64(x); + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function sign(x: T): i32 { + if (isInteger()) { + if (isSigned()) { + return (x > 0) - (x < 0); + } else { + return (x != 0); + } + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function signbit(x: T): bool { + if (isInteger()) { + if (isSigned()) { + return x < 0; + } else { + return false; + } + } + throw new TypeError("Unexpected generic type"); + } + + @inline + export function sqrt(x: T): T { + if (isInteger()) { + if (isSigned()) { + if (x < 0) throw new RangeError("Math.sqrt received negative argument"); + } + if (sizeof() <= 4) return isqrt32(x); + if (sizeof() == 8) return isqrt64(x); + } + throw new TypeError("Unexpected generic type"); + } +} + +@inline +export function ilog2_32(x: u32): u32 { + return 31 - builtin_clz(x); +} + +@inline +export function ilog2_64(x: u64): u64 { + return 63 - builtin_clz(x); +} + +// Complexity: O(log n) +// Iterative version of approach described in this article: +// https://www.cs.uni-potsdam.de/ti/kreitz/PDF/03cucs-intsqrt.pdf +export function isqrt32(x: u32): u32 { + if (x < 2) return x; + var s = 2; + var xs = x >> 2; + while (xs && xs != x) { + s += 2; + xs = x >> s; + } + s -= 2; + var ux = x; + var res: u32 = 0; + while (s >= 0) { + res <<= 1; + let m = res + 1; + if (m * m <= ux >> s) { + res = m; + } + s -= 2; + } + return res; +} + +export function isqrt64(x: u64): u64 { + if (x < 2) return x; + var s = 2; + var xs = x >> 2; + while (xs && xs != x) { + s += 2; + xs = x >> s; + } + s -= 2; + var ux = x; + var res: u64 = 0; + while (s >= 0) { + res <<= 1; + let m = res + 1; + if (m * m <= ux >> s) { + res = m; + } + s -= 2; + } + return res; +} + export function ipow32(x: i32, e: i32): i32 { var out = 1; if (ASC_SHRINK_LEVEL < 1) { diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index 1b116ab3eb..dceaf5081d 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -10,6 +10,7 @@ (type $FUNCSIG$fff (func (param f32 f32) (result f32))) (type $FUNCSIG$d (func (result f64))) (type $FUNCSIG$vj (func (param i64))) + (type $FUNCSIG$jj (func (param i64) (result i64))) (type $FUNCSIG$ii (func (param i32) (result i32))) (type $FUNCSIG$f (func (result f32))) (type $FUNCSIG$jji (func (param i64 i32) (result i64))) @@ -10688,7 +10689,158 @@ i32.clz f64.convert_i32_s ) - (func $~lib/math/ipow64 (; 153 ;) (type $FUNCSIG$jji) (param $0 i64) (param $1 i32) (result i64) + (func $~lib/math/isqrt32 (; 153 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.const 2 + i32.lt_u + if + local.get $0 + return + end + i32.const 2 + local.set $1 + local.get $0 + i32.const 2 + i32.shr_u + local.set $2 + loop $continue|0 + local.get $2 + if + local.get $0 + local.get $2 + i32.ne + local.set $2 + end + local.get $2 + if + local.get $0 + local.get $1 + i32.const 2 + i32.add + local.tee $1 + i32.shr_u + local.set $2 + br $continue|0 + end + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + loop $continue|1 + local.get $1 + i32.const 0 + i32.ge_s + if + local.get $3 + i32.const 1 + i32.shl + local.tee $3 + i32.const 1 + i32.add + local.tee $2 + local.get $2 + i32.mul + local.get $0 + local.get $1 + i32.shr_u + i32.le_u + if + local.get $2 + local.set $3 + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + br $continue|1 + end + end + local.get $3 + ) + (func $~lib/math/isqrt64 (; 154 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64) + (local $1 i32) + (local $2 i64) + (local $3 i64) + local.get $0 + i64.const 2 + i64.lt_u + if + local.get $0 + return + end + i32.const 2 + local.set $1 + local.get $0 + i64.const 2 + i64.shr_u + local.set $2 + loop $continue|0 + local.get $2 + i64.const 0 + i64.ne + if + local.get $0 + local.get $2 + i64.ne + i64.extend_i32_u + local.set $2 + end + local.get $2 + i64.const 0 + i64.ne + if + local.get $0 + local.get $1 + i32.const 2 + i32.add + local.tee $1 + i64.extend_i32_s + i64.shr_u + local.set $2 + br $continue|0 + end + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + loop $continue|1 + local.get $1 + i32.const 0 + i32.ge_s + if + local.get $3 + i64.const 1 + i64.shl + local.tee $3 + i64.const 1 + i64.add + local.tee $2 + local.get $2 + i64.mul + local.get $0 + local.get $1 + i64.extend_i32_s + i64.shr_u + i64.le_u + if + local.get $2 + local.set $3 + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + br $continue|1 + end + end + local.get $3 + ) + (func $~lib/math/ipow64 (; 155 ;) (type $FUNCSIG$jji) (param $0 i64) (param $1 i32) (result i64) (local $2 i64) (local $3 i32) i64.const 1 @@ -10884,7 +11036,7 @@ end local.get $2 ) - (func $~lib/math/ipow32f (; 154 ;) (type $FUNCSIG$ffi) (param $0 f32) (param $1 i32) (result f32) + (func $~lib/math/ipow32f (; 156 ;) (type $FUNCSIG$ffi) (param $0 f32) (param $1 i32) (result f32) (local $2 f32) (local $3 i32) local.get $1 @@ -10930,7 +11082,7 @@ end local.get $2 ) - (func $~lib/math/ipow64f (; 155 ;) (type $FUNCSIG$ddi) (param $0 f64) (param $1 i32) (result f64) + (func $~lib/math/ipow64f (; 157 ;) (type $FUNCSIG$ddi) (param $0 f64) (param $1 i32) (result f64) (local $2 f64) (local $3 i32) local.get $1 @@ -10976,7 +11128,7 @@ end local.get $2 ) - (func $start:std/math (; 156 ;) (type $FUNCSIG$v) + (func $start:std/math (; 158 ;) (type $FUNCSIG$v) (local $0 f64) (local $1 f32) (local $2 i32) @@ -40217,6 +40369,448 @@ call $~lib/env/abort unreachable end + i32.const 0 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + if + i32.const 0 + i32.const 8 + i32.const 3522 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 0 + call $~lib/math/isqrt32 + if + i32.const 0 + i32.const 8 + i32.const 3523 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 0 + call $~lib/math/isqrt32 + if + i32.const 0 + i32.const 8 + i32.const 3524 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 0 + call $~lib/math/isqrt64 + i64.const 0 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3525 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 0 + call $~lib/math/isqrt64 + i64.const 0 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3526 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 1 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3527 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 1 + call $~lib/math/isqrt32 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3528 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 1 + call $~lib/math/isqrt32 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3529 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 1 + call $~lib/math/isqrt64 + i64.const 1 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3530 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 1 + call $~lib/math/isqrt64 + i64.const 1 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3531 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 2 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3532 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 2 + call $~lib/math/isqrt32 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3533 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 2 + call $~lib/math/isqrt32 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3534 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 2 + call $~lib/math/isqrt64 + i64.const 1 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3535 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 2 + call $~lib/math/isqrt64 + i64.const 1 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3536 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 3 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3537 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 3 + call $~lib/math/isqrt32 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3538 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 3 + call $~lib/math/isqrt32 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3539 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 3 + call $~lib/math/isqrt64 + i64.const 1 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3540 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 3 + call $~lib/math/isqrt64 + i64.const 1 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3541 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 4 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3542 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 4 + call $~lib/math/isqrt32 + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3543 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 4 + call $~lib/math/isqrt32 + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3544 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 4 + call $~lib/math/isqrt64 + i64.const 2 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3545 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 4 + call $~lib/math/isqrt64 + i64.const 2 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3546 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 32767 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 181 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3547 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 32767 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 181 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3548 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 32767 + call $~lib/math/isqrt32 + i32.const 181 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3549 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 32767 + call $~lib/math/isqrt32 + i32.const 181 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3550 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 65535 + call $~lib/math/isqrt32 + i32.const 65535 + i32.and + i32.const 255 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3551 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 2147483647 + call $~lib/math/isqrt32 + i32.const 46340 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3552 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const 2147483647 + call $~lib/math/isqrt32 + i32.const 46340 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3553 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const -1 + call $~lib/math/isqrt32 + i32.const 65535 + i32.ne + if + i32.const 0 + i32.const 8 + i32.const 3554 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 9223372036854775807 + call $~lib/math/isqrt64 + i64.const 3037000499 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3555 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const 9223372036854775807 + call $~lib/math/isqrt64 + i64.const 3037000499 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3556 + i32.const 0 + call $~lib/env/abort + unreachable + end + i64.const -1 + call $~lib/math/isqrt64 + i64.const 4294967295 + i64.ne + if + i32.const 0 + i32.const 8 + i32.const 3557 + i32.const 0 + call $~lib/env/abort + unreachable + end i64.const 0 i32.const 0 call $~lib/math/ipow64 @@ -40225,7 +40819,7 @@ if i32.const 0 i32.const 8 - i32.const 3461 + i32.const 3569 i32.const 0 call $~lib/env/abort unreachable @@ -40238,7 +40832,7 @@ if i32.const 0 i32.const 8 - i32.const 3462 + i32.const 3570 i32.const 0 call $~lib/env/abort unreachable @@ -40251,7 +40845,7 @@ if i32.const 0 i32.const 8 - i32.const 3463 + i32.const 3571 i32.const 0 call $~lib/env/abort unreachable @@ -40264,7 +40858,7 @@ if i32.const 0 i32.const 8 - i32.const 3464 + i32.const 3572 i32.const 0 call $~lib/env/abort unreachable @@ -40277,7 +40871,7 @@ if i32.const 0 i32.const 8 - i32.const 3466 + i32.const 3574 i32.const 0 call $~lib/env/abort unreachable @@ -40290,7 +40884,7 @@ if i32.const 0 i32.const 8 - i32.const 3467 + i32.const 3575 i32.const 0 call $~lib/env/abort unreachable @@ -40303,7 +40897,7 @@ if i32.const 0 i32.const 8 - i32.const 3468 + i32.const 3576 i32.const 0 call $~lib/env/abort unreachable @@ -40316,7 +40910,7 @@ if i32.const 0 i32.const 8 - i32.const 3469 + i32.const 3577 i32.const 0 call $~lib/env/abort unreachable @@ -40329,7 +40923,7 @@ if i32.const 0 i32.const 8 - i32.const 3471 + i32.const 3579 i32.const 0 call $~lib/env/abort unreachable @@ -40342,7 +40936,7 @@ if i32.const 0 i32.const 8 - i32.const 3472 + i32.const 3580 i32.const 0 call $~lib/env/abort unreachable @@ -40355,7 +40949,7 @@ if i32.const 0 i32.const 8 - i32.const 3473 + i32.const 3581 i32.const 0 call $~lib/env/abort unreachable @@ -40368,7 +40962,7 @@ if i32.const 0 i32.const 8 - i32.const 3474 + i32.const 3582 i32.const 0 call $~lib/env/abort unreachable @@ -40381,7 +40975,7 @@ if i32.const 0 i32.const 8 - i32.const 3476 + i32.const 3584 i32.const 0 call $~lib/env/abort unreachable @@ -40394,7 +40988,7 @@ if i32.const 0 i32.const 8 - i32.const 3477 + i32.const 3585 i32.const 0 call $~lib/env/abort unreachable @@ -40407,7 +41001,7 @@ if i32.const 0 i32.const 8 - i32.const 3478 + i32.const 3586 i32.const 0 call $~lib/env/abort unreachable @@ -40420,7 +41014,7 @@ if i32.const 0 i32.const 8 - i32.const 3479 + i32.const 3587 i32.const 0 call $~lib/env/abort unreachable @@ -40433,7 +41027,7 @@ if i32.const 0 i32.const 8 - i32.const 3481 + i32.const 3589 i32.const 0 call $~lib/env/abort unreachable @@ -40446,7 +41040,7 @@ if i32.const 0 i32.const 8 - i32.const 3482 + i32.const 3590 i32.const 0 call $~lib/env/abort unreachable @@ -40459,7 +41053,7 @@ if i32.const 0 i32.const 8 - i32.const 3483 + i32.const 3591 i32.const 0 call $~lib/env/abort unreachable @@ -40472,7 +41066,7 @@ if i32.const 0 i32.const 8 - i32.const 3484 + i32.const 3592 i32.const 0 call $~lib/env/abort unreachable @@ -40485,7 +41079,7 @@ if i32.const 0 i32.const 8 - i32.const 3486 + i32.const 3594 i32.const 0 call $~lib/env/abort unreachable @@ -40498,7 +41092,7 @@ if i32.const 0 i32.const 8 - i32.const 3487 + i32.const 3595 i32.const 0 call $~lib/env/abort unreachable @@ -40511,7 +41105,7 @@ if i32.const 0 i32.const 8 - i32.const 3488 + i32.const 3596 i32.const 0 call $~lib/env/abort unreachable @@ -40524,7 +41118,7 @@ if i32.const 0 i32.const 8 - i32.const 3489 + i32.const 3597 i32.const 0 call $~lib/env/abort unreachable @@ -40537,7 +41131,7 @@ if i32.const 0 i32.const 8 - i32.const 3490 + i32.const 3598 i32.const 0 call $~lib/env/abort unreachable @@ -40550,7 +41144,7 @@ if i32.const 0 i32.const 8 - i32.const 3491 + i32.const 3599 i32.const 0 call $~lib/env/abort unreachable @@ -40563,7 +41157,7 @@ if i32.const 0 i32.const 8 - i32.const 3492 + i32.const 3600 i32.const 0 call $~lib/env/abort unreachable @@ -40580,7 +41174,7 @@ if i32.const 0 i32.const 8 - i32.const 3494 + i32.const 3602 i32.const 0 call $~lib/env/abort unreachable @@ -40593,7 +41187,7 @@ if i32.const 0 i32.const 8 - i32.const 3498 + i32.const 3606 i32.const 0 call $~lib/env/abort unreachable @@ -40606,7 +41200,7 @@ if i32.const 0 i32.const 8 - i32.const 3499 + i32.const 3607 i32.const 0 call $~lib/env/abort unreachable @@ -40620,7 +41214,7 @@ if i32.const 0 i32.const 8 - i32.const 3500 + i32.const 3608 i32.const 0 call $~lib/env/abort unreachable @@ -40634,7 +41228,7 @@ if i32.const 0 i32.const 8 - i32.const 3501 + i32.const 3609 i32.const 0 call $~lib/env/abort unreachable @@ -40648,7 +41242,7 @@ if i32.const 0 i32.const 8 - i32.const 3502 + i32.const 3610 i32.const 0 call $~lib/env/abort unreachable @@ -40661,7 +41255,7 @@ if i32.const 0 i32.const 8 - i32.const 3503 + i32.const 3611 i32.const 0 call $~lib/env/abort unreachable @@ -40674,7 +41268,7 @@ if i32.const 0 i32.const 8 - i32.const 3504 + i32.const 3612 i32.const 0 call $~lib/env/abort unreachable @@ -40687,7 +41281,7 @@ if i32.const 0 i32.const 8 - i32.const 3505 + i32.const 3613 i32.const 0 call $~lib/env/abort unreachable @@ -40700,7 +41294,7 @@ if i32.const 0 i32.const 8 - i32.const 3506 + i32.const 3614 i32.const 0 call $~lib/env/abort unreachable @@ -40713,7 +41307,7 @@ if i32.const 0 i32.const 8 - i32.const 3507 + i32.const 3615 i32.const 0 call $~lib/env/abort unreachable @@ -40726,7 +41320,7 @@ if i32.const 0 i32.const 8 - i32.const 3508 + i32.const 3616 i32.const 0 call $~lib/env/abort unreachable @@ -40739,7 +41333,7 @@ if i32.const 0 i32.const 8 - i32.const 3509 + i32.const 3617 i32.const 0 call $~lib/env/abort unreachable @@ -40752,7 +41346,7 @@ if i32.const 0 i32.const 8 - i32.const 3510 + i32.const 3618 i32.const 0 call $~lib/env/abort unreachable @@ -40765,7 +41359,7 @@ if i32.const 0 i32.const 8 - i32.const 3511 + i32.const 3619 i32.const 0 call $~lib/env/abort unreachable @@ -40778,7 +41372,7 @@ if i32.const 0 i32.const 8 - i32.const 3512 + i32.const 3620 i32.const 0 call $~lib/env/abort unreachable @@ -40791,7 +41385,7 @@ if i32.const 0 i32.const 8 - i32.const 3513 + i32.const 3621 i32.const 0 call $~lib/env/abort unreachable @@ -40804,7 +41398,7 @@ if i32.const 0 i32.const 8 - i32.const 3517 + i32.const 3625 i32.const 0 call $~lib/env/abort unreachable @@ -40817,7 +41411,7 @@ if i32.const 0 i32.const 8 - i32.const 3518 + i32.const 3626 i32.const 0 call $~lib/env/abort unreachable @@ -40831,7 +41425,7 @@ if i32.const 0 i32.const 8 - i32.const 3519 + i32.const 3627 i32.const 0 call $~lib/env/abort unreachable @@ -40845,7 +41439,7 @@ if i32.const 0 i32.const 8 - i32.const 3520 + i32.const 3628 i32.const 0 call $~lib/env/abort unreachable @@ -40859,7 +41453,7 @@ if i32.const 0 i32.const 8 - i32.const 3521 + i32.const 3629 i32.const 0 call $~lib/env/abort unreachable @@ -40872,7 +41466,7 @@ if i32.const 0 i32.const 8 - i32.const 3522 + i32.const 3630 i32.const 0 call $~lib/env/abort unreachable @@ -40885,7 +41479,7 @@ if i32.const 0 i32.const 8 - i32.const 3523 + i32.const 3631 i32.const 0 call $~lib/env/abort unreachable @@ -40898,7 +41492,7 @@ if i32.const 0 i32.const 8 - i32.const 3524 + i32.const 3632 i32.const 0 call $~lib/env/abort unreachable @@ -40911,7 +41505,7 @@ if i32.const 0 i32.const 8 - i32.const 3525 + i32.const 3633 i32.const 0 call $~lib/env/abort unreachable @@ -40924,7 +41518,7 @@ if i32.const 0 i32.const 8 - i32.const 3526 + i32.const 3634 i32.const 0 call $~lib/env/abort unreachable @@ -40937,7 +41531,7 @@ if i32.const 0 i32.const 8 - i32.const 3527 + i32.const 3635 i32.const 0 call $~lib/env/abort unreachable @@ -40950,7 +41544,7 @@ if i32.const 0 i32.const 8 - i32.const 3528 + i32.const 3636 i32.const 0 call $~lib/env/abort unreachable @@ -40963,7 +41557,7 @@ if i32.const 0 i32.const 8 - i32.const 3529 + i32.const 3637 i32.const 0 call $~lib/env/abort unreachable @@ -40976,7 +41570,7 @@ if i32.const 0 i32.const 8 - i32.const 3530 + i32.const 3638 i32.const 0 call $~lib/env/abort unreachable @@ -40989,7 +41583,7 @@ if i32.const 0 i32.const 8 - i32.const 3531 + i32.const 3639 i32.const 0 call $~lib/env/abort unreachable @@ -41002,16 +41596,16 @@ if i32.const 0 i32.const 8 - i32.const 3532 + i32.const 3640 i32.const 0 call $~lib/env/abort unreachable end ) - (func $start (; 157 ;) (type $FUNCSIG$v) + (func $start (; 159 ;) (type $FUNCSIG$v) call $start:std/math ) - (func $null (; 158 ;) (type $FUNCSIG$v) + (func $null (; 160 ;) (type $FUNCSIG$v) nop ) ) diff --git a/tests/compiler/std/math.ts b/tests/compiler/std/math.ts index e5423ac123..57784ce90a 100644 --- a/tests/compiler/std/math.ts +++ b/tests/compiler/std/math.ts @@ -3456,6 +3456,114 @@ assert(NativeMath.clz32(f64.MIN_VALUE) == 32); assert(NativeMath.clz32(-f64.MAX_VALUE) == 32); assert(NativeMath.clz32(f64.EPSILON) == 32); +// IntegerMath.sign /////////////////////////////////////////////////////////////////////////// + +assert(IntegerMath.sign(0) == 0); +assert(IntegerMath.sign(0) == 0); +assert(IntegerMath.sign(0) == 0); +assert(IntegerMath.sign(0) == 0); +assert(IntegerMath.sign(0) == 0); +assert(IntegerMath.sign(0) == 0); +assert(IntegerMath.sign(2) == 1); +assert(IntegerMath.sign(2) == 1); +assert(IntegerMath.sign(2) == 1); +assert(IntegerMath.sign(2) == 1); +assert(IntegerMath.sign(-2) == -1); +assert(IntegerMath.sign(-2) == -1); +assert(IntegerMath.sign(-2) == 1); +assert(IntegerMath.sign(-2) == 1); +assert(IntegerMath.sign(-2 as i16) == -1); +assert(IntegerMath.sign(-2 as u16) == 1); + +// IntegerMath.signbit /////////////////////////////////////////////////////////////////////////// + +assert(IntegerMath.signbit(0) == false); +assert(IntegerMath.signbit(0) == false); +assert(IntegerMath.signbit(0) == false); +assert(IntegerMath.signbit(0) == false); +assert(IntegerMath.signbit(0) == false); +assert(IntegerMath.signbit(0) == false); +assert(IntegerMath.signbit(2) == false); +assert(IntegerMath.signbit(2) == false); +assert(IntegerMath.signbit(2) == false); +assert(IntegerMath.signbit(2) == false); +assert(IntegerMath.signbit(-2) == true); +assert(IntegerMath.signbit(-2) == true); +assert(IntegerMath.signbit(-2) == false); +assert(IntegerMath.signbit(-2) == false); +assert(IntegerMath.signbit(-2 as i16) == true); +assert(IntegerMath.signbit(-2 as u16) == false); + +// IntegerMath.log2 /////////////////////////////////////////////////////////////////////////// + +assert(IntegerMath.log2(1) == 0); +assert(IntegerMath.log2(1) == 0); +assert(IntegerMath.log2(1) == 0); +assert(IntegerMath.log2(1) == 0); +assert(IntegerMath.log2(1) == 0); +assert(IntegerMath.log2(2) == 1); +assert(IntegerMath.log2(2) == 1); +assert(IntegerMath.log2(2) == 1); +assert(IntegerMath.log2(2) == 1); +assert(IntegerMath.log2(2) == 1); +assert(IntegerMath.log2(3) == 1); +assert(IntegerMath.log2(3) == 1); +assert(IntegerMath.log2(3) == 1); +assert(IntegerMath.log2(3) == 1); +assert(IntegerMath.log2(3) == 1); +assert(IntegerMath.log2(i16.MAX_VALUE) == 14); +assert(IntegerMath.log2(i32.MAX_VALUE) == 30); +assert(IntegerMath.log2(u32.MAX_VALUE) == 31); +assert(IntegerMath.log2(i64.MAX_VALUE) == 62); +assert(IntegerMath.log2(u64.MAX_VALUE) == 63); + +// IntegerMath.sqrt /////////////////////////////////////////////////////////////////////////// + +assert(IntegerMath.sqrt(0) == 0); +assert(IntegerMath.sqrt(0) == 0); +assert(IntegerMath.sqrt(0) == 0); +assert(IntegerMath.sqrt(0) == 0); +assert(IntegerMath.sqrt(0) == 0); +assert(IntegerMath.sqrt(1) == 1); +assert(IntegerMath.sqrt(1) == 1); +assert(IntegerMath.sqrt(1) == 1); +assert(IntegerMath.sqrt(1) == 1); +assert(IntegerMath.sqrt(1) == 1); +assert(IntegerMath.sqrt(2) == 1); +assert(IntegerMath.sqrt(2) == 1); +assert(IntegerMath.sqrt(2) == 1); +assert(IntegerMath.sqrt(2) == 1); +assert(IntegerMath.sqrt(2) == 1); +assert(IntegerMath.sqrt(3) == 1); +assert(IntegerMath.sqrt(3) == 1); +assert(IntegerMath.sqrt(3) == 1); +assert(IntegerMath.sqrt(3) == 1); +assert(IntegerMath.sqrt(3) == 1); +assert(IntegerMath.sqrt(4) == 2); +assert(IntegerMath.sqrt(4) == 2); +assert(IntegerMath.sqrt(4) == 2); +assert(IntegerMath.sqrt(4) == 2); +assert(IntegerMath.sqrt(4) == 2); +assert(IntegerMath.sqrt(i16.MAX_VALUE) == 181); +assert(IntegerMath.sqrt(i16.MAX_VALUE) == 181); +assert(IntegerMath.sqrt(i16.MAX_VALUE) == 181); +assert(IntegerMath.sqrt(i16.MAX_VALUE) == 181); +assert(IntegerMath.sqrt(u16.MAX_VALUE) == 255); +assert(IntegerMath.sqrt(i32.MAX_VALUE) == 46340); +assert(IntegerMath.sqrt(i32.MAX_VALUE) == 46340); +assert(IntegerMath.sqrt(u32.MAX_VALUE) == 65535); +assert(IntegerMath.sqrt(i64.MAX_VALUE) == 3037000499); +assert(IntegerMath.sqrt(i64.MAX_VALUE) == 3037000499); +assert(IntegerMath.sqrt(u64.MAX_VALUE) == 4294967295); + +// IntegerMath.imul /////////////////////////////////////////////////////////////////////////// + +assert(IntegerMath.imul(2, 4) == 8); +assert(IntegerMath.imul(-1, 8) == -8); +assert(IntegerMath.imul(-2, -2) == 4); +assert(IntegerMath.imul(0xffffffff, 5) == -5); +assert(IntegerMath.imul(0xfffffffe, 5) == -10); + // ipow64 ///////////////////////////////////////////////////////////////////////////////////// assert(ipow64(0, 0) == 1); diff --git a/tests/compiler/std/math.untouched.wat b/tests/compiler/std/math.untouched.wat index e56de62614..a8eb745295 100644 --- a/tests/compiler/std/math.untouched.wat +++ b/tests/compiler/std/math.untouched.wat @@ -101,6 +101,12 @@ (global $~lib/builtins/f64.MAX_VALUE f64 (f64.const 1797693134862315708145274e284)) (global $~lib/builtins/f64.MAX_SAFE_INTEGER f64 (f64.const 9007199254740991)) (global $~lib/builtins/f64.EPSILON f64 (f64.const 2.220446049250313e-16)) + (global $~lib/builtins/i16.MAX_VALUE i32 (i32.const 32767)) + (global $~lib/builtins/i32.MAX_VALUE i32 (i32.const 2147483647)) + (global $~lib/builtins/u32.MAX_VALUE i32 (i32.const -1)) + (global $~lib/builtins/i64.MAX_VALUE i64 (i64.const 9223372036854775807)) + (global $~lib/builtins/u64.MAX_VALUE i64 (i64.const -1)) + (global $~lib/builtins/u16.MAX_VALUE i32 (i32.const 65535)) (global $~lib/builtins/f32.MIN_VALUE f32 (f32.const 1.401298464324817e-45)) (global $~lib/memory/HEAP_BASE i32 (i32.const 140)) (export "memory" (memory $0)) @@ -13251,7 +13257,358 @@ i32.clz f64.convert_i32_s ) - (func $~lib/math/ipow64 (; 162 ;) (type $FUNCSIG$jji) (param $0 i64) (param $1 i32) (result i64) + (func $~lib/math/IntegerMath.sign (; 162 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 0 + i32.gt_s + local.get $0 + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 0 + i32.lt_s + i32.sub + return + ) + (func $~lib/math/IntegerMath.sign (; 163 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 65535 + i32.and + i32.const 0 + i32.ne + return + ) + (func $~lib/math/IntegerMath.signbit (; 164 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 0 + i32.lt_s + return + ) + (func $~lib/math/IntegerMath.signbit (; 165 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + i32.const 0 + return + ) + (func $~lib/math/IntegerMath.log2 (; 166 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.9 (result i32) + local.get $0 + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + local.set $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + end + return + ) + (func $~lib/math/IntegerMath.log2 (; 167 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.10 (result i32) + local.get $0 + local.set $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + end + return + ) + (func $~lib/math/IntegerMath.log2 (; 168 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.11 (result i32) + local.get $0 + local.set $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + end + return + ) + (func $~lib/math/IntegerMath.log2 (; 169 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64) + (local $1 i64) + local.get $0 + i64.const 0 + i64.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.6 (result i64) + local.get $0 + local.set $1 + i64.const 63 + local.get $1 + i64.clz + i64.sub + end + return + ) + (func $~lib/math/IntegerMath.log2 (; 170 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64) + (local $1 i64) + local.get $0 + i64.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.7 (result i64) + local.get $0 + local.set $1 + i64.const 63 + local.get $1 + i64.clz + i64.sub + end + return + ) + (func $~lib/math/isqrt32 (; 171 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + i32.const 2 + i32.lt_u + if + local.get $0 + return + end + i32.const 2 + local.set $1 + local.get $0 + i32.const 2 + i32.shr_u + local.set $2 + block $break|0 + loop $continue|0 + local.get $2 + if (result i32) + local.get $2 + local.get $0 + i32.ne + else + local.get $2 + end + if + block + local.get $1 + i32.const 2 + i32.add + local.set $1 + local.get $0 + local.get $1 + i32.shr_u + local.set $2 + end + br $continue|0 + end + end + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + local.get $0 + local.set $3 + i32.const 0 + local.set $4 + block $break|1 + loop $continue|1 + local.get $1 + i32.const 0 + i32.ge_s + if + block + local.get $4 + i32.const 1 + i32.shl + local.set $4 + local.get $4 + i32.const 1 + i32.add + local.set $5 + local.get $5 + local.get $5 + i32.mul + local.get $3 + local.get $1 + i32.shr_u + i32.le_u + if + local.get $5 + local.set $4 + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + end + br $continue|1 + end + end + end + local.get $4 + ) + (func $~lib/math/isqrt64 (; 172 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64) + (local $1 i32) + (local $2 i64) + (local $3 i64) + (local $4 i64) + (local $5 i64) + local.get $0 + i64.const 2 + i64.lt_u + if + local.get $0 + return + end + i32.const 2 + local.set $1 + local.get $0 + i64.const 2 + i64.shr_u + local.set $2 + block $break|0 + loop $continue|0 + local.get $2 + i64.const 0 + i64.ne + if (result i64) + local.get $2 + local.get $0 + i64.ne + i64.extend_i32_u + else + local.get $2 + end + i64.const 0 + i64.ne + if + block + local.get $1 + i32.const 2 + i32.add + local.set $1 + local.get $0 + local.get $1 + i64.extend_i32_s + i64.shr_u + local.set $2 + end + br $continue|0 + end + end + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + local.get $0 + local.set $3 + i64.const 0 + local.set $4 + block $break|1 + loop $continue|1 + local.get $1 + i32.const 0 + i32.ge_s + if + block + local.get $4 + i64.const 1 + i64.shl + local.set $4 + local.get $4 + i64.const 1 + i64.add + local.set $5 + local.get $5 + local.get $5 + i64.mul + local.get $3 + local.get $1 + i64.extend_i32_s + i64.shr_u + i64.le_u + if + local.get $5 + local.set $4 + end + local.get $1 + i32.const 2 + i32.sub + local.set $1 + end + br $continue|1 + end + end + end + local.get $4 + ) + (func $~lib/math/IntegerMath.sqrt (; 173 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64) + local.get $0 + call $~lib/math/isqrt64 + return + ) + (func $~lib/math/ipow64 (; 174 ;) (type $FUNCSIG$jji) (param $0 i64) (param $1 i32) (result i64) (local $2 i64) (local $3 i32) (local $4 i32) @@ -13483,7 +13840,7 @@ end local.get $2 ) - (func $~lib/math/ipow32f (; 163 ;) (type $FUNCSIG$ffi) (param $0 f32) (param $1 i32) (result f32) + (func $~lib/math/ipow32f (; 175 ;) (type $FUNCSIG$ffi) (param $0 f32) (param $1 i32) (result f32) (local $2 i32) (local $3 f32) local.get $1 @@ -13534,7 +13891,7 @@ local.get $3 end ) - (func $~lib/math/ipow64f (; 164 ;) (type $FUNCSIG$ddi) (param $0 f64) (param $1 i32) (result f64) + (func $~lib/math/ipow64f (; 176 ;) (type $FUNCSIG$ddi) (param $0 f64) (param $1 i32) (result f64) (local $2 i32) (local $3 f64) local.get $1 @@ -13585,12 +13942,13 @@ local.get $3 end ) - (func $start:std/math (; 165 ;) (type $FUNCSIG$v) + (func $start:std/math (; 177 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 f64) (local $2 i32) (local $3 i64) (local $4 f32) + (local $5 i64) global.get $~lib/math/NativeMath.E global.get $~lib/math/NativeMath.E f64.eq @@ -46985,6 +47343,2219 @@ call $~lib/env/abort unreachable end + block $~lib/math/IntegerMath.sign|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.gt_s + local.get $0 + i32.const 0 + i32.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3461 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.ne + br $~lib/math/IntegerMath.sign|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3462 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.gt_s + local.get $0 + i32.const 0 + i32.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3463 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.ne + br $~lib/math/IntegerMath.sign|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3464 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.0 (result i32) + i64.const 0 + local.set $3 + local.get $3 + i64.const 0 + i64.gt_s + local.get $3 + i64.const 0 + i64.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3465 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.0 (result i32) + i64.const 0 + local.set $3 + local.get $3 + i64.const 0 + i64.ne + br $~lib/math/IntegerMath.sign|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3466 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.1 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.gt_s + local.get $0 + i32.const 0 + i32.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3467 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.1 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.ne + br $~lib/math/IntegerMath.sign|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3468 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.1 (result i32) + i64.const 2 + local.set $3 + local.get $3 + i64.const 0 + i64.gt_s + local.get $3 + i64.const 0 + i64.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3469 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.1 (result i32) + i64.const 2 + local.set $3 + local.get $3 + i64.const 0 + i64.ne + br $~lib/math/IntegerMath.sign|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3470 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.2 (result i32) + i32.const -2 + local.set $0 + local.get $0 + i32.const 0 + i32.gt_s + local.get $0 + i32.const 0 + i32.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.2 + end + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3471 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.2 (result i32) + i64.const -2 + local.set $3 + local.get $3 + i64.const 0 + i64.gt_s + local.get $3 + i64.const 0 + i64.lt_s + i32.sub + br $~lib/math/IntegerMath.sign|inlined.2 + end + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3472 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.2 (result i32) + i32.const -2 + local.set $0 + local.get $0 + i32.const 0 + i32.ne + br $~lib/math/IntegerMath.sign|inlined.2 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3473 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sign|inlined.2 (result i32) + i64.const -2 + local.set $3 + local.get $3 + i64.const 0 + i64.ne + br $~lib/math/IntegerMath.sign|inlined.2 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3474 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const -2 + call $~lib/math/IntegerMath.sign + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3475 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const -2 + call $~lib/math/IntegerMath.sign + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3476 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + br $~lib/math/IntegerMath.signbit|inlined.0 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3480 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.0 (result i32) + i32.const 0 + local.set $0 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.0 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3481 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + br $~lib/math/IntegerMath.signbit|inlined.0 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3482 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.0 (result i32) + i32.const 0 + local.set $0 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.0 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3483 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.0 (result i32) + i64.const 0 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + br $~lib/math/IntegerMath.signbit|inlined.0 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3484 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.0 (result i32) + i64.const 0 + local.set $3 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.0 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3485 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.1 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + br $~lib/math/IntegerMath.signbit|inlined.1 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3486 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.1 (result i32) + i32.const 2 + local.set $0 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.1 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3487 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.1 (result i32) + i64.const 2 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + br $~lib/math/IntegerMath.signbit|inlined.1 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3488 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.1 (result i32) + i64.const 2 + local.set $3 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.1 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3489 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.2 (result i32) + i32.const -2 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + br $~lib/math/IntegerMath.signbit|inlined.2 + end + i32.const 0 + i32.ne + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3490 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.2 (result i32) + i64.const -2 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + br $~lib/math/IntegerMath.signbit|inlined.2 + end + i32.const 0 + i32.ne + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3491 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.2 (result i32) + i32.const -2 + local.set $0 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.2 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3492 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.signbit|inlined.2 (result i32) + i64.const -2 + local.set $3 + i32.const 0 + br $~lib/math/IntegerMath.signbit|inlined.2 + end + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3493 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const -2 + call $~lib/math/IntegerMath.signbit + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3494 + i32.const 0 + call $~lib/env/abort + unreachable + end + i32.const -2 + call $~lib/math/IntegerMath.signbit + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3495 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.0 (result i32) + i32.const 1 + local.set $0 + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.0 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.0 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3499 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.0 (result i32) + i32.const 1 + local.set $0 + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.1 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3500 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.0 (result i32) + i32.const 1 + local.set $0 + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.2 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3501 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.0 (result i64) + i64.const 1 + local.set $3 + local.get $3 + i64.const 0 + i64.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.0 (result i64) + local.get $3 + local.set $5 + i64.const 63 + local.get $5 + i64.clz + i64.sub + end + br $~lib/math/IntegerMath.log2|inlined.0 + end + i64.const 0 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3502 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.0 (result i64) + i64.const 1 + local.set $3 + local.get $3 + i64.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.1 (result i64) + local.get $3 + local.set $5 + i64.const 63 + local.get $5 + i64.clz + i64.sub + end + br $~lib/math/IntegerMath.log2|inlined.0 + end + i64.const 0 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3503 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.1 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.3 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.1 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3504 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.1 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.4 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3505 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.1 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.5 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3506 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.1 (result i64) + i64.const 2 + local.set $3 + local.get $3 + i64.const 0 + i64.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.2 (result i64) + local.get $3 + local.set $5 + i64.const 63 + local.get $5 + i64.clz + i64.sub + end + br $~lib/math/IntegerMath.log2|inlined.1 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3507 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.1 (result i64) + i64.const 2 + local.set $3 + local.get $3 + i64.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.3 (result i64) + local.get $3 + local.set $5 + i64.const 63 + local.get $5 + i64.clz + i64.sub + end + br $~lib/math/IntegerMath.log2|inlined.1 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3508 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.2 (result i32) + i32.const 3 + local.set $0 + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.6 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.2 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3509 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.2 (result i32) + i32.const 3 + local.set $0 + local.get $0 + i32.const 0 + i32.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.7 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.2 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3510 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.2 (result i32) + i32.const 3 + local.set $0 + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_32|inlined.8 (result i32) + local.get $0 + local.set $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + end + br $~lib/math/IntegerMath.log2|inlined.2 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3511 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.2 (result i64) + i64.const 3 + local.set $3 + local.get $3 + i64.const 0 + i64.le_s + if + i32.const 0 + i32.const 112 + i32.const 2712 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.4 (result i64) + local.get $3 + local.set $5 + i64.const 63 + local.get $5 + i64.clz + i64.sub + end + br $~lib/math/IntegerMath.log2|inlined.2 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3512 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.log2|inlined.2 (result i64) + i64.const 3 + local.set $3 + local.get $3 + i64.eqz + if + i32.const 0 + i32.const 112 + i32.const 2714 + i32.const 16 + call $~lib/env/abort + unreachable + end + block $~lib/math/ilog2_64|inlined.5 (result i64) + local.get $3 + local.set $5 + i64.const 63 + local.get $5 + i64.clz + i64.sub + end + br $~lib/math/IntegerMath.log2|inlined.2 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3513 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $~lib/builtins/i16.MAX_VALUE + call $~lib/math/IntegerMath.log2 + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 14 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3514 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $~lib/builtins/i32.MAX_VALUE + call $~lib/math/IntegerMath.log2 + i32.const 30 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3515 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $~lib/builtins/u32.MAX_VALUE + call $~lib/math/IntegerMath.log2 + i32.const 31 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3516 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $~lib/builtins/i64.MAX_VALUE + call $~lib/math/IntegerMath.log2 + i64.const 62 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3517 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $~lib/builtins/u64.MAX_VALUE + call $~lib/math/IntegerMath.log2 + i64.const 63 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3518 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.0 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3522 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3523 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.0 (result i32) + i32.const 0 + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.0 + end + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3524 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.0 (result i64) + i64.const 0 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.0 + end + i64.const 0 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3525 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.0 (result i64) + i64.const 0 + local.set $3 + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.0 + end + i64.const 0 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3526 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.1 (result i32) + i32.const 1 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.1 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3527 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.1 (result i32) + i32.const 1 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3528 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.1 (result i32) + i32.const 1 + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.1 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3529 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.1 (result i64) + i64.const 1 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.1 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3530 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.1 (result i64) + i64.const 1 + local.set $3 + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.1 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3531 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.2 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.2 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3532 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.2 (result i32) + i32.const 2 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.2 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3533 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.2 (result i32) + i32.const 2 + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.2 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3534 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.2 (result i64) + i64.const 2 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.2 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3535 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.2 (result i64) + i64.const 2 + local.set $3 + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.2 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3536 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.3 (result i32) + i32.const 3 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.3 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3537 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.3 (result i32) + i32.const 3 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.3 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3538 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.3 (result i32) + i32.const 3 + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.3 + end + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3539 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.3 (result i64) + i64.const 3 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.3 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3540 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.3 (result i64) + i64.const 3 + local.set $3 + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.3 + end + i64.const 1 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3541 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.4 (result i32) + i32.const 4 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.4 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3542 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.4 (result i32) + i32.const 4 + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.4 + end + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3543 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.4 (result i32) + i32.const 4 + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.4 + end + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3544 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.4 (result i64) + i64.const 4 + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.4 + end + i64.const 2 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3545 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.4 (result i64) + i64.const 4 + local.set $3 + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.4 + end + i64.const 2 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3546 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.5 (result i32) + global.get $~lib/builtins/i16.MAX_VALUE + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.5 + end + i32.const 16 + i32.shl + i32.const 16 + i32.shr_s + i32.const 181 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3547 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.0 (result i32) + global.get $~lib/builtins/i16.MAX_VALUE + local.set $0 + local.get $0 + i32.const 65535 + i32.and + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.0 + end + i32.const 65535 + i32.and + i32.const 181 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3548 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.5 (result i32) + global.get $~lib/builtins/i16.MAX_VALUE + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.5 + end + i32.const 181 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3549 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.5 (result i32) + global.get $~lib/builtins/i16.MAX_VALUE + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.5 + end + i32.const 181 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3550 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.1 (result i32) + global.get $~lib/builtins/u16.MAX_VALUE + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.1 + end + i32.const 65535 + i32.and + i32.const 255 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3551 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.6 (result i32) + global.get $~lib/builtins/i32.MAX_VALUE + local.set $0 + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.6 + end + i32.const 46340 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3552 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.6 (result i32) + global.get $~lib/builtins/i32.MAX_VALUE + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.6 + end + i32.const 46340 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3553 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.7 (result i32) + global.get $~lib/builtins/u32.MAX_VALUE + local.set $0 + local.get $0 + call $~lib/math/isqrt32 + br $~lib/math/IntegerMath.sqrt|inlined.7 + end + i32.const 65535 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3554 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.5 (result i64) + global.get $~lib/builtins/i64.MAX_VALUE + local.set $3 + local.get $3 + i64.const 0 + i64.lt_s + if + i32.const 0 + i32.const 112 + i32.const 2750 + i32.const 19 + call $~lib/env/abort + unreachable + end + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.5 + end + i64.const 3037000499 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3555 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.sqrt|inlined.5 (result i64) + global.get $~lib/builtins/i64.MAX_VALUE + local.set $3 + local.get $3 + call $~lib/math/isqrt64 + br $~lib/math/IntegerMath.sqrt|inlined.5 + end + i64.const 3037000499 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3556 + i32.const 0 + call $~lib/env/abort + unreachable + end + global.get $~lib/builtins/u64.MAX_VALUE + call $~lib/math/IntegerMath.sqrt + i64.const 4294967295 + i64.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3557 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.imul|inlined.0 (result i32) + i32.const 2 + local.set $0 + i32.const 4 + local.set $2 + local.get $0 + local.get $2 + i32.mul + br $~lib/math/IntegerMath.imul|inlined.0 + end + i32.const 8 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3561 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.imul|inlined.1 (result i32) + i32.const -1 + local.set $2 + i32.const 8 + local.set $0 + local.get $2 + local.get $0 + i32.mul + br $~lib/math/IntegerMath.imul|inlined.1 + end + i32.const -8 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3562 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.imul|inlined.2 (result i32) + i32.const -2 + local.set $0 + i32.const -2 + local.set $2 + local.get $0 + local.get $2 + i32.mul + br $~lib/math/IntegerMath.imul|inlined.2 + end + i32.const 4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3563 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.imul|inlined.0 (result i32) + i32.const -1 + local.set $2 + i32.const 5 + local.set $0 + local.get $2 + local.get $0 + i32.mul + br $~lib/math/IntegerMath.imul|inlined.0 + end + i32.const -5 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3564 + i32.const 0 + call $~lib/env/abort + unreachable + end + block $~lib/math/IntegerMath.imul|inlined.1 (result i32) + i32.const -2 + local.set $0 + i32.const 5 + local.set $2 + local.get $0 + local.get $2 + i32.mul + br $~lib/math/IntegerMath.imul|inlined.1 + end + i32.const -10 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 8 + i32.const 3565 + i32.const 0 + call $~lib/env/abort + unreachable + end i64.const 0 i32.const 0 call $~lib/math/ipow64 @@ -46994,7 +49565,7 @@ if i32.const 0 i32.const 8 - i32.const 3461 + i32.const 3569 i32.const 0 call $~lib/env/abort unreachable @@ -47008,7 +49579,7 @@ if i32.const 0 i32.const 8 - i32.const 3462 + i32.const 3570 i32.const 0 call $~lib/env/abort unreachable @@ -47022,7 +49593,7 @@ if i32.const 0 i32.const 8 - i32.const 3463 + i32.const 3571 i32.const 0 call $~lib/env/abort unreachable @@ -47036,7 +49607,7 @@ if i32.const 0 i32.const 8 - i32.const 3464 + i32.const 3572 i32.const 0 call $~lib/env/abort unreachable @@ -47050,7 +49621,7 @@ if i32.const 0 i32.const 8 - i32.const 3466 + i32.const 3574 i32.const 0 call $~lib/env/abort unreachable @@ -47064,7 +49635,7 @@ if i32.const 0 i32.const 8 - i32.const 3467 + i32.const 3575 i32.const 0 call $~lib/env/abort unreachable @@ -47078,7 +49649,7 @@ if i32.const 0 i32.const 8 - i32.const 3468 + i32.const 3576 i32.const 0 call $~lib/env/abort unreachable @@ -47092,7 +49663,7 @@ if i32.const 0 i32.const 8 - i32.const 3469 + i32.const 3577 i32.const 0 call $~lib/env/abort unreachable @@ -47106,7 +49677,7 @@ if i32.const 0 i32.const 8 - i32.const 3471 + i32.const 3579 i32.const 0 call $~lib/env/abort unreachable @@ -47120,7 +49691,7 @@ if i32.const 0 i32.const 8 - i32.const 3472 + i32.const 3580 i32.const 0 call $~lib/env/abort unreachable @@ -47134,7 +49705,7 @@ if i32.const 0 i32.const 8 - i32.const 3473 + i32.const 3581 i32.const 0 call $~lib/env/abort unreachable @@ -47148,7 +49719,7 @@ if i32.const 0 i32.const 8 - i32.const 3474 + i32.const 3582 i32.const 0 call $~lib/env/abort unreachable @@ -47162,7 +49733,7 @@ if i32.const 0 i32.const 8 - i32.const 3476 + i32.const 3584 i32.const 0 call $~lib/env/abort unreachable @@ -47176,7 +49747,7 @@ if i32.const 0 i32.const 8 - i32.const 3477 + i32.const 3585 i32.const 0 call $~lib/env/abort unreachable @@ -47190,7 +49761,7 @@ if i32.const 0 i32.const 8 - i32.const 3478 + i32.const 3586 i32.const 0 call $~lib/env/abort unreachable @@ -47204,7 +49775,7 @@ if i32.const 0 i32.const 8 - i32.const 3479 + i32.const 3587 i32.const 0 call $~lib/env/abort unreachable @@ -47218,7 +49789,7 @@ if i32.const 0 i32.const 8 - i32.const 3481 + i32.const 3589 i32.const 0 call $~lib/env/abort unreachable @@ -47232,7 +49803,7 @@ if i32.const 0 i32.const 8 - i32.const 3482 + i32.const 3590 i32.const 0 call $~lib/env/abort unreachable @@ -47246,7 +49817,7 @@ if i32.const 0 i32.const 8 - i32.const 3483 + i32.const 3591 i32.const 0 call $~lib/env/abort unreachable @@ -47260,7 +49831,7 @@ if i32.const 0 i32.const 8 - i32.const 3484 + i32.const 3592 i32.const 0 call $~lib/env/abort unreachable @@ -47274,7 +49845,7 @@ if i32.const 0 i32.const 8 - i32.const 3486 + i32.const 3594 i32.const 0 call $~lib/env/abort unreachable @@ -47288,7 +49859,7 @@ if i32.const 0 i32.const 8 - i32.const 3487 + i32.const 3595 i32.const 0 call $~lib/env/abort unreachable @@ -47302,7 +49873,7 @@ if i32.const 0 i32.const 8 - i32.const 3488 + i32.const 3596 i32.const 0 call $~lib/env/abort unreachable @@ -47316,7 +49887,7 @@ if i32.const 0 i32.const 8 - i32.const 3489 + i32.const 3597 i32.const 0 call $~lib/env/abort unreachable @@ -47330,7 +49901,7 @@ if i32.const 0 i32.const 8 - i32.const 3490 + i32.const 3598 i32.const 0 call $~lib/env/abort unreachable @@ -47344,7 +49915,7 @@ if i32.const 0 i32.const 8 - i32.const 3491 + i32.const 3599 i32.const 0 call $~lib/env/abort unreachable @@ -47358,7 +49929,7 @@ if i32.const 0 i32.const 8 - i32.const 3492 + i32.const 3600 i32.const 0 call $~lib/env/abort unreachable @@ -47376,7 +49947,7 @@ if i32.const 0 i32.const 8 - i32.const 3494 + i32.const 3602 i32.const 0 call $~lib/env/abort unreachable @@ -47390,7 +49961,7 @@ if i32.const 0 i32.const 8 - i32.const 3498 + i32.const 3606 i32.const 0 call $~lib/env/abort unreachable @@ -47404,7 +49975,7 @@ if i32.const 0 i32.const 8 - i32.const 3499 + i32.const 3607 i32.const 0 call $~lib/env/abort unreachable @@ -47424,7 +49995,7 @@ if i32.const 0 i32.const 8 - i32.const 3500 + i32.const 3608 i32.const 0 call $~lib/env/abort unreachable @@ -47444,7 +50015,7 @@ if i32.const 0 i32.const 8 - i32.const 3501 + i32.const 3609 i32.const 0 call $~lib/env/abort unreachable @@ -47464,7 +50035,7 @@ if i32.const 0 i32.const 8 - i32.const 3502 + i32.const 3610 i32.const 0 call $~lib/env/abort unreachable @@ -47478,7 +50049,7 @@ if i32.const 0 i32.const 8 - i32.const 3503 + i32.const 3611 i32.const 0 call $~lib/env/abort unreachable @@ -47492,7 +50063,7 @@ if i32.const 0 i32.const 8 - i32.const 3504 + i32.const 3612 i32.const 0 call $~lib/env/abort unreachable @@ -47507,7 +50078,7 @@ if i32.const 0 i32.const 8 - i32.const 3505 + i32.const 3613 i32.const 0 call $~lib/env/abort unreachable @@ -47523,7 +50094,7 @@ if i32.const 0 i32.const 8 - i32.const 3506 + i32.const 3614 i32.const 0 call $~lib/env/abort unreachable @@ -47538,7 +50109,7 @@ if i32.const 0 i32.const 8 - i32.const 3507 + i32.const 3615 i32.const 0 call $~lib/env/abort unreachable @@ -47552,7 +50123,7 @@ if i32.const 0 i32.const 8 - i32.const 3508 + i32.const 3616 i32.const 0 call $~lib/env/abort unreachable @@ -47566,7 +50137,7 @@ if i32.const 0 i32.const 8 - i32.const 3509 + i32.const 3617 i32.const 0 call $~lib/env/abort unreachable @@ -47580,7 +50151,7 @@ if i32.const 0 i32.const 8 - i32.const 3510 + i32.const 3618 i32.const 0 call $~lib/env/abort unreachable @@ -47594,7 +50165,7 @@ if i32.const 0 i32.const 8 - i32.const 3511 + i32.const 3619 i32.const 0 call $~lib/env/abort unreachable @@ -47608,7 +50179,7 @@ if i32.const 0 i32.const 8 - i32.const 3512 + i32.const 3620 i32.const 0 call $~lib/env/abort unreachable @@ -47622,7 +50193,7 @@ if i32.const 0 i32.const 8 - i32.const 3513 + i32.const 3621 i32.const 0 call $~lib/env/abort unreachable @@ -47636,7 +50207,7 @@ if i32.const 0 i32.const 8 - i32.const 3517 + i32.const 3625 i32.const 0 call $~lib/env/abort unreachable @@ -47650,7 +50221,7 @@ if i32.const 0 i32.const 8 - i32.const 3518 + i32.const 3626 i32.const 0 call $~lib/env/abort unreachable @@ -47663,7 +50234,7 @@ if i32.const 0 i32.const 8 - i32.const 3519 + i32.const 3627 i32.const 0 call $~lib/env/abort unreachable @@ -47676,7 +50247,7 @@ if i32.const 0 i32.const 8 - i32.const 3520 + i32.const 3628 i32.const 0 call $~lib/env/abort unreachable @@ -47689,7 +50260,7 @@ if i32.const 0 i32.const 8 - i32.const 3521 + i32.const 3629 i32.const 0 call $~lib/env/abort unreachable @@ -47703,7 +50274,7 @@ if i32.const 0 i32.const 8 - i32.const 3522 + i32.const 3630 i32.const 0 call $~lib/env/abort unreachable @@ -47717,7 +50288,7 @@ if i32.const 0 i32.const 8 - i32.const 3523 + i32.const 3631 i32.const 0 call $~lib/env/abort unreachable @@ -47732,7 +50303,7 @@ if i32.const 0 i32.const 8 - i32.const 3524 + i32.const 3632 i32.const 0 call $~lib/env/abort unreachable @@ -47748,7 +50319,7 @@ if i32.const 0 i32.const 8 - i32.const 3525 + i32.const 3633 i32.const 0 call $~lib/env/abort unreachable @@ -47763,7 +50334,7 @@ if i32.const 0 i32.const 8 - i32.const 3526 + i32.const 3634 i32.const 0 call $~lib/env/abort unreachable @@ -47777,7 +50348,7 @@ if i32.const 0 i32.const 8 - i32.const 3527 + i32.const 3635 i32.const 0 call $~lib/env/abort unreachable @@ -47791,7 +50362,7 @@ if i32.const 0 i32.const 8 - i32.const 3528 + i32.const 3636 i32.const 0 call $~lib/env/abort unreachable @@ -47805,7 +50376,7 @@ if i32.const 0 i32.const 8 - i32.const 3529 + i32.const 3637 i32.const 0 call $~lib/env/abort unreachable @@ -47819,7 +50390,7 @@ if i32.const 0 i32.const 8 - i32.const 3530 + i32.const 3638 i32.const 0 call $~lib/env/abort unreachable @@ -47833,7 +50404,7 @@ if i32.const 0 i32.const 8 - i32.const 3531 + i32.const 3639 i32.const 0 call $~lib/env/abort unreachable @@ -47847,15 +50418,15 @@ if i32.const 0 i32.const 8 - i32.const 3532 + i32.const 3640 i32.const 0 call $~lib/env/abort unreachable end ) - (func $start (; 166 ;) (type $FUNCSIG$v) + (func $start (; 178 ;) (type $FUNCSIG$v) call $start:std/math ) - (func $null (; 167 ;) (type $FUNCSIG$v) + (func $null (; 179 ;) (type $FUNCSIG$v) ) )