From c7cb71875343c56ec5d1cb72ad20a8d182af649c Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Wed, 5 Feb 2025 20:06:20 -0800 Subject: [PATCH 01/10] fix: use single precision for dtoa with f32 --- std/assembly/number.ts | 6 +- std/assembly/util/number.ts | 74 +- tests/compiler/issues/2873.debug.wat | 5488 ++++++++++++++++++++++++ tests/compiler/issues/2873.json | 3 + tests/compiler/issues/2873.release.wat | 3937 +++++++++++++++++ tests/compiler/issues/2873.ts | 8 + 6 files changed, 9496 insertions(+), 20 deletions(-) create mode 100644 tests/compiler/issues/2873.debug.wat create mode 100644 tests/compiler/issues/2873.json create mode 100644 tests/compiler/issues/2873.release.wat create mode 100644 tests/compiler/issues/2873.ts diff --git a/std/assembly/number.ts b/std/assembly/number.ts index 47a4a7a94f..589651c2fa 100644 --- a/std/assembly/number.ts +++ b/std/assembly/number.ts @@ -1,4 +1,4 @@ -import { itoa32, utoa32, itoa64, utoa64, dtoa } from "./util/number"; +import { itoa32, utoa32, itoa64, utoa64, dtoa32, dtoa64 } from "./util/number"; import { strtol, strtod } from "./util/string"; // @ts-ignore: decorator @@ -315,7 +315,7 @@ export abstract class F32 { } toString(this: f32, radix: i32 = 0): String { - return dtoa(this); + return dtoa32(this); } } @@ -381,7 +381,7 @@ export abstract class F64 { } toString(this: f64, radix: i32 = 0): String { - return dtoa(this); + return dtoa64(this); } } diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index db74792f9a..c2df8b8c48 100644 --- a/std/assembly/util/number.ts +++ b/std/assembly/util/number.ts @@ -474,7 +474,7 @@ export function itoa64(value: i64, radix: i32): String { @lazy let _frc_minus: u64 = 0; // @ts-ignore: decorator -@lazy let _frc_plus: u64 = 0; +@lazy let _frc_plus: u64 = 0; // @ts-ignore: decorator @lazy let _frc_pow: u64 = 0; @@ -511,14 +511,14 @@ function umul64e(e1: i32, e2: i32): i32 { // @ts-ignore: decorator @inline -function normalizedBoundaries(f: u64, e: i32): void { +function normalizedBoundaries(f: u64, e: i32, isSinglePrecision: bool): void { let frc = (f << 1) + 1; let exp = e - 1; let off = clz(frc); frc <<= off; exp -= off; - let m = 1 + i32(f == 0x0010000000000000); + let m = 1 + i32(f == (isSinglePrecision ? 0x00800000 : 0x0010000000000000)); _frc_plus = frc; _frc_minus = ((f << m) - 1) << e - m - exp; @@ -559,16 +559,26 @@ function getCachedPower(minExp: i32): void { // @ts-ignore: decorator @inline -function grisu2(value: f64, buffer: usize, sign: i32): i32 { +function grisu2(value: f64, buffer: usize, sign: i32, isSinglePrecision: bool): i32 { + let frc: u64; + let exp: i32; // frexp routine - let uv = reinterpret(value); - let exp = i32((uv & 0x7FF0000000000000) >>> 52); - let sid = uv & 0x000FFFFFFFFFFFFF; - let frc = (u64(exp != 0) << 52) + sid; - exp = select(exp, 1, exp) - (0x3FF + 52); + if (isSinglePrecision) { + let uv = reinterpret(value); + exp = (uv & 0x7F800000) >>> 23; + let sid = uv & 0x007FFFFF; + frc = (u64(exp != 0) << 23) + sid; + exp = select(exp, 1, exp) - (0x7F + 23); + } else { + let uv = reinterpret(value); + exp = i32((uv & 0x7FF0000000000000) >>> 52); + let sid = uv & 0x000FFFFFFFFFFFFF; + frc = (u64(exp != 0) << 52) + sid; + exp = select(exp, 1, exp) - (0x3FF + 52); + } - normalizedBoundaries(frc, exp); + normalizedBoundaries(frc, exp, isSinglePrecision); getCachedPower(_exp); // normalize @@ -716,14 +726,14 @@ function prettify(buffer: usize, length: i32, k: i32): i32 { } } -function dtoa_core(buffer: usize, value: f64): i32 { +function dtoa_core(buffer: usize, value: f64, isSinglePrecision: bool): i32 { let sign = i32(value < 0); if (sign) { value = -value; store(buffer, CharCode.MINUS); } - // assert(value > 0 && value <= 1.7976931348623157e308); - let len = grisu2(value, buffer, sign); + // assert(value > 0 && value <= (isSinglePrecision ? f32.MAX_VALUE : f64.MAX_VALUE)); + let len = grisu2(value, buffer, sign, isSinglePrecision); len = prettify(buffer + (sign << 1), len - sign, _K); return len + sign; } @@ -731,13 +741,32 @@ function dtoa_core(buffer: usize, value: f64): i32 { // @ts-ignore: decorator @lazy @inline const dtoa_buf = memory.data(MAX_DOUBLE_LENGTH << 1); -export function dtoa(value: f64): String { +export function dtoa(value: T): String { + // assert(isFloat()); + if (sizeof() == 4) { + return dtoa_impl(value, true); + } else { + return dtoa_impl(value, false); + } +} + +export function dtoa32(value: f32): String { + return dtoa_impl(value, true); +} + +export function dtoa64(value: f64): String { + return dtoa_impl(value, false); +} + +// @ts-ignore: decorator +@inline +function dtoa_impl(value: f64, isSinglePrecision: bool): String { if (value == 0) return "0.0"; if (!isFinite(value)) { if (isNaN(value)) return "NaN"; return select("-Infinity", "Infinity", value < 0); } - let size = dtoa_core(dtoa_buf, value) << 1; + let size = dtoa_core(dtoa_buf, value, isSinglePrecision) << 1; let result = changetype(__new(size, idof())); memory.copy(changetype(result), dtoa_buf, size); return result; @@ -821,7 +850,18 @@ export function itoa_buffered(buffer: usize, value: T): u32 { return sign + decimals; } -export function dtoa_buffered(buffer: usize, value: f64): u32 { +export function dtoa_buffered(buffer: usize, value: T): u32 { + // assert(isFloat()); + if (sizeof() == 4) { + return dtoa_buffered_impl(buffer, value, true); + } else { + return dtoa_buffered_impl(buffer, value, false); + } +} + +// @ts-ignore: decorator +@inline +function dtoa_buffered_impl(buffer: usize, value: f64, isSinglePrecision: bool): u32 { if (value == 0) { store(buffer, CharCode._0); store(buffer, CharCode.DOT, 2); @@ -845,5 +885,5 @@ export function dtoa_buffered(buffer: usize, value: f64): u32 { return 8 + u32(sign); } } - return dtoa_core(buffer, value); + return dtoa_core(buffer, value, isSinglePrecision); } diff --git a/tests/compiler/issues/2873.debug.wat b/tests/compiler/issues/2873.debug.wat new file mode 100644 index 0000000000..8d0c6993a5 --- /dev/null +++ b/tests/compiler/issues/2873.debug.wat @@ -0,0 +1,5488 @@ +(module + (type $0 (func (param i32) (result i32))) + (type $1 (func (param i32 i32))) + (type $2 (func (param i32))) + (type $3 (func (param i32 i32) (result i32))) + (type $4 (func)) + (type $5 (func (param i32 i32 i32) (result i32))) + (type $6 (func (param i32 i32 i32))) + (type $7 (func (param f32) (result i32))) + (type $8 (func (param f64) (result i32))) + (type $9 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $10 (func (param i32 f64 i32) (result i32))) + (type $11 (func (param i32 i32 i32 i32))) + (type $12 (func (param i32 i32 i64) (result i32))) + (type $13 (func (result i32))) + (type $14 (func (param f32 i32) (result i32))) + (type $15 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $16 (func (param f64 i32) (result i32))) + (type $17 (func (param i32 f32) (result i32))) + (type $18 (func (param i32 f64) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/util/number/_frc_plus (mut i64) (i64.const 0)) + (global $~lib/util/number/_frc_minus (mut i64) (i64.const 0)) + (global $~lib/util/number/_exp (mut i32) (i32.const 0)) + (global $~lib/util/number/_K (mut i32) (i32.const 0)) + (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) + (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) + (global $~lib/native/ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) + (global $~lib/shared/runtime/Runtime.Incremental i32 (i32.const 2)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $issues/2873/f32arr i32 (i32.const 2080)) + (global $issues/2873/f64arr i32 (i32.const 2288)) + (global $~lib/rt/__rtti_base i32 (i32.const 2320)) + (global $~lib/memory/__data_end i32 (i32.const 2348)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 35116)) + (global $~lib/memory/__heap_base i32 (i32.const 35116)) + (memory $0 1) + (data $0 (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\000\00.\000\00\00\00\00\00\00\00") + (data $1 (i32.const 44) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00N\00a\00N\00\00\00\00\00\00\00") + (data $2 (i32.const 76) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y\00\00\00\00\00\00\00\00\00\00\00") + (data $3 (i32.const 124) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $4 (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $5 (i32.const 232) "\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_\rXf\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#get:dataStart (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/array/Array#get:length_ (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f32) (result i32) + (local $buffer|2 i32) + (local $value|3 f64) + (local $isSinglePrecision i32) + (local $sign i32) + i32.const 4 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) + local.get $buffer + local.set $buffer|2 + local.get $value + f64.promote_f32 + local.set $value|3 + i32.const 1 + local.set $isSinglePrecision + local.get $value|3 + f64.const 0 + f64.eq + if + local.get $buffer|2 + i32.const 48 + i32.store16 + local.get $buffer|2 + i32.const 46 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 48 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + local.get $value|3 + local.get $value|3 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|3 + local.get $value|3 + f64.ne + if + local.get $buffer|2 + i32.const 78 + i32.store16 + local.get $buffer|2 + i32.const 97 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + else + local.get $value|3 + f64.const 0 + f64.lt + local.set $sign + local.get $sign + if + local.get $buffer|2 + i32.const 45 + i32.store16 + local.get $buffer|2 + i32.const 2 + i32.add + local.set $buffer|2 + end + local.get $buffer|2 + i64.const 29555310648492105 + i64.store + local.get $buffer|2 + i64.const 34058970405077102 + i64.store offset=8 + i32.const 8 + local.get $sign + i32.add + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + unreachable + end + local.get $buffer|2 + local.get $value|3 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + return + ) + (func $~lib/array/Array#get:dataStart (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/array/Array#get:length_ (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) + (local $buffer|2 i32) + (local $value|3 f64) + (local $isSinglePrecision i32) + (local $sign i32) + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_buffered_impl|inlined.1 (result i32) + local.get $buffer + local.set $buffer|2 + local.get $value + local.set $value|3 + i32.const 0 + local.set $isSinglePrecision + local.get $value|3 + f64.const 0 + f64.eq + if + local.get $buffer|2 + i32.const 48 + i32.store16 + local.get $buffer|2 + i32.const 46 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 48 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + local.get $value|3 + local.get $value|3 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|3 + local.get $value|3 + f64.ne + if + local.get $buffer|2 + i32.const 78 + i32.store16 + local.get $buffer|2 + i32.const 97 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + else + local.get $value|3 + f64.const 0 + f64.lt + local.set $sign + local.get $sign + if + local.get $buffer|2 + i32.const 45 + i32.store16 + local.get $buffer|2 + i32.const 2 + i32.add + local.set $buffer|2 + end + local.get $buffer|2 + i64.const 29555310648492105 + i64.store + local.get $buffer|2 + i64.const 34058970405077102 + i64.store offset=8 + i32.const 8 + local.get $sign + i32.add + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + unreachable + end + local.get $buffer|2 + local.get $value|3 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + return + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + global.get $issues/2873/f32arr + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $issues/2873/f64arr + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + i32.const 1760 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 1568 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/object/Object~visit (param $0 i32) (param $1 i32) + ) + (func $~lib/array/Array#get:buffer (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/array/Array~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/array/Array#__visit + ) + (func $~lib/array/Array#get:buffer (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/array/Array~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/array/Array#__visit + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $~lib/array/Array + block $~lib/array/Array + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/array/Array $~lib/array/Array $invalid + end + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array~visit + return + end + unreachable + ) + (func $~start + call $start:issues/2873 + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 35136 + i32.const 35184 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/string/String.__eq (param $left i32) (param $right i32) (result i32) + (local $leftLength i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $left + local.get $right + i32.eq + if + i32.const 1 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $right + i32.const 0 + i32.eq + end + if + i32.const 0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/string/String#get:length + local.set $leftLength + local.get $leftLength + local.get $right + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + i32.const 0 + local.get $right + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + i32.const 0 + local.get $leftLength + call $~lib/util/string/compareImpl + i32.eqz + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) + (func $~lib/string/String#substring (param $this i32) (param $start i32) (param $end i32) (result i32) + (local $len i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $finalStart i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $finalEnd i32) + (local $14 i32) + (local $15 i32) + (local $fromPos i32) + (local $17 i32) + (local $18 i32) + (local $toPos i32) + (local $size i32) + (local $out i32) + (local $22 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + local.set $22 + global.get $~lib/memory/__stack_pointer + local.get $22 + i32.store + local.get $22 + call $~lib/string/String#get:length + local.set $len + local.get $start + local.tee $4 + i32.const 0 + local.tee $5 + local.get $4 + local.get $5 + i32.gt_s + select + local.tee $6 + local.get $len + local.tee $7 + local.get $6 + local.get $7 + i32.lt_s + select + local.set $finalStart + local.get $end + local.tee $9 + i32.const 0 + local.tee $10 + local.get $9 + local.get $10 + i32.gt_s + select + local.tee $11 + local.get $len + local.tee $12 + local.get $11 + local.get $12 + i32.lt_s + select + local.set $finalEnd + local.get $finalStart + local.tee $14 + local.get $finalEnd + local.tee $15 + local.get $14 + local.get $15 + i32.lt_s + select + i32.const 1 + i32.shl + local.set $fromPos + local.get $finalStart + local.tee $17 + local.get $finalEnd + local.tee $18 + local.get $17 + local.get $18 + i32.gt_s + select + i32.const 1 + i32.shl + local.set $toPos + local.get $toPos + local.get $fromPos + i32.sub + local.set $size + local.get $size + i32.eqz + if + i32.const 2128 + local.set $22 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $22 + return + end + local.get $fromPos + i32.eqz + if (result i32) + local.get $toPos + local.get $len + i32.const 1 + i32.shl + i32.eq + else + i32.const 0 + end + if + local.get $this + local.set $22 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $22 + return + end + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $out + i32.store offset=4 + local.get $out + local.get $this + local.get $fromPos + i32.add + local.get $size + memory.copy + local.get $out + local.set $22 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $22 + return + ) + (func $~lib/util/string/joinFloatArray (param $dataStart i32) (param $length i32) (param $separator i32) (result i32) + (local $lastIndex i32) + (local $sepLen i32) + (local $estLen i32) + (local $result i32) + (local $offset i32) + (local $value f32) + (local $i i32) + (local $10 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $length + i32.const 1 + i32.sub + local.set $lastIndex + local.get $lastIndex + i32.const 0 + i32.lt_s + if + i32.const 2128 + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + end + local.get $lastIndex + i32.eqz + if + local.get $dataStart + f32.load + call $~lib/util/number/dtoa + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + end + local.get $separator + local.set $10 + global.get $~lib/memory/__stack_pointer + local.get $10 + i32.store + local.get $10 + call $~lib/string/String#get:length + local.set $sepLen + i32.const 28 + local.get $sepLen + i32.add + local.get $lastIndex + i32.mul + i32.const 28 + i32.add + local.set $estLen + global.get $~lib/memory/__stack_pointer + local.get $estLen + i32.const 1 + i32.shl + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store offset=4 + i32.const 0 + local.set $offset + i32.const 0 + local.set $i + loop $for-loop|0 + local.get $i + local.get $lastIndex + i32.lt_s + if + local.get $dataStart + local.get $i + i32.const 2 + i32.shl + i32.add + f32.load + local.set $value + local.get $offset + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $value + call $~lib/util/number/dtoa_buffered + i32.add + local.set $offset + local.get $sepLen + if + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $separator + local.get $sepLen + i32.const 1 + i32.shl + memory.copy + local.get $offset + local.get $sepLen + i32.add + local.set $offset + end + local.get $i + i32.const 1 + i32.add + local.set $i + br $for-loop|0 + end + end + local.get $dataStart + local.get $lastIndex + i32.const 2 + i32.shl + i32.add + f32.load + local.set $value + local.get $offset + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $value + call $~lib/util/number/dtoa_buffered + i32.add + local.set $offset + local.get $estLen + local.get $offset + i32.gt_s + if + local.get $result + local.set $10 + global.get $~lib/memory/__stack_pointer + local.get $10 + i32.store + local.get $10 + i32.const 0 + local.get $offset + call $~lib/string/String#substring + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + end + local.get $result + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + ) + (func $~lib/array/Array#join (param $this i32) (param $separator i32) (result i32) + (local $ptr i32) + (local $len i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/array/Array#get:dataStart + local.set $ptr + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/array/Array#get:length_ + local.set $len + i32.const 0 + drop + i32.const 0 + drop + i32.const 1 + drop + local.get $ptr + local.get $len + local.get $separator + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/util/string/joinFloatArray + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + ) + (func $~lib/util/string/joinFloatArray (param $dataStart i32) (param $length i32) (param $separator i32) (result i32) + (local $lastIndex i32) + (local $sepLen i32) + (local $estLen i32) + (local $result i32) + (local $offset i32) + (local $value f64) + (local $i i32) + (local $10 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $length + i32.const 1 + i32.sub + local.set $lastIndex + local.get $lastIndex + i32.const 0 + i32.lt_s + if + i32.const 2128 + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + end + local.get $lastIndex + i32.eqz + if + local.get $dataStart + f64.load + call $~lib/util/number/dtoa + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + end + local.get $separator + local.set $10 + global.get $~lib/memory/__stack_pointer + local.get $10 + i32.store + local.get $10 + call $~lib/string/String#get:length + local.set $sepLen + i32.const 28 + local.get $sepLen + i32.add + local.get $lastIndex + i32.mul + i32.const 28 + i32.add + local.set $estLen + global.get $~lib/memory/__stack_pointer + local.get $estLen + i32.const 1 + i32.shl + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store offset=4 + i32.const 0 + local.set $offset + i32.const 0 + local.set $i + loop $for-loop|0 + local.get $i + local.get $lastIndex + i32.lt_s + if + local.get $dataStart + local.get $i + i32.const 3 + i32.shl + i32.add + f64.load + local.set $value + local.get $offset + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $value + call $~lib/util/number/dtoa_buffered + i32.add + local.set $offset + local.get $sepLen + if + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $separator + local.get $sepLen + i32.const 1 + i32.shl + memory.copy + local.get $offset + local.get $sepLen + i32.add + local.set $offset + end + local.get $i + i32.const 1 + i32.add + local.set $i + br $for-loop|0 + end + end + local.get $dataStart + local.get $lastIndex + i32.const 3 + i32.shl + i32.add + f64.load + local.set $value + local.get $offset + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $value + call $~lib/util/number/dtoa_buffered + i32.add + local.set $offset + local.get $estLen + local.get $offset + i32.gt_s + if + local.get $result + local.set $10 + global.get $~lib/memory/__stack_pointer + local.get $10 + i32.store + local.get $10 + i32.const 0 + local.get $offset + call $~lib/string/String#substring + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + end + local.get $result + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + ) + (func $~lib/array/Array#join (param $this i32) (param $separator i32) (result i32) + (local $ptr i32) + (local $len i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/array/Array#get:dataStart + local.set $ptr + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/array/Array#get:length_ + local.set $len + i32.const 0 + drop + i32.const 0 + drop + i32.const 1 + drop + local.get $ptr + local.get $len + local.get $separator + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/util/string/joinFloatArray + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + ) + (func $start:issues/2873 + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1680 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 1712 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 1856 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + f32.const 1.100000023841858 + i32.const 0 + call $~lib/number/F32#toString + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + i32.const 1968 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 2000 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const 1.1 + i32.const 0 + call $~lib/number/F64#toString + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + i32.const 1968 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 2000 + i32.const 2 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $issues/2873/f32arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + local.get $4 + i32.const 2160 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=12 + local.get $4 + call $~lib/array/Array#join + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + i32.const 2192 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 2000 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $issues/2873/f64arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + local.get $4 + i32.const 2160 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=12 + local.get $4 + call $~lib/array/Array#join + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + i32.const 2192 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 2000 + i32.const 8 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/array/Array#__visit (param $this i32) (param $cookie i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 0 + drop + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/array/Array#get:buffer + local.get $cookie + call $~lib/rt/itcms/__visit + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/array/Array#__visit (param $this i32) (param $cookie i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 0 + drop + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/array/Array#get:buffer + local.get $cookie + call $~lib/rt/itcms/__visit + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/util/number/dtoa32 (param $value f32) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) + local.get $value + f64.promote_f32 + local.set $value|1 + i32.const 1 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 32 + br $~lib/util/number/dtoa_impl|inlined.0 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 64 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 96 + i32.const 144 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 176 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 176 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 + end + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + block $~lib/util/number/dtoa_impl|inlined.1 (result i32) + local.get $value + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 32 + br $~lib/util/number/dtoa_impl|inlined.1 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 64 + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 96 + i32.const 144 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 176 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 176 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.1 + end + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa (param $value f32) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 4 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.2 (result i32) + local.get $value + f64.promote_f32 + local.set $value|1 + i32.const 1 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 32 + br $~lib/util/number/dtoa_impl|inlined.2 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 64 + br $~lib/util/number/dtoa_impl|inlined.2 + end + i32.const 96 + i32.const 144 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.2 + end + i32.const 176 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 176 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.2 + end + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.3 (result i32) + local.get $value + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 32 + br $~lib/util/number/dtoa_impl|inlined.3 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 64 + br $~lib/util/number/dtoa_impl|inlined.3 + end + i32.const 96 + i32.const 144 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.3 + end + i32.const 176 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 176 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.3 + end + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) +) diff --git a/tests/compiler/issues/2873.json b/tests/compiler/issues/2873.json new file mode 100644 index 0000000000..ea57a955e1 --- /dev/null +++ b/tests/compiler/issues/2873.json @@ -0,0 +1,3 @@ +{ + "asc_flags": [] +} diff --git a/tests/compiler/issues/2873.release.wat b/tests/compiler/issues/2873.release.wat new file mode 100644 index 0000000000..6f4a013fb6 --- /dev/null +++ b/tests/compiler/issues/2873.release.wat @@ -0,0 +1,3937 @@ +(module + (type $0 (func (param i32 i32) (result i32))) + (type $1 (func)) + (type $2 (func (param i32))) + (type $3 (func (param i32 i32))) + (type $4 (func (param i32 i64 i64 i32 i64 i32) (result i32))) + (type $5 (func (param i32 i32 i32))) + (type $6 (func (param i32 i32 i32) (result i32))) + (type $7 (func (param i32 f64 i32) (result i32))) + (type $8 (func (param i32 i32 i32 i32))) + (type $9 (func (param i32 i32 i64))) + (type $10 (func (result i32))) + (type $11 (func (param i32) (result i32))) + (type $12 (func (param i32 f32) (result i32))) + (type $13 (func (param i32 f64) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/util/number/_frc_plus (mut i64) (i64.const 0)) + (global $~lib/util/number/_frc_minus (mut i64) (i64.const 0)) + (global $~lib/util/number/_exp (mut i32) (i32.const 0)) + (global $~lib/util/number/_K (mut i32) (i32.const 0)) + (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) + (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 36140)) + (memory $0 1) + (data $0 (i32.const 1036) "\1c") + (data $0.1 (i32.const 1048) "\02\00\00\00\06\00\00\000\00.\000") + (data $1 (i32.const 1068) "\1c") + (data $1.1 (i32.const 1080) "\02\00\00\00\06\00\00\00N\00a\00N") + (data $2 (i32.const 1100) ",") + (data $2.1 (i32.const 1112) "\02\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") + (data $3 (i32.const 1148) ",") + (data $3.1 (i32.const 1160) "\02\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") + (data $5 (i32.const 1256) "\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_\rXf\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 (param $0 i32) (param $1 f32) (result i32) + (local $2 f64) + (local $3 i32) + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) + local.get $1 + f64.promote_f32 + local.tee $2 + f64.const 0 + f64.eq + if + local.get $0 + i32.const 48 + i32.store16 + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + i32.const 48 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + local.get $2 + local.get $2 + f64.sub + f64.const 0 + f64.ne + if + local.get $2 + local.get $2 + f64.ne + if + local.get $0 + i32.const 78 + i32.store16 + local.get $0 + i32.const 97 + i32.store16 offset=2 + local.get $0 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + else + local.get $2 + f64.const 0 + f64.lt + local.tee $3 + if + local.get $0 + i32.const 45 + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + end + local.get $0 + i64.const 29555310648492105 + i64.store + local.get $0 + i64.const 34058970405077102 + i64.store offset=8 + local.get $3 + i32.const 8 + i32.add + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + unreachable + end + local.get $0 + local.get $2 + i32.const 1 + call $~lib/util/number/dtoa_core + end + ) + (func $~lib/util/number/dtoa_buffered (param $0 i32) (param $1 f64) (result i32) + (local $2 i32) + block $~lib/util/number/dtoa_buffered_impl|inlined.1 (result i32) + local.get $1 + f64.const 0 + f64.eq + if + local.get $0 + i32.const 48 + i32.store16 + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + i32.const 48 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + local.get $1 + local.get $1 + f64.sub + f64.const 0 + f64.ne + if + local.get $1 + local.get $1 + f64.ne + if + local.get $0 + i32.const 78 + i32.store16 + local.get $0 + i32.const 97 + i32.store16 offset=2 + local.get $0 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + else + local.get $1 + f64.const 0 + f64.lt + local.tee $2 + if + local.get $0 + i32.const 45 + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + end + local.get $0 + i64.const 29555310648492105 + i64.store + local.get $0 + i64.const 34058970405077102 + i64.store offset=8 + local.get $2 + i32.const 8 + i32.add + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + unreachable + end + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/number/dtoa_core + end + ) + (func $~lib/array/Array~visit (param $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + if + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid + block $~lib/array/Array + block $~lib/array/Array + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/array/Array $~lib/array/Array $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + local.get $0 + call $~lib/array/Array~visit + return + end + local.get $0 + call $~lib/array/Array~visit + return + end + unreachable + ) + (func $~start + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + memory.size + i32.const 16 + i32.shl + i32.const 36140 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 2708 + i32.const 2704 + i32.store + i32.const 2712 + i32.const 2704 + i32.store + i32.const 2704 + global.set $~lib/rt/itcms/pinSpace + i32.const 2740 + i32.const 2736 + i32.store + i32.const 2744 + i32.const 2736 + i32.store + i32.const 2736 + global.set $~lib/rt/itcms/toSpace + i32.const 2884 + i32.const 2880 + i32.store + i32.const 2888 + i32.const 2880 + i32.store + i32.const 2880 + global.set $~lib/rt/itcms/fromSpace + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1200 + f64.const 1.100000023841858 + i32.const 1 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + local.get $1 + i32.const 1200 + local.get $0 + memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2992 + i32.store offset=4 + local.get $1 + i32.const 2992 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 3024 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1200 + f64.const 1.1 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + local.get $1 + i32.const 1200 + local.get $0 + memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2992 + i32.store offset=4 + local.get $1 + i32.const 2992 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 3024 + i32.const 2 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3104 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3104 + i32.store + i32.const 3108 + i32.load + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 3104 + i32.store + i32.const 3116 + i32.load + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store + local.get $0 + local.get $1 + call $~lib/util/string/joinFloatArray + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3216 + i32.store offset=4 + local.get $0 + i32.const 3216 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 3024 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3312 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3312 + i32.store + i32.const 3316 + i32.load + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 3312 + i32.store + i32.const 3324 + i32.load + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store + local.get $0 + local.get $1 + call $~lib/util/string/joinFloatArray + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3216 + i32.store offset=4 + local.get $0 + i32.const 3216 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 3024 + i32.const 8 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + if + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $0 + local.get $1 + i32.eq + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1 + return + end + block $folding-inner0 + local.get $1 + i32.eqz + local.get $0 + i32.eqz + i32.or + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $3 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $3 + local.tee $0 + i32.const 4 + i32.ge_u + if (result i32) + local.get $2 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + else + i32.const 1 + end + i32.eqz + if + loop $do-loop|0 + local.get $2 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + block $__inlined_func$~lib/util/string/compareImpl$84 + loop $while-continue|1 + local.get $0 + local.tee $3 + i32.const 1 + i32.sub + local.set $0 + local.get $3 + if + local.get $2 + i32.load16_u + local.tee $5 + local.get $1 + i32.load16_u + local.tee $4 + i32.sub + local.set $3 + local.get $4 + local.get $5 + i32.ne + br_if $__inlined_func$~lib/util/string/compareImpl$84 + local.get $2 + i32.const 2 + i32.add + local.set $2 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + local.set $3 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + i32.eqz + return + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + ) + (func $~lib/string/String#substring (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + if + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $1 + i32.const 0 + local.get $1 + i32.const 0 + i32.gt_s + select + local.tee $2 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + local.get $1 + local.get $2 + i32.gt_s + select + local.tee $2 + i32.const 0 + local.get $2 + i32.const 0 + i32.le_s + select + i32.const 1 + i32.shl + local.set $3 + local.get $2 + i32.const 0 + local.get $2 + i32.const 0 + i32.ge_s + select + i32.const 1 + i32.shl + local.tee $4 + local.get $3 + i32.sub + local.tee $2 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3152 + return + end + local.get $3 + i32.eqz + local.get $4 + local.get $1 + i32.const 1 + i32.shl + i32.eq + i32.and + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + return + end + global.get $~lib/memory/__stack_pointer + local.get $2 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store offset=4 + local.get $1 + local.get $0 + local.get $3 + i32.add + local.get $2 + memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/util/string/joinFloatArray (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 f64) + (local $4 i32) + (local $5 f32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner1 + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $1 + i32.const 1 + i32.sub + local.tee $8 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3152 + return + end + local.get $8 + i32.eqz + if + local.get $0 + f32.load + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1056 + local.set $0 + block $~lib/util/number/dtoa_impl|inlined.2 + local.get $5 + f64.promote_f32 + local.tee $3 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.2 + local.get $3 + local.get $3 + f64.sub + f64.const 0 + f64.ne + if + i32.const 1088 + local.set $0 + local.get $3 + local.get $3 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.2 + i32.const 1120 + i32.const 1168 + local.get $3 + f64.const 0 + f64.lt + select + local.set $0 + br $~lib/util/number/dtoa_impl|inlined.2 + end + i32.const 1200 + local.get $3 + i32.const 1 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + local.get $0 + i32.const 1200 + local.get $1 + memory.copy + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + br $folding-inner1 + end + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3180 + i32.load + i32.const 1 + i32.shr_u + local.tee $1 + i32.const 28 + i32.add + local.get $8 + i32.mul + i32.const 28 + i32.add + local.tee $6 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__new + local.tee $7 + i32.store offset=4 + loop $for-loop|0 + local.get $4 + local.get $8 + i32.lt_s + if + local.get $7 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $4 + i32.const 2 + i32.shl + i32.add + f32.load + call $~lib/util/number/dtoa_buffered + local.get $2 + i32.add + local.set $2 + local.get $1 + if + local.get $7 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 3184 + local.get $1 + i32.const 1 + i32.shl + memory.copy + local.get $1 + local.get $2 + i32.add + local.set $2 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|0 + end + end + local.get $7 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $8 + i32.const 2 + i32.shl + i32.add + f32.load + call $~lib/util/number/dtoa_buffered + local.get $2 + i32.add + local.tee $0 + local.get $6 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $7 + i32.store + local.get $7 + local.get $0 + call $~lib/string/String#substring + local.set $0 + br $folding-inner1 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $7 + return + end + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/util/string/joinFloatArray (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 f64) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner1 + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $1 + i32.const 1 + i32.sub + local.tee $7 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3152 + return + end + local.get $7 + i32.eqz + if + local.get $0 + f64.load + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1056 + local.set $0 + block $~lib/util/number/dtoa_impl|inlined.3 + local.get $3 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.3 + local.get $3 + local.get $3 + f64.sub + f64.const 0 + f64.ne + if + i32.const 1088 + local.set $0 + local.get $3 + local.get $3 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.3 + i32.const 1120 + i32.const 1168 + local.get $3 + f64.const 0 + f64.lt + select + local.set $0 + br $~lib/util/number/dtoa_impl|inlined.3 + end + i32.const 1200 + local.get $3 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + local.get $0 + i32.const 1200 + local.get $1 + memory.copy + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + br $folding-inner1 + end + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3180 + i32.load + i32.const 1 + i32.shr_u + local.tee $1 + i32.const 28 + i32.add + local.get $7 + i32.mul + i32.const 28 + i32.add + local.tee $5 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__new + local.tee $6 + i32.store offset=4 + loop $for-loop|0 + local.get $4 + local.get $7 + i32.lt_s + if + local.get $6 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $4 + i32.const 3 + i32.shl + i32.add + f64.load + call $~lib/util/number/dtoa_buffered + local.get $2 + i32.add + local.set $2 + local.get $1 + if + local.get $6 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 3184 + local.get $1 + i32.const 1 + i32.shl + memory.copy + local.get $1 + local.get $2 + i32.add + local.set $2 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|0 + end + end + local.get $6 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $7 + i32.const 3 + i32.shl + i32.add + f64.load + call $~lib/util/number/dtoa_buffered + local.get $2 + i32.add + local.tee $0 + local.get $5 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store + local.get $6 + local.get $0 + call $~lib/string/String#substring + local.set $0 + br $folding-inner1 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + return + end + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) +) diff --git a/tests/compiler/issues/2873.ts b/tests/compiler/issues/2873.ts new file mode 100644 index 0000000000..2c93f8b66b --- /dev/null +++ b/tests/compiler/issues/2873.ts @@ -0,0 +1,8 @@ +assert((1.1).toString() == "1.1"); +assert((1.1).toString() == "1.1"); + +const f32arr: f32[] = [1.1, 2.2, 3.3]; +assert(f32arr.join() == "1.1,2.2,3.3"); + +const f64arr: f64[] = [1.1, 2.2, 3.3]; +assert(f64arr.join() == "1.1,2.2,3.3"); From 75b8ab8849fe86cf7b28d24fbc41df4e562e7227 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 10:34:37 -0800 Subject: [PATCH 02/10] Update existing dtoa tests --- tests/compiler/std/string.debug.wat | 1342 +++++++++++++------- tests/compiler/std/string.release.wat | 1626 +++++++++++++++---------- tests/compiler/std/string.ts | 44 +- 3 files changed, 1889 insertions(+), 1123 deletions(-) diff --git a/tests/compiler/std/string.debug.wat b/tests/compiler/std/string.debug.wat index b66caa8920..91e1b529be 100644 --- a/tests/compiler/std/string.debug.wat +++ b/tests/compiler/std/string.debug.wat @@ -11,19 +11,20 @@ (type $9 (func (param i32) (result f64))) (type $10 (func (result i32))) (type $11 (func (param i32 i64 i32))) - (type $12 (func (param i32 i32) (result f64))) - (type $13 (func (param i32 i32) (result i64))) - (type $14 (func (param i32 i32 i32 i32 i32) (result i32))) - (type $15 (func (param i32 i32 i64) (result i32))) - (type $16 (func (param f64 i32) (result f64))) - (type $17 (func (param f64 f64) (result i32))) - (type $18 (func (param i32 i64 i32 i32))) - (type $19 (func (param i64) (result i32))) + (type $12 (func (param i64) (result i32))) + (type $13 (func (param i32 i32) (result f64))) + (type $14 (func (param i32 i32) (result i64))) + (type $15 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $16 (func (param i32 i32 i64) (result i32))) + (type $17 (func (param f64 i32) (result f64))) + (type $18 (func (param f64 f64) (result i32))) + (type $19 (func (param i32 i64 i32 i32))) (type $20 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) - (type $21 (func (param i32 f64) (result i32))) + (type $21 (func (param i32 f64 i32) (result i32))) (type $22 (func (param i32) (result f32))) (type $23 (func (param i32 i32 i32 i32) (result i32))) (type $24 (func (param f64) (result i32))) + (type $25 (func (param f32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $std/string/str (mut i32) (i32.const 32)) (global $std/string/nullStr (mut i32) (i32.const 0)) @@ -67,10 +68,12 @@ (global $~lib/util/number/_K (mut i32) (i32.const 0)) (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 25392)) - (global $~lib/memory/__data_end i32 (i32.const 25420)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 58188)) - (global $~lib/memory/__heap_base i32 (i32.const 58188)) + (global $~lib/builtins/f32.EPSILON f32 (f32.const 1.1920928955078125e-07)) + (global $~lib/builtins/f32.MAX_VALUE f32 (f32.const 3402823466385288598117041e14)) + (global $~lib/rt/__rtti_base i32 (i32.const 25632)) + (global $~lib/memory/__data_end i32 (i32.const 25660)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 58428)) + (global $~lib/memory/__heap_base i32 (i32.const 58428)) (memory $0 1) (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g\00\00\00\00\00\00\00\00\00\00\00\00\00") (data $1 (i32.const 76) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00s\00t\00d\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00\00\00") @@ -502,48 +505,53 @@ (data $427 (i32.const 23248) "\01\00\00\00\n\00\00\00d\00\00\00\e8\03\00\00\10\'\00\00\a0\86\01\00@B\0f\00\80\96\98\00\00\e1\f5\05\00\ca\9a;") (data $428 (i32.const 23292) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00,\00\00\00-\002\00.\002\002\000\004\004\006\000\004\009\002\005\000\003\001\003\00e\00-\001\006\00") (data $429 (i32.const 23356) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\000\00\00\00-\001\00.\007\009\007\006\009\003\001\003\004\008\006\002\003\001\005\007\00e\00+\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $430 (i32.const 23436) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00,\00\00\004\00.\001\008\005\005\008\000\004\009\006\008\002\001\003\005\007\00e\00+\002\009\008\00") - (data $431 (i32.const 23500) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00.\00\00\002\00.\002\002\005\000\007\003\008\005\008\005\000\007\002\000\001\004\00e\00-\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $432 (i32.const 23580) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\004\00.\009\004\000\006\005\006\00e\00-\003\001\008\00\00\00") - (data $433 (i32.const 23628) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\009\000\006\000\008\000\001\001\005\003\004\003\003\006\000\000\00.\000\00\00\00\00\00\00\00\00\00") - (data $434 (i32.const 23692) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\004\007\000\008\003\005\006\000\002\004\007\001\001\005\001\002\000\000\000\00.\000\00\00\00") - (data $435 (i32.const 23756) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\009\004\000\009\003\004\000\000\001\002\005\006\008\002\004\008\000\000\000\00.\000\00\00\00") - (data $436 (i32.const 23820) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\001\00.\000\00\00\00\00\00\00\00") - (data $437 (i32.const 23852) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00-\001\00.\000\00\00\00\00\00") - (data $438 (i32.const 23884) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00-\000\00.\001\00\00\00\00\00") - (data $439 (i32.const 23916) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\001\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00\00\00") - (data $440 (i32.const 23964) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\000\00.\000\000\000\000\000\001\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $441 (i32.const 24012) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00-\001\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00") - (data $442 (i32.const 24060) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\00-\000\00.\000\000\000\000\000\001\00\00\00\00\00\00\00\00\00\00\00") - (data $443 (i32.const 24108) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\001\000\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00") - (data $444 (i32.const 24156) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\001\00e\00-\007\00\00\00\00\00") - (data $445 (i32.const 24188) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00+\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $446 (i32.const 24236) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\001\00e\00-\003\000\008\00") - (data $447 (i32.const 24268) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00-\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $448 (i32.const 24316) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\001\00e\00-\003\002\003\00") - (data $449 (i32.const 24348) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00-\003\002\003\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $450 (i32.const 24396) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000\00\00\00\00\00") - (data $451 (i32.const 24444) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008\00\00\00") - (data $452 (i32.const 24508) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006\00\00\00\00\00\00\00\00\00\00\00") - (data $453 (i32.const 24572) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\00\00\00\00\00\00\00\00\00") - (data $454 (i32.const 24636) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\001\002\00.\003\004\00\00\00") - (data $455 (i32.const 24668) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\00\00\00\00\00\00\00\00\00") - (data $456 (i32.const 24732) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $457 (i32.const 24812) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001\00\00\00\00\00\00\00\00\00\00\00") - (data $458 (i32.const 24860) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $459 (i32.const 24908) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00") - (data $460 (i32.const 24956) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $461 (i32.const 25004) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $462 (i32.const 25052) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $463 (i32.const 25100) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009\00\00\00\00\00\00\00") - (data $464 (i32.const 25148) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 \00") - (data $465 (i32.const 25180) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00W\00o\00r\00l\00d\00\00\00") - (data $466 (i32.const 25212) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d\00\00\00\00\00\00\00") - (data $467 (i32.const 25260) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00b\00a\00r\00\00\00\00\00\00\00") - (data $468 (i32.const 25292) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\c0\00\c8\00\00\00\00\00\00\00\00\00") - (data $469 (i32.const 25324) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\d8S\cf\91\00\00\00\00\00\00\00\00") - (data $470 (i32.const 25356) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df\00\00\00\00") - (data $471 (i32.const 25392) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A\00\00") + (data $430 (i32.const 23436) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\001\00.\001\009\002\000\009\002\009\00e\00-\007\00\00\00\00\00") + (data $431 (i32.const 23484) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00-\001\00.\001\009\002\000\009\002\009\00e\00-\007\00\00\00") + (data $432 (i32.const 23532) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\003\00.\004\000\002\008\002\003\005\00e\00+\003\008\00\00\00") + (data $433 (i32.const 23580) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00-\003\00.\004\000\002\008\002\003\005\00e\00+\003\008\00") + (data $434 (i32.const 23628) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00,\00\00\004\00.\001\008\005\005\008\000\004\009\006\008\002\001\003\005\007\00e\00+\002\009\008\00") + (data $435 (i32.const 23692) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00.\00\00\002\00.\002\002\005\000\007\003\008\005\008\005\000\007\002\000\001\004\00e\00-\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $436 (i32.const 23772) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\004\00.\009\004\000\006\005\006\00e\00-\003\001\008\00\00\00") + (data $437 (i32.const 23820) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\009\000\006\000\008\000\001\001\005\003\004\003\003\006\000\000\00.\000\00\00\00\00\00\00\00\00\00") + (data $438 (i32.const 23884) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\004\007\000\008\003\005\006\000\002\004\007\001\001\005\001\002\000\000\000\00.\000\00\00\00") + (data $439 (i32.const 23948) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\009\004\000\009\003\004\000\000\001\002\005\006\008\002\004\008\000\000\000\00.\000\00\00\00") + (data $440 (i32.const 24012) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\001\00.\000\00\00\00\00\00\00\00") + (data $441 (i32.const 24044) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00-\001\00.\000\00\00\00\00\00") + (data $442 (i32.const 24076) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00-\000\00.\001\00\00\00\00\00") + (data $443 (i32.const 24108) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\001\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00\00\00") + (data $444 (i32.const 24156) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\000\00.\000\000\000\000\000\001\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $445 (i32.const 24204) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00-\001\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00") + (data $446 (i32.const 24252) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\00-\000\00.\000\000\000\000\000\001\00\00\00\00\00\00\00\00\00\00\00") + (data $447 (i32.const 24300) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\001\000\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00") + (data $448 (i32.const 24348) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\001\00e\00-\007\00\00\00\00\00") + (data $449 (i32.const 24380) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00+\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $450 (i32.const 24428) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\001\00e\00-\003\000\008\00") + (data $451 (i32.const 24460) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00-\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $452 (i32.const 24508) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\001\00e\00-\003\002\003\00") + (data $453 (i32.const 24540) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00-\003\002\003\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $454 (i32.const 24588) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008\00\00\00") + (data $455 (i32.const 24652) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006\00\00\00\00\00\00\00\00\00\00\00") + (data $456 (i32.const 24716) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\00\00\00\00\00\00\00\00\00") + (data $457 (i32.const 24780) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\001\002\00.\003\004\00\00\00") + (data $458 (i32.const 24812) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\00\00\00\00\00\00\00\00\00") + (data $459 (i32.const 24876) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $460 (i32.const 24956) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001\00\00\00\00\00\00\00\00\00\00\00") + (data $461 (i32.const 25004) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $462 (i32.const 25052) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00") + (data $463 (i32.const 25100) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $464 (i32.const 25148) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $465 (i32.const 25196) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $466 (i32.const 25244) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009\00\00\00\00\00\00\00") + (data $467 (i32.const 25292) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000\00\00\00\00\00") + (data $468 (i32.const 25340) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\004\002\009\004\009\006\007\003\000\000\00.\000\00\00\00\00\00") + (data $469 (i32.const 25388) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 \00") + (data $470 (i32.const 25420) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00W\00o\00r\00l\00d\00\00\00") + (data $471 (i32.const 25452) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d\00\00\00\00\00\00\00") + (data $472 (i32.const 25500) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00b\00a\00r\00\00\00\00\00\00\00") + (data $473 (i32.const 25532) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\c0\00\c8\00\00\00\00\00\00\00\00\00") + (data $474 (i32.const 25564) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\d8S\cf\91\00\00\00\00\00\00\00\00") + (data $475 (i32.const 25596) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df\00\00\00\00") + (data $476 (i32.const 25632) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "getString" (func $std/string/getString)) @@ -4924,26 +4932,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -4959,28 +4971,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -4999,77 +5011,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -5080,12 +5138,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -5137,14 +5195,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -5229,63 +5287,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -5294,11 +5352,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -5307,63 +5365,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -5374,13 +5432,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -5571,8 +5629,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 58208 - i32.const 58256 + i32.const 58448 + i32.const 58496 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -27042,7 +27100,7 @@ unreachable end f64.const 0 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27065,7 +27123,7 @@ unreachable end f64.const -0 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27088,7 +27146,7 @@ unreachable end f64.const nan:0x8000000000000 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27111,7 +27169,7 @@ unreachable end f64.const inf - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27135,7 +27193,7 @@ end f64.const inf f64.neg - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27158,7 +27216,7 @@ unreachable end global.get $~lib/builtins/f64.EPSILON - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27182,7 +27240,7 @@ end global.get $~lib/builtins/f64.EPSILON f64.neg - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27205,7 +27263,7 @@ unreachable end global.get $~lib/builtins/f64.MAX_VALUE - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27229,7 +27287,7 @@ end global.get $~lib/builtins/f64.MAX_VALUE f64.neg - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27251,8 +27309,8 @@ call $~lib/builtins/abort unreachable end - f64.const 4185580496821356722454785e274 - call $~lib/util/number/dtoa + global.get $~lib/builtins/f32.EPSILON + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27274,14 +27332,15 @@ call $~lib/builtins/abort unreachable end - f64.const 2.2250738585072014e-308 - call $~lib/util/number/dtoa + global.get $~lib/builtins/f32.EPSILON + f32.neg + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23520 + i32.const 23504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27297,14 +27356,14 @@ call $~lib/builtins/abort unreachable end - f64.const 4.940656e-318 - call $~lib/util/number/dtoa + global.get $~lib/builtins/f32.MAX_VALUE + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23600 + i32.const 23552 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27315,19 +27374,20 @@ if i32.const 0 i32.const 96 - i32.const 749 + i32.const 747 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 9060801153433600 - call $~lib/util/number/dtoa + global.get $~lib/builtins/f32.MAX_VALUE + f32.neg + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23648 + i32.const 23600 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27338,19 +27398,19 @@ if i32.const 0 i32.const 96 - i32.const 750 + i32.const 748 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 4708356024711512064 - call $~lib/util/number/dtoa + f64.const 4185580496821356722454785e274 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23712 + i32.const 23648 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27361,19 +27421,19 @@ if i32.const 0 i32.const 96 - i32.const 751 + i32.const 749 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 9409340012568248320 - call $~lib/util/number/dtoa + f64.const 2.2250738585072014e-308 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23776 + i32.const 23712 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27384,19 +27444,19 @@ if i32.const 0 i32.const 96 - i32.const 752 + i32.const 750 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 5e-324 - call $~lib/util/number/dtoa + f64.const 4.940656e-318 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 7296 + i32.const 23792 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27407,13 +27467,13 @@ if i32.const 0 i32.const 96 - i32.const 753 + i32.const 751 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1 - call $~lib/util/number/dtoa + f64.const 9060801153433600 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27430,19 +27490,19 @@ if i32.const 0 i32.const 96 - i32.const 759 + i32.const 752 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.1 - call $~lib/util/number/dtoa + f64.const 4708356024711512064 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 4256 + i32.const 23904 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27453,19 +27513,19 @@ if i32.const 0 i32.const 96 - i32.const 760 + i32.const 753 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1 - call $~lib/util/number/dtoa + f64.const 9409340012568248320 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23872 + i32.const 23968 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27476,19 +27536,19 @@ if i32.const 0 i32.const 96 - i32.const 761 + i32.const 754 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -0.1 - call $~lib/util/number/dtoa + f64.const 5e-324 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23904 + i32.const 7296 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27499,19 +27559,19 @@ if i32.const 0 i32.const 96 - i32.const 762 + i32.const 755 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1e6 - call $~lib/util/number/dtoa + f64.const 1 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23936 + i32.const 24032 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27522,19 +27582,19 @@ if i32.const 0 i32.const 96 - i32.const 764 + i32.const 757 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1e-06 - call $~lib/util/number/dtoa + f64.const 0.1 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23984 + i32.const 4256 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27545,19 +27605,19 @@ if i32.const 0 i32.const 96 - i32.const 765 + i32.const 758 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1e6 - call $~lib/util/number/dtoa + f64.const -1 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24032 + i32.const 24064 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27568,19 +27628,19 @@ if i32.const 0 i32.const 96 - i32.const 766 + i32.const 759 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1e-06 - call $~lib/util/number/dtoa + f64.const -0.1 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24080 + i32.const 24096 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27591,13 +27651,13 @@ if i32.const 0 i32.const 96 - i32.const 767 + i32.const 760 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1e7 - call $~lib/util/number/dtoa + f64.const 1e6 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27614,13 +27674,13 @@ if i32.const 0 i32.const 96 - i32.const 768 + i32.const 762 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1e-07 - call $~lib/util/number/dtoa + f64.const 1e-06 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27637,19 +27697,19 @@ if i32.const 0 i32.const 96 - i32.const 769 + i32.const 763 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.e+308 - call $~lib/util/number/dtoa + f64.const -1e6 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 4544 + i32.const 24224 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27660,19 +27720,19 @@ if i32.const 0 i32.const 96 - i32.const 771 + i32.const 764 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1.e+308 - call $~lib/util/number/dtoa + f64.const -1e-06 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24208 + i32.const 24272 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27683,19 +27743,19 @@ if i32.const 0 i32.const 96 - i32.const 772 + i32.const 765 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const inf - call $~lib/util/number/dtoa + f64.const 1e7 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 22288 + i32.const 24320 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27706,19 +27766,19 @@ if i32.const 0 i32.const 96 - i32.const 773 + i32.const 766 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -inf - call $~lib/util/number/dtoa + f64.const 1e-07 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 7936 + i32.const 24368 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27729,19 +27789,19 @@ if i32.const 0 i32.const 96 - i32.const 774 + i32.const 767 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1e-308 - call $~lib/util/number/dtoa + f64.const 1.e+308 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24256 + i32.const 4544 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27752,19 +27812,19 @@ if i32.const 0 i32.const 96 - i32.const 775 + i32.const 769 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1e-308 - call $~lib/util/number/dtoa + f64.const -1.e+308 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24288 + i32.const 24400 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27775,19 +27835,19 @@ if i32.const 0 i32.const 96 - i32.const 776 + i32.const 770 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1e-323 - call $~lib/util/number/dtoa + f64.const inf + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24336 + i32.const 22288 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27798,19 +27858,19 @@ if i32.const 0 i32.const 96 - i32.const 777 + i32.const 771 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1e-323 - call $~lib/util/number/dtoa + f64.const -inf + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24368 + i32.const 7936 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27821,19 +27881,19 @@ if i32.const 0 i32.const 96 - i32.const 778 + i32.const 772 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0 - call $~lib/util/number/dtoa + f64.const 1e-308 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 22256 + i32.const 24448 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27844,19 +27904,19 @@ if i32.const 0 i32.const 96 - i32.const 779 + i32.const 773 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 4294967272 - call $~lib/util/number/dtoa + f64.const -1e-308 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24416 + i32.const 24480 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27867,19 +27927,19 @@ if i32.const 0 i32.const 96 - i32.const 781 + i32.const 774 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.2312145673456234e-08 - call $~lib/util/number/dtoa + f64.const 1e-323 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24464 + i32.const 24528 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27890,19 +27950,19 @@ if i32.const 0 i32.const 96 - i32.const 782 + i32.const 775 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 555555555.5555556 - call $~lib/util/number/dtoa + f64.const -1e-323 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24528 + i32.const 24560 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27913,19 +27973,19 @@ if i32.const 0 i32.const 96 - i32.const 784 + i32.const 776 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.9999999999999999 - call $~lib/util/number/dtoa + f64.const 0 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24592 + i32.const 22256 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27936,19 +27996,19 @@ if i32.const 0 i32.const 96 - i32.const 785 + i32.const 777 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1 - call $~lib/util/number/dtoa + f64.const 1.2312145673456234e-08 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23840 + i32.const 24608 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27959,19 +28019,19 @@ if i32.const 0 i32.const 96 - i32.const 786 + i32.const 779 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 12.34 - call $~lib/util/number/dtoa + f64.const 555555555.5555556 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24656 + i32.const 24672 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27982,21 +28042,19 @@ if i32.const 0 i32.const 96 - i32.const 787 + i32.const 780 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1 - f64.const 3 - f64.div - call $~lib/util/number/dtoa + f64.const 0.9999999999999999 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24688 + i32.const 24736 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28007,19 +28065,19 @@ if i32.const 0 i32.const 96 - i32.const 789 + i32.const 781 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1234e17 - call $~lib/util/number/dtoa + f64.const 1 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24752 + i32.const 24032 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28030,19 +28088,19 @@ if i32.const 0 i32.const 96 - i32.const 790 + i32.const 782 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1234e18 - call $~lib/util/number/dtoa + f64.const 12.34 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24832 + i32.const 24800 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28053,19 +28111,21 @@ if i32.const 0 i32.const 96 - i32.const 791 + i32.const 783 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 2.71828 - call $~lib/util/number/dtoa + f64.const 1 + f64.const 3 + f64.div + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24880 + i32.const 24832 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28076,19 +28136,19 @@ if i32.const 0 i32.const 96 - i32.const 792 + i32.const 784 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.0271828 - call $~lib/util/number/dtoa + f64.const 1234e17 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24928 + i32.const 24896 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28099,13 +28159,13 @@ if i32.const 0 i32.const 96 - i32.const 793 + i32.const 785 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 271.828 - call $~lib/util/number/dtoa + f64.const 1234e18 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28122,13 +28182,13 @@ if i32.const 0 i32.const 96 - i32.const 794 + i32.const 786 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.1e+128 - call $~lib/util/number/dtoa + f64.const 2.71828 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28145,13 +28205,13 @@ if i32.const 0 i32.const 96 - i32.const 795 + i32.const 787 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.1e-64 - call $~lib/util/number/dtoa + f64.const 0.0271828 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28168,13 +28228,13 @@ if i32.const 0 i32.const 96 - i32.const 796 + i32.const 788 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.000035689 - call $~lib/util/number/dtoa + f64.const 271.828 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28191,30 +28251,42 @@ if i32.const 0 i32.const 96 - i32.const 797 + i32.const 789 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25168 + f64.const 1.1e+128 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 - i32.store offset=8 + i32.store local.get $55 - i32.const 25200 + i32.const 25168 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 - i32.store offset=12 + i32.store offset=4 local.get $55 - call $~lib/string/String#concat + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 790 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const 1.1e-64 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25232 + i32.const 25216 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28225,7 +28297,133 @@ if i32.const 0 i32.const 96 - i32.const 802 + i32.const 791 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const 0.000035689 + call $~lib/util/number/dtoa + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store + local.get $55 + i32.const 25264 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=4 + local.get $55 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 792 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i64.const 4294967272 + call $~lib/util/number/dtoa + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store + local.get $55 + i32.const 25312 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=4 + local.get $55 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 796 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const -24 + call $~lib/util/number/dtoa + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store + local.get $55 + i32.const 25360 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=4 + local.get $55 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 797 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const -24 + call $~lib/util/number/dtoa + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store + local.get $55 + i32.const 25360 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=4 + local.get $55 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 798 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 25408 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=8 + local.get $55 + i32.const 25440 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=12 + local.get $55 + call $~lib/string/String#concat + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store + local.get $55 + i32.const 25472 + local.set $55 + global.get $~lib/memory/__stack_pointer + local.get $55 + i32.store offset=4 + local.get $55 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 825 i32.const 1 call $~lib/builtins/abort unreachable @@ -28236,7 +28434,7 @@ local.get $55 i32.store offset=8 local.get $55 - i32.const 25280 + i32.const 25520 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28248,7 +28446,7 @@ local.get $55 i32.store local.get $55 - i32.const 25280 + i32.const 25520 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28259,12 +28457,12 @@ if i32.const 0 i32.const 96 - i32.const 803 + i32.const 826 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25280 + i32.const 25520 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28282,7 +28480,7 @@ local.get $55 i32.store local.get $55 - i32.const 25280 + i32.const 25520 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28293,7 +28491,7 @@ if i32.const 0 i32.const 96 - i32.const 804 + i32.const 827 i32.const 1 call $~lib/builtins/abort unreachable @@ -28327,18 +28525,18 @@ if i32.const 0 i32.const 96 - i32.const 805 + i32.const 828 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25312 + i32.const 25552 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25312 + i32.const 25552 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28349,18 +28547,18 @@ if i32.const 0 i32.const 96 - i32.const 816 + i32.const 836 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25312 + i32.const 25552 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25312 + i32.const 25552 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28371,18 +28569,18 @@ if i32.const 0 i32.const 96 - i32.const 817 + i32.const 837 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25344 + i32.const 25584 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25344 + i32.const 25584 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28393,18 +28591,18 @@ if i32.const 0 i32.const 96 - i32.const 818 + i32.const 838 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25376 + i32.const 25616 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25376 + i32.const 25616 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28415,7 +28613,7 @@ if i32.const 0 i32.const 96 - i32.const 819 + i32.const 839 i32.const 1 call $~lib/builtins/abort unreachable @@ -29439,10 +29637,12 @@ local.get $18 return ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -29451,76 +29651,314 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 22256 - local.set $3 + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) + local.get $value + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 22256 + br $~lib/util/number/dtoa_impl|inlined.0 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 6672 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 7936 + i32.const 22288 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 22320 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 22320 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa (param $value f32) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 4 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.1 (result i32) local.get $value - f64.ne + f64.promote_f32 + local.set $value|1 + i32.const 1 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 6672 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 22256 + br $~lib/util/number/dtoa_impl|inlined.1 end - i32.const 7936 - i32.const 22288 + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 6672 + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 7936 + i32.const 22288 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 22320 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 22320 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.1 + end + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa (param $value i64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.2 (result i32) local.get $value + f64.convert_i64_u + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 f64.const 0 - f64.lt - select - local.set $3 + f64.eq + if + i32.const 22256 + br $~lib/util/number/dtoa_impl|inlined.2 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 6672 + br $~lib/util/number/dtoa_impl|inlined.2 + end + i32.const 7936 + i32.const 22288 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.2 + end + i32.const 22320 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 22320 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.2 end - i32.const 22320 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa (param $value i32) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 i32.store - local.get $result - i32.const 22320 - local.get $size - memory.copy - local.get $result - local.set $3 + i32.const 4 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.3 (result i32) + local.get $value + f32.convert_i32_u + f64.promote_f32 + local.set $value|1 + i32.const 1 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 22256 + br $~lib/util/number/dtoa_impl|inlined.3 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 6672 + br $~lib/util/number/dtoa_impl|inlined.3 + end + i32.const 7936 + i32.const 22288 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.3 + end + i32.const 22320 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 22320 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.3 + end + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) ) diff --git a/tests/compiler/std/string.release.wat b/tests/compiler/std/string.release.wat index 8518493cd8..4dd9ea59bd 100644 --- a/tests/compiler/std/string.release.wat +++ b/tests/compiler/std/string.release.wat @@ -4,21 +4,23 @@ (type $2 (func (param i32) (result i32))) (type $3 (func)) (type $4 (func (param i32 i32))) - (type $5 (func (param i32))) - (type $6 (func (result i32))) + (type $5 (func (result i32))) + (type $6 (func (param i32))) (type $7 (func (param i32 i32 i32))) - (type $8 (func (param f64) (result i32))) - (type $9 (func (param i32 i32) (result f64))) - (type $10 (func (param i32) (result f64))) - (type $11 (func (param i64 i32) (result i32))) - (type $12 (func (param i32 i32 i32 i32))) - (type $13 (func (param i32 i32 i32 i32) (result i32))) - (type $14 (func (param i32 i32 i64))) - (type $15 (func (param f64 i32) (result f64))) - (type $16 (func (param i32 i64 i32 i32))) - (type $17 (func (param i32 i64 i32))) - (type $18 (func (param i64 i64 i32 i64 i32) (result i32))) + (type $8 (func (param i32 i32) (result f64))) + (type $9 (func (param i32) (result f64))) + (type $10 (func (param i64 i32) (result i32))) + (type $11 (func (param i32 i32 i32 i32))) + (type $12 (func (param i32 i32 i32 i32) (result i32))) + (type $13 (func (param i32 i32 i64))) + (type $14 (func (param f64 i32) (result f64))) + (type $15 (func (param i32 i64 i32 i32))) + (type $16 (func (param i32 i64 i32))) + (type $17 (func (param i64 i64 i32 i64 i32) (result i32))) + (type $18 (func (param f64 i32) (result i32))) (type $19 (func (result i64))) + (type $20 (func (param f64) (result i32))) + (type $21 (func (param f32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $std/string/str (mut i32) (i32.const 1056)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -39,7 +41,7 @@ (global $~lib/util/number/_K (mut i32) (i32.const 0)) (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 59212)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 59452)) (memory $0 1) (data $0 (i32.const 1036) "<") (data $0.1 (i32.const 1048) "\02\00\00\00 \00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g") @@ -888,89 +890,99 @@ (data $428.1 (i32.const 24328) "\02\00\00\00,\00\00\00-\002\00.\002\002\000\004\004\006\000\004\009\002\005\000\003\001\003\00e\00-\001\006") (data $429 (i32.const 24380) "L") (data $429.1 (i32.const 24392) "\02\00\00\000\00\00\00-\001\00.\007\009\007\006\009\003\001\003\004\008\006\002\003\001\005\007\00e\00+\003\000\008") - (data $430 (i32.const 24460) "<") - (data $430.1 (i32.const 24472) "\02\00\00\00,\00\00\004\00.\001\008\005\005\008\000\004\009\006\008\002\001\003\005\007\00e\00+\002\009\008") - (data $431 (i32.const 24524) "L") - (data $431.1 (i32.const 24536) "\02\00\00\00.\00\00\002\00.\002\002\005\000\007\003\008\005\008\005\000\007\002\000\001\004\00e\00-\003\000\008") - (data $432 (i32.const 24604) ",") - (data $432.1 (i32.const 24616) "\02\00\00\00\1a\00\00\004\00.\009\004\000\006\005\006\00e\00-\003\001\008") - (data $433 (i32.const 24652) "<") - (data $433.1 (i32.const 24664) "\02\00\00\00$\00\00\009\000\006\000\008\000\001\001\005\003\004\003\003\006\000\000\00.\000") - (data $434 (i32.const 24716) "<") - (data $434.1 (i32.const 24728) "\02\00\00\00*\00\00\004\007\000\008\003\005\006\000\002\004\007\001\001\005\001\002\000\000\000\00.\000") - (data $435 (i32.const 24780) "<") - (data $435.1 (i32.const 24792) "\02\00\00\00*\00\00\009\004\000\009\003\004\000\000\001\002\005\006\008\002\004\008\000\000\000\00.\000") - (data $436 (i32.const 24844) "\1c") - (data $436.1 (i32.const 24856) "\02\00\00\00\06\00\00\001\00.\000") - (data $437 (i32.const 24876) "\1c") - (data $437.1 (i32.const 24888) "\02\00\00\00\08\00\00\00-\001\00.\000") - (data $438 (i32.const 24908) "\1c") - (data $438.1 (i32.const 24920) "\02\00\00\00\08\00\00\00-\000\00.\001") - (data $439 (i32.const 24940) ",") - (data $439.1 (i32.const 24952) "\02\00\00\00\12\00\00\001\000\000\000\000\000\000\00.\000") - (data $440 (i32.const 24988) ",") - (data $440.1 (i32.const 25000) "\02\00\00\00\10\00\00\000\00.\000\000\000\000\000\001") - (data $441 (i32.const 25036) ",") - (data $441.1 (i32.const 25048) "\02\00\00\00\14\00\00\00-\001\000\000\000\000\000\000\00.\000") - (data $442 (i32.const 25084) ",") - (data $442.1 (i32.const 25096) "\02\00\00\00\12\00\00\00-\000\00.\000\000\000\000\000\001") + (data $430 (i32.const 24460) ",") + (data $430.1 (i32.const 24472) "\02\00\00\00\18\00\00\001\00.\001\009\002\000\009\002\009\00e\00-\007") + (data $431 (i32.const 24508) ",") + (data $431.1 (i32.const 24520) "\02\00\00\00\1a\00\00\00-\001\00.\001\009\002\000\009\002\009\00e\00-\007") + (data $432 (i32.const 24556) ",") + (data $432.1 (i32.const 24568) "\02\00\00\00\1a\00\00\003\00.\004\000\002\008\002\003\005\00e\00+\003\008") + (data $433 (i32.const 24604) ",") + (data $433.1 (i32.const 24616) "\02\00\00\00\1c\00\00\00-\003\00.\004\000\002\008\002\003\005\00e\00+\003\008") + (data $434 (i32.const 24652) "<") + (data $434.1 (i32.const 24664) "\02\00\00\00,\00\00\004\00.\001\008\005\005\008\000\004\009\006\008\002\001\003\005\007\00e\00+\002\009\008") + (data $435 (i32.const 24716) "L") + (data $435.1 (i32.const 24728) "\02\00\00\00.\00\00\002\00.\002\002\005\000\007\003\008\005\008\005\000\007\002\000\001\004\00e\00-\003\000\008") + (data $436 (i32.const 24796) ",") + (data $436.1 (i32.const 24808) "\02\00\00\00\1a\00\00\004\00.\009\004\000\006\005\006\00e\00-\003\001\008") + (data $437 (i32.const 24844) "<") + (data $437.1 (i32.const 24856) "\02\00\00\00$\00\00\009\000\006\000\008\000\001\001\005\003\004\003\003\006\000\000\00.\000") + (data $438 (i32.const 24908) "<") + (data $438.1 (i32.const 24920) "\02\00\00\00*\00\00\004\007\000\008\003\005\006\000\002\004\007\001\001\005\001\002\000\000\000\00.\000") + (data $439 (i32.const 24972) "<") + (data $439.1 (i32.const 24984) "\02\00\00\00*\00\00\009\004\000\009\003\004\000\000\001\002\005\006\008\002\004\008\000\000\000\00.\000") + (data $440 (i32.const 25036) "\1c") + (data $440.1 (i32.const 25048) "\02\00\00\00\06\00\00\001\00.\000") + (data $441 (i32.const 25068) "\1c") + (data $441.1 (i32.const 25080) "\02\00\00\00\08\00\00\00-\001\00.\000") + (data $442 (i32.const 25100) "\1c") + (data $442.1 (i32.const 25112) "\02\00\00\00\08\00\00\00-\000\00.\001") (data $443 (i32.const 25132) ",") - (data $443.1 (i32.const 25144) "\02\00\00\00\14\00\00\001\000\000\000\000\000\000\000\00.\000") - (data $444 (i32.const 25180) "\1c") - (data $444.1 (i32.const 25192) "\02\00\00\00\08\00\00\001\00e\00-\007") - (data $445 (i32.const 25212) ",") - (data $445.1 (i32.const 25224) "\02\00\00\00\0e\00\00\00-\001\00e\00+\003\000\008") - (data $446 (i32.const 25260) "\1c") - (data $446.1 (i32.const 25272) "\02\00\00\00\0c\00\00\001\00e\00-\003\000\008") - (data $447 (i32.const 25292) ",") - (data $447.1 (i32.const 25304) "\02\00\00\00\0e\00\00\00-\001\00e\00-\003\000\008") - (data $448 (i32.const 25340) "\1c") - (data $448.1 (i32.const 25352) "\02\00\00\00\0c\00\00\001\00e\00-\003\002\003") - (data $449 (i32.const 25372) ",") - (data $449.1 (i32.const 25384) "\02\00\00\00\0e\00\00\00-\001\00e\00-\003\002\003") - (data $450 (i32.const 25420) ",") - (data $450.1 (i32.const 25432) "\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000") - (data $451 (i32.const 25468) "<") - (data $451.1 (i32.const 25480) "\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008") - (data $452 (i32.const 25532) "<") - (data $452.1 (i32.const 25544) "\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006") - (data $453 (i32.const 25596) "<") - (data $453.1 (i32.const 25608) "\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009") - (data $454 (i32.const 25660) "\1c") - (data $454.1 (i32.const 25672) "\02\00\00\00\n\00\00\001\002\00.\003\004") - (data $455 (i32.const 25692) "<") - (data $455.1 (i32.const 25704) "\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003") - (data $456 (i32.const 25756) "L") - (data $456.1 (i32.const 25768) "\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000") - (data $457 (i32.const 25836) ",") - (data $457.1 (i32.const 25848) "\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001") - (data $458 (i32.const 25884) ",") - (data $458.1 (i32.const 25896) "\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008") - (data $459 (i32.const 25932) ",") - (data $459.1 (i32.const 25944) "\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008") + (data $443.1 (i32.const 25144) "\02\00\00\00\12\00\00\001\000\000\000\000\000\000\00.\000") + (data $444 (i32.const 25180) ",") + (data $444.1 (i32.const 25192) "\02\00\00\00\10\00\00\000\00.\000\000\000\000\000\001") + (data $445 (i32.const 25228) ",") + (data $445.1 (i32.const 25240) "\02\00\00\00\14\00\00\00-\001\000\000\000\000\000\000\00.\000") + (data $446 (i32.const 25276) ",") + (data $446.1 (i32.const 25288) "\02\00\00\00\12\00\00\00-\000\00.\000\000\000\000\000\001") + (data $447 (i32.const 25324) ",") + (data $447.1 (i32.const 25336) "\02\00\00\00\14\00\00\001\000\000\000\000\000\000\000\00.\000") + (data $448 (i32.const 25372) "\1c") + (data $448.1 (i32.const 25384) "\02\00\00\00\08\00\00\001\00e\00-\007") + (data $449 (i32.const 25404) ",") + (data $449.1 (i32.const 25416) "\02\00\00\00\0e\00\00\00-\001\00e\00+\003\000\008") + (data $450 (i32.const 25452) "\1c") + (data $450.1 (i32.const 25464) "\02\00\00\00\0c\00\00\001\00e\00-\003\000\008") + (data $451 (i32.const 25484) ",") + (data $451.1 (i32.const 25496) "\02\00\00\00\0e\00\00\00-\001\00e\00-\003\000\008") + (data $452 (i32.const 25532) "\1c") + (data $452.1 (i32.const 25544) "\02\00\00\00\0c\00\00\001\00e\00-\003\002\003") + (data $453 (i32.const 25564) ",") + (data $453.1 (i32.const 25576) "\02\00\00\00\0e\00\00\00-\001\00e\00-\003\002\003") + (data $454 (i32.const 25612) "<") + (data $454.1 (i32.const 25624) "\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008") + (data $455 (i32.const 25676) "<") + (data $455.1 (i32.const 25688) "\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006") + (data $456 (i32.const 25740) "<") + (data $456.1 (i32.const 25752) "\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009") + (data $457 (i32.const 25804) "\1c") + (data $457.1 (i32.const 25816) "\02\00\00\00\n\00\00\001\002\00.\003\004") + (data $458 (i32.const 25836) "<") + (data $458.1 (i32.const 25848) "\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003") + (data $459 (i32.const 25900) "L") + (data $459.1 (i32.const 25912) "\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000") (data $460 (i32.const 25980) ",") - (data $460.1 (i32.const 25992) "\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008") + (data $460.1 (i32.const 25992) "\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001") (data $461 (i32.const 26028) ",") - (data $461.1 (i32.const 26040) "\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008") + (data $461.1 (i32.const 26040) "\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008") (data $462 (i32.const 26076) ",") - (data $462.1 (i32.const 26088) "\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004") + (data $462.1 (i32.const 26088) "\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008") (data $463 (i32.const 26124) ",") - (data $463.1 (i32.const 26136) "\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009") - (data $464 (i32.const 26172) "\1c") - (data $464.1 (i32.const 26184) "\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 ") - (data $465 (i32.const 26204) "\1c") - (data $465.1 (i32.const 26216) "\02\00\00\00\n\00\00\00W\00o\00r\00l\00d") - (data $466 (i32.const 26236) ",") - (data $466.1 (i32.const 26248) "\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d") - (data $467 (i32.const 26284) "\1c") - (data $467.1 (i32.const 26296) "\02\00\00\00\06\00\00\00b\00a\00r") - (data $468 (i32.const 26316) "\1c") - (data $468.1 (i32.const 26328) "\02\00\00\00\04\00\00\00\c0\00\c8") - (data $469 (i32.const 26348) "\1c") - (data $469.1 (i32.const 26360) "\02\00\00\00\04\00\00\00\d8S\cf\91") - (data $470 (i32.const 26380) "\1c") - (data $470.1 (i32.const 26392) "\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df") - (data $471 (i32.const 26416) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A") + (data $463.1 (i32.const 26136) "\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008") + (data $464 (i32.const 26172) ",") + (data $464.1 (i32.const 26184) "\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008") + (data $465 (i32.const 26220) ",") + (data $465.1 (i32.const 26232) "\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004") + (data $466 (i32.const 26268) ",") + (data $466.1 (i32.const 26280) "\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009") + (data $467 (i32.const 26316) ",") + (data $467.1 (i32.const 26328) "\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000") + (data $468 (i32.const 26364) ",") + (data $468.1 (i32.const 26376) "\02\00\00\00\18\00\00\004\002\009\004\009\006\007\003\000\000\00.\000") + (data $469 (i32.const 26412) "\1c") + (data $469.1 (i32.const 26424) "\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 ") + (data $470 (i32.const 26444) "\1c") + (data $470.1 (i32.const 26456) "\02\00\00\00\n\00\00\00W\00o\00r\00l\00d") + (data $471 (i32.const 26476) ",") + (data $471.1 (i32.const 26488) "\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d") + (data $472 (i32.const 26524) "\1c") + (data $472.1 (i32.const 26536) "\02\00\00\00\06\00\00\00b\00a\00r") + (data $473 (i32.const 26556) "\1c") + (data $473.1 (i32.const 26568) "\02\00\00\00\04\00\00\00\c0\00\c8") + (data $474 (i32.const 26588) "\1c") + (data $474.1 (i32.const 26600) "\02\00\00\00\04\00\00\00\d8S\cf\91") + (data $475 (i32.const 26620) "\1c") + (data $475.1 (i32.const 26632) "\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df") + (data $476 (i32.const 26656) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $~start) @@ -1139,7 +1151,7 @@ local.get $1 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$284 + block $__inlined_func$~lib/rt/itcms/Object#unlink$288 local.get $0 i32.load offset=4 i32.const -4 @@ -1151,7 +1163,7 @@ i32.load offset=8 i32.eqz local.get $0 - i32.const 59212 + i32.const 59452 i32.lt_u i32.and i32.eqz @@ -1163,7 +1175,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$284 + br $__inlined_func$~lib/rt/itcms/Object#unlink$288 end local.get $0 i32.load offset=8 @@ -1200,7 +1212,7 @@ i32.const 1 else local.get $1 - i32.const 26416 + i32.const 26656 i32.load i32.gt_u if @@ -1214,7 +1226,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 26420 + i32.const 26660 i32.add i32.load i32.const 32 @@ -1798,10 +1810,10 @@ if unreachable end - i32.const 59216 + i32.const 59456 i32.const 0 i32.store - i32.const 60784 + i32.const 61024 i32.const 0 i32.store loop $for-loop|0 @@ -1812,7 +1824,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 59216 + i32.const 59456 i32.add i32.const 0 i32.store offset=4 @@ -1830,7 +1842,7 @@ i32.add i32.const 2 i32.shl - i32.const 59216 + i32.const 59456 i32.add i32.const 0 i32.store offset=96 @@ -1848,14 +1860,14 @@ br $for-loop|0 end end - i32.const 59216 - i32.const 60788 + i32.const 59456 + i32.const 61028 memory.size i64.extend_i32_s i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - i32.const 59216 + i32.const 59456 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1940,7 +1952,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 59212 + i32.const 59452 i32.lt_u if local.get $0 @@ -2036,7 +2048,7 @@ unreachable end local.get $0 - i32.const 59212 + i32.const 59452 i32.lt_u if local.get $0 @@ -2059,7 +2071,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 59212 + i32.const 59452 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3937,96 +3949,132 @@ end end ) - (func $~lib/util/number/dtoa_core (param $0 f64) (result i32) - (local $1 i64) - (local $2 i32) - (local $3 i64) - (local $4 i32) - (local $5 i64) + (func $~lib/util/number/dtoa_core (param $0 f64) (param $1 i32) (result i32) + (local $2 i64) + (local $3 i32) + (local $4 i64) + (local $5 i32) (local $6 i64) (local $7 i64) - (local $8 i32) + (local $8 i64) (local $9 i32) - (local $10 i64) + (local $10 i32) (local $11 i64) (local $12 i64) (local $13 i64) (local $14 i64) + (local $15 i64) local.get $0 f64.const 0 f64.lt - local.tee $2 - if (result f64) + local.tee $3 + if i32.const 23344 i32.const 45 i32.store16 local.get $0 f64.neg + local.set $0 + end + local.get $1 + if (result i32) + local.get $0 + f32.demote_f64 + i32.reinterpret_f32 + local.tee $5 + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $9 + local.get $5 + i32.const 8388607 + i32.and + i64.extend_i32_u + local.get $9 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + i64.add + local.set $2 + local.get $9 + i32.const 1 + local.get $9 + select + i32.const 150 + i32.sub else local.get $0 + i64.reinterpret_f64 + local.tee $2 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $5 + local.get $2 + i64.const 4503599627370495 + i64.and + local.get $5 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + i64.add + local.set $2 + local.get $5 + i32.const 1 + local.get $5 + select + i32.const 1075 + i32.sub end - i64.reinterpret_f64 - local.tee $1 - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.tee $4 - i32.const 1 - local.get $4 - select - i32.const 1075 - i32.sub - local.tee $8 + local.tee $9 i32.const 1 i32.sub - local.get $1 - i64.const 4503599627370495 - i64.and - local.get $4 - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - i64.add - local.tee $1 + local.get $2 i64.const 1 i64.shl i64.const 1 i64.add - local.tee $3 + local.tee $4 i64.clz i32.wrap_i64 - local.tee $9 + local.tee $10 i32.sub - local.set $4 - local.get $3 - local.get $9 + local.set $5 + local.get $4 + local.get $10 i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_plus - local.get $1 - local.get $1 + local.get $2 + local.get $2 + i64.const 8388608 i64.const 4503599627370496 + local.get $1 + select i64.eq i32.const 1 i32.add - local.tee $9 + local.tee $1 i64.extend_i32_s i64.shl i64.const 1 i64.sub - local.get $8 local.get $9 + local.get $1 i32.sub - local.get $4 + local.get $5 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $4 + local.get $5 global.set $~lib/util/number/_exp i32.const 348 i32.const -61 @@ -4039,8 +4087,8 @@ f64.add local.tee $0 i32.trunc_sat_f64_s - local.tee $4 - local.get $4 + local.tee $1 + local.get $1 f64.convert_i32_s local.get $0 f64.ne @@ -4049,104 +4097,104 @@ i32.shr_s i32.const 1 i32.add - local.tee $4 + local.tee $1 i32.const 3 i32.shl - local.tee $8 + local.tee $5 i32.sub global.set $~lib/util/number/_K - local.get $8 + local.get $5 i32.const 23400 i32.add i64.load global.set $~lib/util/number/_frc_pow - local.get $4 + local.get $1 i32.const 1 i32.shl i32.const 24096 i32.add i32.load16_s global.set $~lib/util/number/_exp_pow - local.get $1 - local.get $1 + local.get $2 + local.get $2 i64.clz i64.shl - local.tee $1 + local.tee $2 i64.const 4294967295 i64.and - local.set $5 + local.set $6 global.get $~lib/util/number/_frc_pow - local.tee $10 + local.tee $11 i64.const 4294967295 i64.and - local.tee $11 - local.get $1 + local.tee $12 + local.get $2 i64.const 32 i64.shr_u - local.tee $1 + local.tee $2 i64.mul - local.get $5 - local.get $11 + local.get $6 + local.get $12 i64.mul i64.const 32 i64.shr_u i64.add - local.set $6 + local.set $7 global.get $~lib/util/number/_frc_plus - local.tee $3 + local.tee $4 i64.const 4294967295 i64.and - local.set $12 - local.get $3 + local.set $13 + local.get $4 i64.const 32 i64.shr_u - local.tee $3 - local.get $11 + local.tee $4 + local.get $12 i64.mul - local.get $11 local.get $12 + local.get $13 i64.mul i64.const 32 i64.shr_u i64.add - local.set $7 + local.set $8 global.get $~lib/util/number/_frc_minus - local.tee $13 + local.tee $14 i64.const 4294967295 i64.and - local.set $14 - local.get $13 + local.set $15 + local.get $14 i64.const 32 i64.shr_u - local.tee $13 - local.get $11 + local.tee $14 + local.get $12 i64.mul - local.get $11 - local.get $14 + local.get $12 + local.get $15 i64.mul i64.const 32 i64.shr_u i64.add - local.set $11 - local.get $2 + local.set $12 + local.get $3 i32.const 1 i32.shl i32.const 23344 i32.add - local.get $1 - local.get $10 + local.get $2 + local.get $11 i64.const 32 i64.shr_u - local.tee $1 + local.tee $2 i64.mul - local.get $6 + local.get $7 i64.const 32 i64.shr_u i64.add - local.get $1 - local.get $5 - i64.mul + local.get $2 local.get $6 + i64.mul + local.get $7 i64.const 4294967295 i64.and i64.add @@ -4155,17 +4203,17 @@ i64.const 32 i64.shr_u i64.add - local.get $1 - local.get $3 + local.get $2 + local.get $4 i64.mul - local.get $7 + local.get $8 i64.const 32 i64.shr_u i64.add - local.get $1 - local.get $12 + local.get $2 + local.get $13 i64.mul - local.get $7 + local.get $8 i64.const 4294967295 i64.and i64.add @@ -4176,24 +4224,24 @@ i64.add i64.const 1 i64.sub - local.tee $3 + local.tee $4 global.get $~lib/util/number/_exp_pow global.get $~lib/util/number/_exp i32.add i32.const -64 i32.sub - local.get $3 - local.get $1 - local.get $13 + local.get $4 + local.get $2 + local.get $14 i64.mul - local.get $11 + local.get $12 i64.const 32 i64.shr_u i64.add - local.get $1 - local.get $14 + local.get $2 + local.get $15 i64.mul - local.get $11 + local.get $12 i64.const 4294967295 i64.and i64.add @@ -4205,13 +4253,13 @@ i64.const 1 i64.add i64.sub - local.get $2 + local.get $3 call $~lib/util/number/genDigits - local.get $2 + local.get $3 i32.sub global.get $~lib/util/number/_K call $~lib/util/number/prettify - local.get $2 + local.get $3 i32.add ) (func $std/string/getString (result i32) @@ -4256,7 +4304,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4269,7 +4317,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4314,8 +4362,8 @@ end unreachable end - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4342,11 +4390,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4428,11 +4476,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4493,11 +4541,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4551,11 +4599,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4592,11 +4640,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4626,11 +4674,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4699,11 +4747,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4817,11 +4865,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4943,11 +4991,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5074,11 +5122,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5196,11 +5244,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5247,11 +5295,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5335,11 +5383,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5491,11 +5539,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5645,11 +5693,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5894,11 +5942,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6134,11 +6182,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6476,11 +6524,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6522,11 +6570,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7346,11 +7394,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7387,11 +7435,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7690,11 +7738,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7988,11 +8036,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8061,11 +8109,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8096,11 +8144,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8134,11 +8182,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8228,11 +8276,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8319,11 +8367,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8355,11 +8403,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8394,11 +8442,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8515,11 +8563,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8682,11 +8730,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9046,11 +9094,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9155,11 +9203,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9202,11 +9250,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9294,11 +9342,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9342,11 +9390,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9459,11 +9507,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9507,11 +9555,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9605,11 +9653,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9673,7 +9721,7 @@ block $folding-inner1 block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -9702,7 +9750,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -9998,8 +10046,8 @@ local.get $9 return end - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10031,11 +10079,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10082,11 +10130,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10153,7 +10201,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10254,7 +10302,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10263,7 +10311,7 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store - block $__inlined_func$~lib/string/String#charCodeAt$291 + block $__inlined_func$~lib/string/String#charCodeAt$295 local.get $0 i32.const 20 i32.sub @@ -10278,7 +10326,7 @@ global.set $~lib/memory/__stack_pointer i32.const -1 local.set $0 - br $__inlined_func$~lib/string/String#charCodeAt$291 + br $__inlined_func$~lib/string/String#charCodeAt$295 end local.get $0 i32.load16_u @@ -10308,7 +10356,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10317,7 +10365,7 @@ global.get $~lib/memory/__stack_pointer local.get $4 i32.store - block $__inlined_func$~lib/string/String#codePointAt$292 + block $__inlined_func$~lib/string/String#codePointAt$296 local.get $4 i32.const 20 i32.sub @@ -10334,7 +10382,7 @@ global.set $~lib/memory/__stack_pointer i32.const -1 local.set $0 - br $__inlined_func$~lib/string/String#codePointAt$292 + br $__inlined_func$~lib/string/String#codePointAt$296 end local.get $0 i32.const 2 @@ -10352,7 +10400,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/string/String#codePointAt$292 + br $__inlined_func$~lib/string/String#codePointAt$296 end local.get $4 i32.load16_u offset=4 @@ -10366,7 +10414,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/string/String#codePointAt$292 + br $__inlined_func$~lib/string/String#codePointAt$296 end global.get $~lib/memory/__stack_pointer i32.const 4 @@ -10395,7 +10443,7 @@ memory.size i32.const 16 i32.shl - i32.const 59212 + i32.const 59452 i32.sub i32.const 1 i32.shr_u @@ -10856,7 +10904,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10875,7 +10923,7 @@ global.get $~lib/memory/__stack_pointer i32.const 2176 i32.store - block $__inlined_func$~lib/string/String#startsWith$293 + block $__inlined_func$~lib/string/String#startsWith$297 local.get $4 i32.const 2172 i32.load @@ -10890,7 +10938,7 @@ global.set $~lib/memory/__stack_pointer i32.const 0 local.set $0 - br $__inlined_func$~lib/string/String#startsWith$293 + br $__inlined_func$~lib/string/String#startsWith$297 end global.get $~lib/memory/__stack_pointer local.get $0 @@ -10934,7 +10982,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10951,7 +10999,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10970,7 +11018,7 @@ global.get $~lib/memory/__stack_pointer i32.const 2208 i32.store - block $__inlined_func$~lib/string/String#endsWith$294 + block $__inlined_func$~lib/string/String#endsWith$298 i32.const 536870910 local.get $4 local.get $4 @@ -10993,7 +11041,7 @@ global.set $~lib/memory/__stack_pointer i32.const 0 local.set $0 - br $__inlined_func$~lib/string/String#endsWith$294 + br $__inlined_func$~lib/string/String#endsWith$298 end global.get $~lib/memory/__stack_pointer local.get $0 @@ -11039,7 +11087,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13209,7 +13257,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13300,7 +13348,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13351,7 +13399,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -23135,7 +23183,7 @@ unreachable end f64.const 0 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23156,7 +23204,7 @@ unreachable end f64.const -0 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23177,7 +23225,7 @@ unreachable end f64.const nan:0x8000000000000 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23198,7 +23246,7 @@ unreachable end f64.const inf - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23219,7 +23267,7 @@ unreachable end f64.const -inf - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23240,7 +23288,7 @@ unreachable end f64.const 2.220446049250313e-16 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23261,7 +23309,7 @@ unreachable end f64.const -2.220446049250313e-16 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23282,7 +23330,7 @@ unreachable end f64.const 1797693134862315708145274e284 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23303,7 +23351,7 @@ unreachable end f64.const -1797693134862315708145274e284 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23323,8 +23371,8 @@ call $~lib/builtins/abort unreachable end - f64.const 4185580496821356722454785e274 - call $~lib/util/number/dtoa + f32.const 1.1920928955078125e-07 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23344,17 +23392,17 @@ call $~lib/builtins/abort unreachable end - f64.const 2.2250738585072014e-308 - call $~lib/util/number/dtoa + f32.const -1.1920928955078125e-07 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24544 + i32.const 24528 i32.store offset=4 local.get $0 - i32.const 24544 + i32.const 24528 call $~lib/string/String.__eq i32.eqz if @@ -23365,113 +23413,113 @@ call $~lib/builtins/abort unreachable end - f64.const 4.940656e-318 - call $~lib/util/number/dtoa + f32.const 3402823466385288598117041e14 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24624 + i32.const 24576 i32.store offset=4 local.get $0 - i32.const 24624 + i32.const 24576 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 749 + i32.const 747 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 9060801153433600 - call $~lib/util/number/dtoa + f32.const -3402823466385288598117041e14 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24672 + i32.const 24624 i32.store offset=4 local.get $0 - i32.const 24672 + i32.const 24624 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 750 + i32.const 748 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 4708356024711512064 - call $~lib/util/number/dtoa + f64.const 4185580496821356722454785e274 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24736 + i32.const 24672 i32.store offset=4 local.get $0 - i32.const 24736 + i32.const 24672 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 751 + i32.const 749 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 9409340012568248320 - call $~lib/util/number/dtoa + f64.const 2.2250738585072014e-308 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24800 + i32.const 24736 i32.store offset=4 local.get $0 - i32.const 24800 + i32.const 24736 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 752 + i32.const 750 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 5e-324 - call $~lib/util/number/dtoa + f64.const 4.940656e-318 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 8320 + i32.const 24816 i32.store offset=4 local.get $0 - i32.const 8320 + i32.const 24816 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 753 + i32.const 751 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1 - call $~lib/util/number/dtoa + f64.const 9060801153433600 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23486,202 +23534,286 @@ if i32.const 0 i32.const 1120 - i32.const 759 + i32.const 752 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.1 - call $~lib/util/number/dtoa + f64.const 4708356024711512064 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 5280 + i32.const 24928 i32.store offset=4 local.get $0 - i32.const 5280 + i32.const 24928 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 760 + i32.const 753 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -1 - call $~lib/util/number/dtoa + f64.const 9409340012568248320 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24896 + i32.const 24992 i32.store offset=4 local.get $0 - i32.const 24896 + i32.const 24992 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 761 + i32.const 754 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const -0.1 - call $~lib/util/number/dtoa + f64.const 5e-324 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24928 + i32.const 8320 i32.store offset=4 local.get $0 - i32.const 24928 + i32.const 8320 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 762 + i32.const 755 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const 1 + call $~lib/util/number/dtoa + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 25056 + i32.store offset=4 + local.get $0 + i32.const 25056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 757 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const 0.1 + call $~lib/util/number/dtoa + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 5280 + i32.store offset=4 + local.get $0 + i32.const 5280 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 758 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const -1 + call $~lib/util/number/dtoa + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 25088 + i32.store offset=4 + local.get $0 + i32.const 25088 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 759 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const -0.1 + call $~lib/util/number/dtoa + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 25120 + i32.store offset=4 + local.get $0 + i32.const 25120 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 760 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1e6 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24960 + i32.const 25152 i32.store offset=4 local.get $0 - i32.const 24960 + i32.const 25152 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 764 + i32.const 762 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1e-06 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25008 + i32.const 25200 i32.store offset=4 local.get $0 - i32.const 25008 + i32.const 25200 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 765 + i32.const 763 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -1e6 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25056 + i32.const 25248 i32.store offset=4 local.get $0 - i32.const 25056 + i32.const 25248 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 766 + i32.const 764 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -1e-06 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25104 + i32.const 25296 i32.store offset=4 local.get $0 - i32.const 25104 + i32.const 25296 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 767 + i32.const 765 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1e7 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25152 + i32.const 25344 i32.store offset=4 local.get $0 - i32.const 25152 + i32.const 25344 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 768 + i32.const 766 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1e-07 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25200 + i32.const 25392 i32.store offset=4 local.get $0 - i32.const 25200 + i32.const 25392 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 769 + i32.const 767 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1.e+308 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23696,34 +23828,34 @@ if i32.const 0 i32.const 1120 - i32.const 771 + i32.const 769 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -1.e+308 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25232 + i32.const 25424 i32.store offset=4 local.get $0 - i32.const 25232 + i32.const 25424 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 772 + i32.const 770 i32.const 1 call $~lib/builtins/abort unreachable end f64.const inf - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23738,13 +23870,13 @@ if i32.const 0 i32.const 1120 - i32.const 773 + i32.const 771 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -inf - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23759,97 +23891,97 @@ if i32.const 0 i32.const 1120 - i32.const 774 + i32.const 772 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1e-308 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25280 + i32.const 25472 i32.store offset=4 local.get $0 - i32.const 25280 + i32.const 25472 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 775 + i32.const 773 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -1e-308 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25312 + i32.const 25504 i32.store offset=4 local.get $0 - i32.const 25312 + i32.const 25504 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 776 + i32.const 774 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1e-323 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25360 + i32.const 25552 i32.store offset=4 local.get $0 - i32.const 25360 + i32.const 25552 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 777 + i32.const 775 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -1e-323 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25392 + i32.const 25584 i32.store offset=4 local.get $0 - i32.const 25392 + i32.const 25584 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 778 + i32.const 776 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 0 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -23864,295 +23996,344 @@ if i32.const 0 i32.const 1120 - i32.const 779 + i32.const 777 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 4294967272 - call $~lib/util/number/dtoa + f64.const 1.2312145673456234e-08 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25440 + i32.const 25632 i32.store offset=4 local.get $0 - i32.const 25440 + i32.const 25632 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 781 + i32.const 779 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.2312145673456234e-08 - call $~lib/util/number/dtoa + f64.const 555555555.5555556 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25488 + i32.const 25696 i32.store offset=4 local.get $0 - i32.const 25488 + i32.const 25696 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 782 + i32.const 780 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 555555555.5555556 - call $~lib/util/number/dtoa + f64.const 0.9999999999999999 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25552 + i32.const 25760 i32.store offset=4 local.get $0 - i32.const 25552 + i32.const 25760 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 784 + i32.const 781 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.9999999999999999 - call $~lib/util/number/dtoa + f64.const 1 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25616 + i32.const 25056 i32.store offset=4 local.get $0 - i32.const 25616 + i32.const 25056 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 785 + i32.const 782 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1 - call $~lib/util/number/dtoa + f64.const 12.34 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 24864 + i32.const 25824 i32.store offset=4 local.get $0 - i32.const 24864 + i32.const 25824 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 786 + i32.const 783 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 12.34 - call $~lib/util/number/dtoa + f64.const 0.3333333333333333 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25680 + i32.const 25856 i32.store offset=4 local.get $0 - i32.const 25680 + i32.const 25856 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 787 + i32.const 784 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.3333333333333333 - call $~lib/util/number/dtoa + f64.const 1234e17 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25712 + i32.const 25920 i32.store offset=4 local.get $0 - i32.const 25712 + i32.const 25920 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 789 + i32.const 785 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1234e17 - call $~lib/util/number/dtoa + f64.const 1234e18 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25776 + i32.const 26000 i32.store offset=4 local.get $0 - i32.const 25776 + i32.const 26000 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 790 + i32.const 786 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1234e18 - call $~lib/util/number/dtoa + f64.const 2.71828 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25856 + i32.const 26048 i32.store offset=4 local.get $0 - i32.const 25856 + i32.const 26048 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 791 + i32.const 787 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 2.71828 - call $~lib/util/number/dtoa + f64.const 0.0271828 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25904 + i32.const 26096 i32.store offset=4 local.get $0 - i32.const 25904 + i32.const 26096 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 792 + i32.const 788 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 0.0271828 - call $~lib/util/number/dtoa + f64.const 271.828 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25952 + i32.const 26144 i32.store offset=4 local.get $0 - i32.const 25952 + i32.const 26144 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 793 + i32.const 789 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 271.828 - call $~lib/util/number/dtoa + f64.const 1.1e+128 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26000 + i32.const 26192 i32.store offset=4 local.get $0 - i32.const 26000 + i32.const 26192 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 794 + i32.const 790 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.1e+128 - call $~lib/util/number/dtoa + f64.const 1.1e-64 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26048 + i32.const 26240 i32.store offset=4 local.get $0 - i32.const 26048 + i32.const 26240 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 795 + i32.const 791 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 1.1e-64 - call $~lib/util/number/dtoa + f64.const 0.000035689 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26096 + i32.const 26288 i32.store offset=4 local.get $0 - i32.const 26096 + i32.const 26288 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 792 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 26684 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + f64.const 4294967272 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $4 + i32.store + local.get $4 + i32.const 23344 + local.get $0 + memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 26336 + i32.store offset=4 + local.get $4 + i32.const 26336 call $~lib/string/String.__eq i32.eqz if @@ -24163,17 +24344,16 @@ call $~lib/builtins/abort unreachable end - f64.const 0.000035689 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26144 + i32.const 26384 i32.store offset=4 local.get $0 - i32.const 26144 + i32.const 26384 call $~lib/string/String.__eq i32.eqz if @@ -24184,30 +24364,50 @@ call $~lib/builtins/abort unreachable end + call $~lib/util/number/dtoa + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 26192 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 26384 + i32.store offset=4 + local.get $0 + i32.const 26384 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 798 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 26432 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 26224 + i32.const 26464 i32.store offset=12 - i32.const 26192 - i32.const 26224 + i32.const 26432 + i32.const 26464 call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26256 + i32.const 26496 i32.store offset=4 local.get $0 - i32.const 26256 + i32.const 26496 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 802 + i32.const 825 i32.const 1 call $~lib/builtins/abort unreachable @@ -24216,37 +24416,37 @@ i32.const 1712 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26544 i32.store offset=12 i32.const 1712 - i32.const 26304 + i32.const 26544 call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26544 i32.store offset=4 local.get $0 - i32.const 26304 + i32.const 26544 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 803 + i32.const 826 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26544 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1712 i32.store offset=12 - i32.const 26304 + i32.const 26544 i32.const 1712 call $~lib/string/String#concat local.set $0 @@ -24254,16 +24454,16 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26544 i32.store offset=4 local.get $0 - i32.const 26304 + i32.const 26544 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 804 + i32.const 827 i32.const 1 call $~lib/builtins/abort unreachable @@ -24291,86 +24491,86 @@ if i32.const 0 i32.const 1120 - i32.const 805 + i32.const 828 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26576 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26576 i32.store offset=4 - i32.const 26336 - i32.const 26336 + i32.const 26576 + i32.const 26576 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 816 + i32.const 836 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26576 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26576 i32.store offset=4 - i32.const 26336 - i32.const 26336 + i32.const 26576 + i32.const 26576 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 817 + i32.const 837 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26368 + i32.const 26608 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26368 + i32.const 26608 i32.store offset=4 - i32.const 26368 - i32.const 26368 + i32.const 26608 + i32.const 26608 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 818 + i32.const 838 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26400 + i32.const 26640 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26400 + i32.const 26640 i32.store offset=4 - i32.const 26400 - i32.const 26400 + i32.const 26640 + i32.const 26640 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 819 + i32.const 839 i32.const 1 call $~lib/builtins/abort unreachable end i32.const 0 global.set $std/string/str - i32.const 59212 + i32.const 59452 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -24411,8 +24611,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24426,11 +24626,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24474,11 +24674,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24539,11 +24739,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24617,11 +24817,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24809,7 +25009,7 @@ end else global.get $~lib/memory/__stack_pointer - block $__inlined_func$~lib/util/number/ulog_base$170 (result i32) + block $__inlined_func$~lib/util/number/ulog_base$171 (result i32) local.get $2 i64.extend_i32_u local.set $5 @@ -24830,7 +25030,7 @@ i32.div_u i32.const 1 i32.add - br $__inlined_func$~lib/util/number/ulog_base$170 + br $__inlined_func$~lib/util/number/ulog_base$171 end local.get $1 i64.extend_i32_s @@ -24920,11 +25120,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25090,7 +25290,7 @@ end else global.get $~lib/memory/__stack_pointer - block $__inlined_func$~lib/util/number/ulog_base$174 (result i32) + block $__inlined_func$~lib/util/number/ulog_base$175 (result i32) local.get $0 i64.extend_i32_u local.set $4 @@ -25111,7 +25311,7 @@ i32.div_u i32.const 1 i32.add - br $__inlined_func$~lib/util/number/ulog_base$174 + br $__inlined_func$~lib/util/number/ulog_base$175 end local.get $1 i64.extend_i32_s @@ -25191,11 +25391,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25429,7 +25629,7 @@ end else global.get $~lib/memory/__stack_pointer - block $__inlined_func$~lib/util/number/ulog_base$179 (result i32) + block $__inlined_func$~lib/util/number/ulog_base$180 (result i32) local.get $0 local.set $2 local.get $1 @@ -25449,7 +25649,7 @@ i32.div_u i32.const 1 i32.add - br $__inlined_func$~lib/util/number/ulog_base$179 + br $__inlined_func$~lib/util/number/ulog_base$180 end local.get $1 i64.extend_i32_s @@ -25529,11 +25729,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25794,7 +25994,7 @@ end else global.get $~lib/memory/__stack_pointer - block $__inlined_func$~lib/util/number/ulog_base$184 (result i32) + block $__inlined_func$~lib/util/number/ulog_base$185 (result i32) local.get $0 local.set $2 local.get $1 @@ -25814,7 +26014,7 @@ i32.div_u i32.const 1 i32.add - br $__inlined_func$~lib/util/number/ulog_base$184 + br $__inlined_func$~lib/util/number/ulog_base$185 end local.get $1 i64.extend_i32_s @@ -25892,7 +26092,7 @@ global.set $~lib/memory/__stack_pointer local.get $3 ) - (func $~lib/util/number/dtoa (param $0 f64) (result i32) + (func $~lib/util/number/dtoa (param $0 f64) (result i32) (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer @@ -25900,11 +26100,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26684 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59472 + i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25913,65 +26113,173 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $0 - f64.const 0 - f64.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 23280 - return - end - local.get $0 - local.get $0 - f64.sub - f64.const 0 - f64.ne - if + i32.const 23280 + local.set $1 + block $~lib/util/number/dtoa_impl|inlined.0 + local.get $0 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.0 local.get $0 local.get $0 + f64.sub + f64.const 0 f64.ne if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer i32.const 7696 - return + local.set $1 + local.get $0 + local.get $0 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.0 + i32.const 8960 + i32.const 23312 + local.get $0 + f64.const 0 + f64.lt + select + local.set $1 + br $~lib/util/number/dtoa_impl|inlined.0 end + local.get $0 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $2 global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 8960 - i32.const 23312 + local.get $2 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + local.get $1 + i32.const 23344 + local.get $2 + memory.copy + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/util/number/dtoa (param $0 f32) (result i32) + (local $1 f64) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 26684 + i32.lt_s + if + i32.const 59472 + i32.const 59520 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 23280 + local.set $2 + block $~lib/util/number/dtoa_impl|inlined.1 local.get $0 + f64.promote_f32 + local.tee $1 f64.const 0 - f64.lt - select - return + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.1 + local.get $1 + local.get $1 + f64.sub + f64.const 0 + f64.ne + if + i32.const 7696 + local.set $2 + local.get $1 + local.get $1 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.1 + i32.const 8960 + i32.const 23312 + local.get $1 + f64.const 0 + f64.lt + select + local.set $2 + br $~lib/util/number/dtoa_impl|inlined.1 + end + local.get $1 + i32.const 1 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $2 + i32.store + local.get $2 + i32.const 23344 + local.get $3 + memory.copy end - local.get $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $~lib/util/number/dtoa (result i32) + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 26684 + i32.lt_s + if + i32.const 59472 + i32.const 59520 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + f64.const 4294967296 + i32.const 1 call $~lib/util/number/dtoa_core i32.const 1 i32.shl - local.set $1 + local.set $0 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $0 i32.const 2 call $~lib/rt/itcms/__new - local.tee $2 + local.tee $1 i32.store - local.get $2 - i32.const 23344 local.get $1 + i32.const 23344 + local.get $0 memory.copy global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $2 + local.get $1 ) ) diff --git a/tests/compiler/std/string.ts b/tests/compiler/std/string.ts index 7b9281c8e4..dd93d26805 100644 --- a/tests/compiler/std/string.ts +++ b/tests/compiler/std/string.ts @@ -742,19 +742,17 @@ assert(dtoa(+f64.EPSILON) == "2.220446049250313e-16"); assert(dtoa(-f64.EPSILON) == "-2.220446049250313e-16"); assert(dtoa(+f64.MAX_VALUE) == "1.7976931348623157e+308"); assert(dtoa(-f64.MAX_VALUE) == "-1.7976931348623157e+308"); +assert(dtoa(+f32.EPSILON) == "1.1920929e-7"); +assert(dtoa(-f32.EPSILON) == "-1.1920929e-7"); +assert(dtoa(+f32.MAX_VALUE) == "3.4028235e+38"); +assert(dtoa(-f32.MAX_VALUE) == "-3.4028235e+38"); assert(dtoa(4.185580496821357e+298) == "4.185580496821357e+298"); assert(dtoa(2.2250738585072014e-308) == "2.2250738585072014e-308"); -// assert(dtoa(2.98023223876953125e-8) == "2.9802322387695312e-8"); // FIXME -// assert(dtoa(-2.109808898695963e+16) == "-21098088986959630.0"); // FIXME assert(dtoa(4.940656E-318) == "4.940656e-318"); assert(dtoa(9.0608011534336e+15) == "9060801153433600.0"); assert(dtoa(4.708356024711512e+18) == "4708356024711512000.0"); assert(dtoa(9.409340012568248e+18) == "9409340012568248000.0"); assert(dtoa(5e-324) == "5e-324"); -// Known imprecise issue for Grisu alghoritm. Need workaround -// Expeced: 1.2345e+21 -// Actual: 1.2344999999999999e+21 -// assert(dtoa(1.2345e+21) == "1.2345e+21"); assert(dtoa(1.0) == "1.0"); assert(dtoa(0.1) == "0.1"); @@ -778,14 +776,11 @@ assert(dtoa(1e-323) == "1e-323"); assert(dtoa(-1e-323) == "-1e-323"); assert(dtoa(1e-324) == "0.0"); -assert(dtoa(4294967272) == "4294967272.0"); assert(dtoa(1.23121456734562345678e-8) == "1.2312145673456234e-8"); -// assert(dtoa(-0.0000010471975511965976) == "-0.0000010471975511965976"); // FIXME assert(dtoa(555555555.55555555) == "555555555.5555556"); assert(dtoa(0.9999999999999999) == "0.9999999999999999"); assert(dtoa(0.99999999999999995) == "1.0"); assert(dtoa(1234e-2) == "12.34"); -// assert(dtoa(0.1 + 0.2) == "0.30000000000000004"); // FIXME assert(dtoa(1.0 / 3.0) == "0.3333333333333333"); assert(dtoa(1.234e+20) == "123400000000000000000.0"); assert(dtoa(1.234e+21) == "1.234e+21"); @@ -796,6 +791,34 @@ assert(dtoa(1.1e+128) == "1.1e+128"); assert(dtoa(1.1e-64) == "1.1e-64"); assert(dtoa(0.000035689) == "0.000035689"); +// The following demonstrates behavior that may seem surprising, but is consistent with the +// IEEE 754 standard and behaves the same way in other languages that have 32-bit floating point numbers. +assert(dtoa(4294967272) == "4294967272.0"); // u64 -> f64, no loss of precision +assert(dtoa(4294967272) == "4294967300.0"); // u32 -> f32, loss of precision is expected +assert(dtoa(4294967272) == "4294967300.0"); // default integer literal is 32-bit, so loss of precision is expected + +// FIXME: The following are imprecise rounding issues for Grisu algorithm. Need workaround. + +// Expected: 1.2345e+21 +// Actual: 1.2344999999999999e+21 +// assert(dtoa(1.2345e+21) == "1.2345e+21"); + +// Expected: 2.98023223876953125e-8 +// Actual: 2.9802322387695315e-8 +// assert(dtoa(2.98023223876953125e-8) == "2.9802322387695312e-8"); + +// Expected: -2.109808898695963e+16 +// Actual: -21098088986959633.0 +// assert(dtoa(-2.109808898695963e+16) == "-21098088986959630.0"); + +// Expected: -0.0000010471975511965976 +// Actual: -0.0000010471975511965977 +// assert(dtoa(-0.0000010471975511965976) == "-0.0000010471975511965976"); + +// Expected: 0.30000000000000004 +// Actual: 0.30000000000000007 +// assert(dtoa(0.1 + 0.2) == "0.30000000000000004"); + // concat @@ -804,9 +827,6 @@ assert("".concat("bar") == "bar"); assert("bar".concat("") == "bar"); assert("".concat("") == ""); -// assert(dtoa(f32.MAX_VALUE) == "3.4028234663852886e+38"); // FIXME -// assert(dtoa(f32.EPSILON) == "1.1920928955078125e-7"); // FIXME - export function getString(): string { return str; } From c50ecc11103885bbc518d6c7b4e1cb34b5ff61c3 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 10:34:58 -0800 Subject: [PATCH 03/10] re-create other text fixtures --- tests/compiler/resolve-binary.debug.wat | 464 ++++---- .../compiler/resolve-elementaccess.debug.wat | 468 ++++---- .../resolve-elementaccess.release.wat | 119 +- tests/compiler/resolve-ternary.debug.wat | 464 ++++---- tests/compiler/std/array.debug.wat | 629 +++++----- tests/compiler/std/array.release.wat | 339 +++--- tests/compiler/std/math.release.wat | 36 +- tests/compiler/std/typedarray.debug.wat | 854 ++++++++----- tests/compiler/std/typedarray.release.wat | 1052 ++++++++++------- tests/compiler/templateliteral.debug.wat | 464 ++++---- tests/compiler/templateliteral.release.wat | 40 +- 11 files changed, 2761 insertions(+), 2168 deletions(-) diff --git a/tests/compiler/resolve-binary.debug.wat b/tests/compiler/resolve-binary.debug.wat index 2bf97efe4c..c1572dbfa2 100644 --- a/tests/compiler/resolve-binary.debug.wat +++ b/tests/compiler/resolve-binary.debug.wat @@ -15,7 +15,7 @@ (type $13 (func (param f64 f64) (result f64))) (type $14 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) (type $15 (func (param i32 i32 i32) (result i32))) - (type $16 (func (param i32 f64) (result i32))) + (type $16 (func (param i32 f64 i32) (result i32))) (type $17 (func (param f64 i32) (result i32))) (type $18 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) @@ -4727,26 +4727,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -4762,28 +4766,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -4802,77 +4806,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -4883,12 +4933,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -4940,14 +4990,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -5032,63 +5082,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -5097,11 +5147,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -5110,63 +5160,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -5177,13 +5227,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -5206,7 +5256,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa64 return ) (func $~lib/math/ipow32 (param $x i32) (param $e i32) (result i32) @@ -7651,10 +7701,12 @@ local.get $14 return ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -7663,76 +7715,66 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 8560 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - local.get $value - f64.ne + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 8592 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 8560 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 8624 - i32.const 8672 - local.get $value + local.get $value|1 + local.get $value|1 + f64.sub f64.const 0 - f64.lt - select - local.set $3 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 8592 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 8624 + i32.const 8672 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 8704 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 8704 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 8704 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 8704 - local.get $size - memory.copy - local.get $result - local.set $3 + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) (func $~lib/object/Object#constructor (param $this i32) (result i32) diff --git a/tests/compiler/resolve-elementaccess.debug.wat b/tests/compiler/resolve-elementaccess.debug.wat index a8ce8b0059..d506be6355 100644 --- a/tests/compiler/resolve-elementaccess.debug.wat +++ b/tests/compiler/resolve-elementaccess.debug.wat @@ -10,7 +10,7 @@ (type $8 (func (param i32 i32 i64) (result i32))) (type $9 (func (result i32))) (type $10 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) - (type $11 (func (param i32 f64) (result i32))) + (type $11 (func (param i32 f64 i32) (result i32))) (type $12 (func (param f32 i32) (result i32))) (type $13 (func (param i32 i32 i32 i32 i32) (result i32))) (type $14 (func (param i32 i64 i32))) @@ -18,7 +18,7 @@ (type $16 (func (param i32 i64 i32 i32))) (type $17 (func (param i32 i32 f32))) (type $18 (func (param i32 i32) (result f32))) - (type $19 (func (param f64) (result i32))) + (type $19 (func (param f32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) @@ -3415,26 +3415,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -3450,28 +3454,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -3490,77 +3494,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -3571,12 +3621,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -3628,14 +3678,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -3720,63 +3770,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -3785,11 +3835,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -3798,63 +3848,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -3865,13 +3915,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -3894,8 +3944,7 @@ ) (func $~lib/number/F32#toString (param $this f32) (param $radix i32) (result i32) local.get $this - f64.promote_f32 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa32 return ) (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) @@ -5258,10 +5307,12 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa32 (param $value f32) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -5270,76 +5321,67 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 608 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - f64.ne + f64.promote_f32 + local.set $value|1 + i32.const 1 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 640 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 608 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 672 - i32.const 720 - local.get $value + local.get $value|1 + local.get $value|1 + f64.sub f64.const 0 - f64.lt - select - local.set $3 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 640 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 672 + i32.const 720 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 752 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 752 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 752 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 752 - local.get $size - memory.copy - local.get $result - local.set $3 + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) (func $~lib/util/number/utoa32 (param $value i32) (param $radix i32) (result i32) diff --git a/tests/compiler/resolve-elementaccess.release.wat b/tests/compiler/resolve-elementaccess.release.wat index 4d1e0cba3a..a161cce7e3 100644 --- a/tests/compiler/resolve-elementaccess.release.wat +++ b/tests/compiler/resolve-elementaccess.release.wat @@ -2517,10 +2517,10 @@ (local $1 i64) (local $2 i32) (local $3 i64) - (local $4 i32) + (local $4 i64) (local $5 i64) (local $6 i64) - (local $7 i64) + (local $7 i32) (local $8 i32) (local $9 i32) (local $10 i64) @@ -2541,30 +2541,31 @@ else local.get $0 end - i64.reinterpret_f64 - local.tee $1 - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.tee $4 + f32.demote_f64 + i32.reinterpret_f32 + local.tee $7 + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.tee $8 i32.const 1 - local.get $4 + local.get $8 select - i32.const 1075 + i32.const 150 i32.sub - local.tee $8 + local.tee $9 i32.const 1 i32.sub - local.get $1 - i64.const 4503599627370495 - i64.and - local.get $4 + local.get $7 + i32.const 8388607 + i32.and + i64.extend_i32_u + local.get $8 i32.const 0 i32.ne i64.extend_i32_u - i64.const 52 + i64.const 23 i64.shl i64.add local.tee $1 @@ -2575,34 +2576,34 @@ local.tee $3 i64.clz i32.wrap_i64 - local.tee $9 + local.tee $7 i32.sub - local.set $4 + local.set $8 local.get $3 - local.get $9 + local.get $7 i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_plus local.get $1 local.get $1 - i64.const 4503599627370496 + i64.const 8388608 i64.eq i32.const 1 i32.add - local.tee $9 + local.tee $7 i64.extend_i32_s i64.shl i64.const 1 i64.sub - local.get $8 local.get $9 + local.get $7 i32.sub - local.get $4 + local.get $8 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $4 + local.get $8 global.set $~lib/util/number/_exp i32.const 348 i32.const -61 @@ -2615,8 +2616,8 @@ f64.add local.tee $0 i32.trunc_sat_f64_s - local.tee $4 - local.get $4 + local.tee $7 + local.get $7 f64.convert_i32_s local.get $0 f64.ne @@ -2625,7 +2626,7 @@ i32.shr_s i32.const 1 i32.add - local.tee $4 + local.tee $7 i32.const 3 i32.shl local.tee $8 @@ -2636,7 +2637,7 @@ i32.add i64.load global.set $~lib/util/number/_frc_pow - local.get $4 + local.get $7 i32.const 1 i32.shl i32.const 2528 @@ -2650,7 +2651,7 @@ local.tee $1 i64.const 4294967295 i64.and - local.set $5 + local.set $4 global.get $~lib/util/number/_frc_pow local.tee $10 i64.const 4294967295 @@ -2661,13 +2662,13 @@ i64.shr_u local.tee $1 i64.mul - local.get $5 + local.get $4 local.get $11 i64.mul i64.const 32 i64.shr_u i64.add - local.set $6 + local.set $5 global.get $~lib/util/number/_frc_plus local.tee $3 i64.const 4294967295 @@ -2685,7 +2686,7 @@ i64.const 32 i64.shr_u i64.add - local.set $7 + local.set $6 global.get $~lib/util/number/_frc_minus local.tee $13 i64.const 4294967295 @@ -2715,14 +2716,14 @@ i64.shr_u local.tee $1 i64.mul - local.get $6 + local.get $5 i64.const 32 i64.shr_u i64.add local.get $1 - local.get $5 + local.get $4 i64.mul - local.get $6 + local.get $5 i64.const 4294967295 i64.and i64.add @@ -2734,14 +2735,14 @@ local.get $1 local.get $3 i64.mul - local.get $7 + local.get $6 i64.const 32 i64.shr_u i64.add local.get $1 local.get $12 i64.mul - local.get $7 + local.get $6 i64.const 4294967295 i64.and i64.add @@ -2812,43 +2813,27 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - block $__inlined_func$~lib/util/number/dtoa$77 + i32.const 1632 + local.set $2 + block $~lib/util/number/dtoa_impl|inlined.0 local.get $0 f64.promote_f32 local.tee $1 f64.const 0 f64.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1632 - local.set $2 - br $__inlined_func$~lib/util/number/dtoa$77 - end + br_if $~lib/util/number/dtoa_impl|inlined.0 local.get $1 local.get $1 f64.sub f64.const 0 f64.ne if + i32.const 1664 + local.set $2 local.get $1 local.get $1 f64.ne - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1664 - local.set $2 - br $__inlined_func$~lib/util/number/dtoa$77 - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer + br_if $~lib/util/number/dtoa_impl|inlined.0 i32.const 1696 i32.const 1744 local.get $1 @@ -2856,7 +2841,7 @@ f64.lt select local.set $2 - br $__inlined_func$~lib/util/number/dtoa$77 + br $~lib/util/number/dtoa_impl|inlined.0 end local.get $1 call $~lib/util/number/dtoa_core @@ -2873,11 +2858,11 @@ i32.const 1776 local.get $3 memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer local.get $2 ) (func $~lib/number/U8#toString (param $0 i32) (result i32) diff --git a/tests/compiler/resolve-ternary.debug.wat b/tests/compiler/resolve-ternary.debug.wat index 44786d5dcb..022a677121 100644 --- a/tests/compiler/resolve-ternary.debug.wat +++ b/tests/compiler/resolve-ternary.debug.wat @@ -14,7 +14,7 @@ (type $12 (func (param i32 i32 i32 i32 i32) (result i32))) (type $13 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) (type $14 (func (param i32 i32 i32) (result i32))) - (type $15 (func (param i32 f64) (result i32))) + (type $15 (func (param i32 f64 i32) (result i32))) (type $16 (func (param f64 i32) (result i32))) (type $17 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) @@ -3654,26 +3654,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -3689,28 +3693,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -3729,77 +3733,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -3810,12 +3860,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -3867,14 +3917,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -3959,63 +4009,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -4024,11 +4074,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -4037,63 +4087,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -4104,13 +4154,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -4133,7 +4183,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa64 return ) (func $start:resolve-ternary~anonymous|0 (param $x i32) (result i32) @@ -4706,10 +4756,12 @@ local.get $14 return ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -4718,76 +4770,66 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 2304 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - local.get $value - f64.ne + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 2336 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 2304 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 2368 - i32.const 2416 - local.get $value + local.get $value|1 + local.get $value|1 + f64.sub f64.const 0 - f64.lt - select - local.set $3 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 2336 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 2368 + i32.const 2416 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 2448 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 2448 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 2448 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 2448 - local.get $size - memory.copy - local.get $result - local.set $3 + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) ) diff --git a/tests/compiler/std/array.debug.wat b/tests/compiler/std/array.debug.wat index bff2f09e20..6b082a6f6b 100644 --- a/tests/compiler/std/array.debug.wat +++ b/tests/compiler/std/array.debug.wat @@ -13,22 +13,22 @@ (type $11 (func)) (type $12 (func (param i64 i32) (result i32))) (type $13 (func (result f64))) - (type $14 (func (param i32 i32 i32 i32))) - (type $15 (func (param i64) (result i64))) - (type $16 (func (param i32 i64 i32))) - (type $17 (func (param i32 i32 i32) (result f32))) - (type $18 (func (param i32 i32 i32 i32 i32) (result i32))) - (type $19 (func (param i32 f64) (result i32))) + (type $14 (func (param i32 f64 i32) (result i32))) + (type $15 (func (param i32 i32 i32 i32))) + (type $16 (func (param i64) (result i64))) + (type $17 (func (param i32 i64 i32))) + (type $18 (func (param i32 i32 i32) (result f32))) + (type $19 (func (param i32 i32 i32 i32 i32) (result i32))) (type $20 (func (param i32 i64) (result i32))) (type $21 (func (param i32 f32 i32 i32) (result i32))) (type $22 (func (param i32 f32 i32) (result i32))) - (type $23 (func (param i32 f64 i32) (result i32))) - (type $24 (func (param i32 i32 i64) (result i32))) - (type $25 (func (result i32))) - (type $26 (func (param i32 i32 f32 i32 i32))) - (type $27 (func (param i32 i64 i32 i32))) - (type $28 (func (param i64))) - (type $29 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $23 (func (param i32 i32 i64) (result i32))) + (type $24 (func (result i32))) + (type $25 (func (param i32 i32 f32 i32 i32))) + (type $26 (func (param i32 i64 i32 i32))) + (type $27 (func (param i64))) + (type $28 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $29 (func (param i32 f64) (result i32))) (type $30 (func (param i64) (result i32))) (type $31 (func (param i32 i32) (result f32))) (type $32 (func (param i32 i32) (result f64))) @@ -7663,26 +7663,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -7698,28 +7702,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -7738,77 +7742,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -7819,12 +7869,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -7876,14 +7926,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -7968,63 +8018,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -8033,11 +8083,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -8046,63 +8096,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -8113,13 +8163,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -8140,77 +8190,94 @@ i32.add return ) - (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) + (local $buffer|2 i32) + (local $value|3 f64) + (local $isSinglePrecision i32) (local $sign i32) - local.get $value - f64.const 0 - f64.eq - if - local.get $buffer - i32.const 48 - i32.store16 - local.get $buffer - i32.const 46 - i32.store16 offset=2 + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $buffer - i32.const 48 - i32.store16 offset=4 - i32.const 3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value + local.set $buffer|2 local.get $value - f64.ne + local.set $value|3 + i32.const 0 + local.set $isSinglePrecision + local.get $value|3 + f64.const 0 + f64.eq if - local.get $buffer - i32.const 78 + local.get $buffer|2 + i32.const 48 i32.store16 - local.get $buffer - i32.const 97 + local.get $buffer|2 + i32.const 46 i32.store16 offset=2 - local.get $buffer - i32.const 78 + local.get $buffer|2 + i32.const 48 i32.store16 offset=4 i32.const 3 - return - else - local.get $value - f64.const 0 - f64.lt - local.set $sign - local.get $sign + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + local.get $value|3 + local.get $value|3 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|3 + local.get $value|3 + f64.ne if - local.get $buffer - i32.const 45 + local.get $buffer|2 + i32.const 78 i32.store16 - local.get $buffer - i32.const 2 + local.get $buffer|2 + i32.const 97 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + else + local.get $value|3 + f64.const 0 + f64.lt + local.set $sign + local.get $sign + if + local.get $buffer|2 + i32.const 45 + i32.store16 + local.get $buffer|2 + i32.const 2 + i32.add + local.set $buffer|2 + end + local.get $buffer|2 + i64.const 29555310648492105 + i64.store + local.get $buffer|2 + i64.const 34058970405077102 + i64.store offset=8 + i32.const 8 + local.get $sign i32.add - local.set $buffer + br $~lib/util/number/dtoa_buffered_impl|inlined.0 end - local.get $buffer - i64.const 29555310648492105 - i64.store - local.get $buffer - i64.const 34058970405077102 - i64.store offset=8 - i32.const 8 - local.get $sign - i32.add - return + unreachable end - unreachable + local.get $buffer|2 + local.get $value|3 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + br $~lib/util/number/dtoa_buffered_impl|inlined.0 end - local.get $buffer - local.get $value - call $~lib/util/number/dtoa_core return ) (func $std/array/Ref#toString (param $this i32) (result i32) @@ -15243,7 +15310,7 @@ global.set $~argumentsLength local.get $fn i32.load - call_indirect (type $17) + call_indirect (type $18) local.set $result local.get $outStart local.get $i @@ -28990,7 +29057,7 @@ if local.get $dataStart f64.load - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $10 global.get $~lib/memory/__stack_pointer i32.const 8 @@ -29046,7 +29113,7 @@ i32.shl i32.add local.get $value - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered i32.add local.set $offset local.get $sepLen @@ -29087,7 +29154,7 @@ i32.shl i32.add local.get $value - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered i32.add local.set $offset local.get $estLen @@ -46812,10 +46879,12 @@ local.get $12 return ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -46824,76 +46893,70 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 11296 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - f64.ne + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 11328 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 11296 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 11360 - i32.const 11408 - local.get $value + local.get $value|1 + local.get $value|1 + f64.sub f64.const 0 - f64.lt - select - local.set $3 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 11328 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 11360 + i32.const 11408 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 11440 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 11440 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 11440 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 11440 - local.get $size - memory.copy - local.get $result - local.set $3 + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) (func $~lib/util/number/utoa64 (param $value i64) (param $radix i32) (result i32) diff --git a/tests/compiler/std/array.release.wat b/tests/compiler/std/array.release.wat index 6a7b54d866..4ff1aba22c 100644 --- a/tests/compiler/std/array.release.wat +++ b/tests/compiler/std/array.release.wat @@ -5260,12 +5260,12 @@ (local $2 i64) (local $3 i32) (local $4 i64) - (local $5 i64) + (local $5 i32) (local $6 i64) - (local $7 i32) - (local $8 i32) + (local $7 i64) + (local $8 i64) (local $9 i32) - (local $10 i64) + (local $10 i32) (local $11 i64) (local $12 i64) (local $13 i64) @@ -5291,19 +5291,19 @@ i64.const 52 i64.shr_u i32.wrap_i64 - local.tee $7 + local.tee $5 i32.const 1 - local.get $7 + local.get $5 select i32.const 1075 i32.sub - local.tee $8 + local.tee $9 i32.const 1 i32.sub local.get $2 i64.const 4503599627370495 i64.and - local.get $7 + local.get $5 i32.const 0 i32.ne i64.extend_i32_u @@ -5318,11 +5318,11 @@ local.tee $4 i64.clz i32.wrap_i64 - local.tee $7 + local.tee $10 i32.sub - local.set $9 + local.set $5 local.get $4 - local.get $7 + local.get $10 i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_plus @@ -5332,20 +5332,20 @@ i64.eq i32.const 1 i32.add - local.tee $7 + local.tee $10 i64.extend_i32_s i64.shl i64.const 1 i64.sub - local.get $8 - local.get $7 - i32.sub local.get $9 + local.get $10 + i32.sub + local.get $5 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $9 + local.get $5 global.set $~lib/util/number/_exp i32.const 348 i32.const -61 @@ -5358,8 +5358,8 @@ f64.add local.tee $1 i32.trunc_sat_f64_s - local.tee $7 - local.get $7 + local.tee $5 + local.get $5 f64.convert_i32_s local.get $1 f64.ne @@ -5368,18 +5368,18 @@ i32.shr_s i32.const 1 i32.add - local.tee $7 + local.tee $5 i32.const 3 i32.shl - local.tee $8 + local.tee $9 i32.sub global.set $~lib/util/number/_K - local.get $8 + local.get $9 i32.const 12520 i32.add i64.load global.set $~lib/util/number/_frc_pow - local.get $7 + local.get $5 i32.const 1 i32.shl i32.const 13216 @@ -5393,74 +5393,80 @@ local.tee $2 i64.const 4294967295 i64.and - local.set $5 - local.get $2 - i64.const 32 - i64.shr_u - local.tee $4 + local.set $6 global.get $~lib/util/number/_frc_pow - local.tee $10 + local.tee $11 i64.const 4294967295 i64.and - local.tee $11 + local.tee $12 + local.get $2 + i64.const 32 + i64.shr_u + local.tee $2 i64.mul - local.get $5 - local.get $11 + local.get $6 + local.get $12 i64.mul i64.const 32 i64.shr_u i64.add - local.set $12 + local.set $7 global.get $~lib/util/number/_frc_plus - local.tee $2 + local.tee $4 i64.const 4294967295 i64.and local.set $13 - local.get $11 - local.get $2 + local.get $4 i64.const 32 i64.shr_u - local.tee $6 + local.tee $4 + local.get $12 i64.mul - local.get $11 + local.get $12 local.get $13 i64.mul i64.const 32 i64.shr_u i64.add - local.set $14 + local.set $8 global.get $~lib/util/number/_frc_minus - local.tee $15 + local.tee $14 i64.const 4294967295 i64.and - local.set $2 - local.get $11 - local.get $15 + local.set $15 + local.get $14 i64.const 32 i64.shr_u - local.tee $15 + local.tee $14 + local.get $12 i64.mul - local.get $2 - local.get $11 + local.get $12 + local.get $15 i64.mul i64.const 32 i64.shr_u i64.add - local.set $11 - local.get $10 + local.set $12 + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $2 + local.get $11 i64.const 32 i64.shr_u - local.tee $10 - local.get $6 + local.tee $2 i64.mul - local.get $14 + local.get $7 i64.const 32 i64.shr_u i64.add - local.get $10 - local.get $13 + local.get $2 + local.get $6 i64.mul - local.get $14 + local.get $7 i64.const 4294967295 i64.and i64.add @@ -5469,26 +5475,17 @@ i64.const 32 i64.shr_u i64.add - i64.const 1 - i64.sub - local.set $6 - local.get $0 - local.get $3 - i32.const 1 - i32.shl - i32.add - local.get $0 + local.get $2 local.get $4 - local.get $10 i64.mul - local.get $12 + local.get $8 i64.const 32 i64.shr_u i64.add - local.get $5 - local.get $10 + local.get $2 + local.get $13 i64.mul - local.get $12 + local.get $8 i64.const 4294967295 i64.and i64.add @@ -5497,24 +5494,26 @@ i64.const 32 i64.shr_u i64.add - local.get $6 + i64.const 1 + i64.sub + local.tee $4 global.get $~lib/util/number/_exp_pow global.get $~lib/util/number/_exp i32.add i32.const -64 i32.sub - local.get $6 - local.get $10 - local.get $15 + local.get $4 + local.get $2 + local.get $14 i64.mul - local.get $11 + local.get $12 i64.const 32 i64.shr_u i64.add local.get $2 - local.get $10 + local.get $15 i64.mul - local.get $11 + local.get $12 i64.const 4294967295 i64.and i64.add @@ -5535,75 +5534,77 @@ local.get $3 i32.add ) - (func $~lib/util/number/dtoa_buffered (param $0 i32) (param $1 f64) (result i32) + (func $~lib/util/number/dtoa_buffered (param $0 i32) (param $1 f64) (result i32) (local $2 i32) - local.get $1 - f64.const 0 - f64.eq - if - local.get $0 - i32.const 48 - i32.store16 - local.get $0 - i32.const 46 - i32.store16 offset=2 - local.get $0 - i32.const 48 - i32.store16 offset=4 - i32.const 3 - return - end - local.get $1 - local.get $1 - f64.sub - f64.const 0 - f64.ne - if + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $1 - local.get $1 - f64.ne + f64.const 0 + f64.eq if local.get $0 - i32.const 78 + i32.const 48 i32.store16 local.get $0 - i32.const 97 + i32.const 46 i32.store16 offset=2 local.get $0 - i32.const 78 + i32.const 48 i32.store16 offset=4 i32.const 3 - return - else + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + local.get $1 + local.get $1 + f64.sub + f64.const 0 + f64.ne + if local.get $1 - f64.const 0 - f64.lt - local.tee $2 + local.get $1 + f64.ne if local.get $0 - i32.const 45 + i32.const 78 i32.store16 local.get $0 - i32.const 2 + i32.const 97 + i32.store16 offset=2 + local.get $0 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + else + local.get $1 + f64.const 0 + f64.lt + local.tee $2 + if + local.get $0 + i32.const 45 + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + end + local.get $0 + i64.const 29555310648492105 + i64.store + local.get $0 + i64.const 34058970405077102 + i64.store offset=8 + local.get $2 + i32.const 8 i32.add - local.set $0 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 end - local.get $0 - i64.const 29555310648492105 - i64.store - local.get $0 - i64.const 34058970405077102 - i64.store offset=8 - local.get $2 - i32.const 8 - i32.add - return + unreachable end - unreachable + local.get $0 + local.get $1 + call $~lib/util/number/dtoa_core end - local.get $0 - local.get $1 - call $~lib/util/number/dtoa_core ) (func $~lib/util/number/itoa_buffered (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -15624,65 +15625,51 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $3 - f64.const 0 - f64.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 12320 - local.set $0 - br $folding-inner1 - end - local.get $3 - local.get $3 - f64.sub - f64.const 0 - f64.ne - if + i32.const 12320 + local.set $0 + block $~lib/util/number/dtoa_impl|inlined.0 + local.get $3 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.0 local.get $3 local.get $3 + f64.sub + f64.const 0 f64.ne if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer i32.const 12352 local.set $0 - br $folding-inner1 + local.get $3 + local.get $3 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.0 + i32.const 12384 + i32.const 12432 + local.get $3 + f64.const 0 + f64.lt + select + local.set $0 + br $~lib/util/number/dtoa_impl|inlined.0 end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 12384 - i32.const 12432 + i32.const 12464 local.get $3 - f64.const 0 - f64.lt - select - local.set $0 - br $folding-inner1 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + local.get $0 + i32.const 12464 + local.get $1 + memory.copy end - i32.const 12464 - local.get $3 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store - local.get $0 - i32.const 12464 - local.get $1 - memory.copy global.get $~lib/memory/__stack_pointer i32.const 4 i32.add @@ -15727,7 +15714,7 @@ i32.shl i32.add f64.load - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered local.get $2 i32.add local.set $2 @@ -15766,7 +15753,7 @@ i32.shl i32.add f64.load - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered local.get $2 i32.add local.tee $0 diff --git a/tests/compiler/std/math.release.wat b/tests/compiler/std/math.release.wat index 9e691da3f0..bc8b278553 100644 --- a/tests/compiler/std/math.release.wat +++ b/tests/compiler/std/math.release.wat @@ -49901,7 +49901,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -49945,7 +49945,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -49967,7 +49967,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50033,7 +50033,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50099,7 +50099,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50165,7 +50165,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50253,7 +50253,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50363,7 +50363,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50517,7 +50517,7 @@ call $~lib/builtins/abort unreachable end - f64.const -nan:0x8000000000000 + f64.const nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -51749,7 +51749,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51775,7 +51775,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51788,7 +51788,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51827,7 +51827,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51866,7 +51866,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51905,7 +51905,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51957,7 +51957,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -52022,7 +52022,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -52048,7 +52048,7 @@ call $~lib/builtins/abort unreachable end - f32.const -nan:0x400000 + f32.const nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check diff --git a/tests/compiler/std/typedarray.debug.wat b/tests/compiler/std/typedarray.debug.wat index 15de61b0fb..46525d53ab 100644 --- a/tests/compiler/std/typedarray.debug.wat +++ b/tests/compiler/std/typedarray.debug.wat @@ -18,40 +18,42 @@ (type $16 (func (param i64 i64 i32 i32) (result i64))) (type $17 (func (param i32 i32) (result i64))) (type $18 (func (param i32 i64 i32) (result i32))) - (type $19 (func (param f32 f32 i32 i32) (result f32))) - (type $20 (func (param f64 f64 i32 i32) (result f64))) - (type $21 (func (param i64 i32 i32) (result i64))) - (type $22 (func (param i32 i32) (result f64))) - (type $23 (func (param i32 i32 i64) (result i64))) - (type $24 (func (param i32 i32) (result f32))) - (type $25 (func (param i64 i32 i32))) - (type $26 (func (param i32 f32 i32) (result i32))) - (type $27 (func (param i32 f64 i32) (result i32))) + (type $19 (func (param i32 f64 i32) (result i32))) + (type $20 (func (param f32 f32 i32 i32) (result f32))) + (type $21 (func (param f64 f64 i32 i32) (result f64))) + (type $22 (func (param i64 i32 i32) (result i64))) + (type $23 (func (param i32 i32) (result f64))) + (type $24 (func (param i32 i32 i64) (result i64))) + (type $25 (func (param i32 i32) (result f32))) + (type $26 (func (param i64 i32 i32))) + (type $27 (func (param i32 f32 i32) (result i32))) (type $28 (func (param i64 i32) (result i32))) (type $29 (func (param i32 i32 i32 i32 i32) (result i32))) (type $30 (func (param f32 i32 i32) (result f32))) (type $31 (func (param f64 i32 i32) (result f64))) (type $32 (func (param i32 i64 i32))) (type $33 (func (param i32 i64) (result i32))) - (type $34 (func (param i32 f64) (result i32))) - (type $35 (func (param i32 i32 i64))) - (type $36 (func (param i32 i32 f32) (result f32))) - (type $37 (func (param i32 i32 f64) (result f64))) - (type $38 (func (param f32 i32 i32))) - (type $39 (func (param f64 i32 i32))) - (type $40 (func (param i32 i32 i32 i32))) - (type $41 (func (param i32 i32 i64) (result i32))) - (type $42 (func (result i32))) - (type $43 (func (param f32 f32) (result f32))) - (type $44 (func (param f64 f64) (result f64))) - (type $45 (func (param i64) (result i64))) - (type $46 (func (param i32 i64 i32 i32))) - (type $47 (func (param i64) (result i32))) - (type $48 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) - (type $49 (func (param i32 i32 f64 f64 f64 f64 f64))) - (type $50 (func (param i32 i32 f64))) - (type $51 (func (param i32 i32 f32))) - (type $52 (func (param f64) (result i32))) + (type $34 (func (param i32 i32 i64))) + (type $35 (func (param i32 i32 f32) (result f32))) + (type $36 (func (param i32 i32 f64) (result f64))) + (type $37 (func (param f32 i32 i32))) + (type $38 (func (param f64 i32 i32))) + (type $39 (func (param i32 i32 i32 i32))) + (type $40 (func (param i32 i32 i64) (result i32))) + (type $41 (func (result i32))) + (type $42 (func (param f32 f32) (result f32))) + (type $43 (func (param f64 f64) (result f64))) + (type $44 (func (param i64) (result i64))) + (type $45 (func (param i32 i64 i32 i32))) + (type $46 (func (param i64) (result i32))) + (type $47 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $48 (func (param i32 f32) (result i32))) + (type $49 (func (param i32 f64) (result i32))) + (type $50 (func (param i32 i32 f64 f64 f64 f64 f64))) + (type $51 (func (param i32 i32 f64))) + (type $52 (func (param i32 i32 f32))) + (type $53 (func (param f32) (result i32))) + (type $54 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (global $~lib/typedarray/Int8Array.BYTES_PER_ELEMENT i32 (i32.const 1)) @@ -7730,26 +7732,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -7765,28 +7771,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -7805,77 +7811,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -7886,12 +7938,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -7943,14 +7995,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -8035,63 +8087,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -8100,11 +8152,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -8113,63 +8165,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -8180,13 +8232,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -8207,77 +8259,185 @@ i32.add return ) - (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f32) (result i32) + (local $buffer|2 i32) + (local $value|3 f64) + (local $isSinglePrecision i32) (local $sign i32) - local.get $value - f64.const 0 - f64.eq - if - local.get $buffer - i32.const 48 - i32.store16 - local.get $buffer - i32.const 46 - i32.store16 offset=2 + i32.const 4 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $buffer - i32.const 48 - i32.store16 offset=4 - i32.const 3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if + local.set $buffer|2 local.get $value + f64.promote_f32 + local.set $value|3 + i32.const 1 + local.set $isSinglePrecision + local.get $value|3 + f64.const 0 + f64.eq + if + local.get $buffer|2 + i32.const 48 + i32.store16 + local.get $buffer|2 + i32.const 46 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 48 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + local.get $value|3 + local.get $value|3 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|3 + local.get $value|3 + f64.ne + if + local.get $buffer|2 + i32.const 78 + i32.store16 + local.get $buffer|2 + i32.const 97 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + else + local.get $value|3 + f64.const 0 + f64.lt + local.set $sign + local.get $sign + if + local.get $buffer|2 + i32.const 45 + i32.store16 + local.get $buffer|2 + i32.const 2 + i32.add + local.set $buffer|2 + end + local.get $buffer|2 + i64.const 29555310648492105 + i64.store + local.get $buffer|2 + i64.const 34058970405077102 + i64.store offset=8 + i32.const 8 + local.get $sign + i32.add + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + unreachable + end + local.get $buffer|2 + local.get $value|3 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + return + ) + (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) + (local $buffer|2 i32) + (local $value|3 f64) + (local $isSinglePrecision i32) + (local $sign i32) + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_buffered_impl|inlined.1 (result i32) + local.get $buffer + local.set $buffer|2 local.get $value - f64.ne + local.set $value|3 + i32.const 0 + local.set $isSinglePrecision + local.get $value|3 + f64.const 0 + f64.eq if - local.get $buffer - i32.const 78 + local.get $buffer|2 + i32.const 48 i32.store16 - local.get $buffer - i32.const 97 + local.get $buffer|2 + i32.const 46 i32.store16 offset=2 - local.get $buffer - i32.const 78 + local.get $buffer|2 + i32.const 48 i32.store16 offset=4 i32.const 3 - return - else - local.get $value - f64.const 0 - f64.lt - local.set $sign - local.get $sign + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + local.get $value|3 + local.get $value|3 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|3 + local.get $value|3 + f64.ne if - local.get $buffer - i32.const 45 + local.get $buffer|2 + i32.const 78 i32.store16 - local.get $buffer - i32.const 2 + local.get $buffer|2 + i32.const 97 + i32.store16 offset=2 + local.get $buffer|2 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + else + local.get $value|3 + f64.const 0 + f64.lt + local.set $sign + local.get $sign + if + local.get $buffer|2 + i32.const 45 + i32.store16 + local.get $buffer|2 + i32.const 2 + i32.add + local.set $buffer|2 + end + local.get $buffer|2 + i64.const 29555310648492105 + i64.store + local.get $buffer|2 + i64.const 34058970405077102 + i64.store offset=8 + i32.const 8 + local.get $sign i32.add - local.set $buffer + br $~lib/util/number/dtoa_buffered_impl|inlined.1 end - local.get $buffer - i64.const 29555310648492105 - i64.store - local.get $buffer - i64.const 34058970405077102 - i64.store offset=8 - i32.const 8 - local.get $sign - i32.add - return + unreachable end - unreachable + local.get $buffer|2 + local.get $value|3 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + br $~lib/util/number/dtoa_buffered_impl|inlined.1 end - local.get $buffer - local.get $value - call $~lib/util/number/dtoa_core return ) (func $~lib/arraybuffer/ArrayBuffer#get:byteLength (param $this i32) (result i32) @@ -20199,7 +20359,7 @@ global.set $~argumentsLength local.get $fn|4 i32.load - call_indirect (type $19) + call_indirect (type $20) local.set $initialValue|5 local.get $i i32.const 1 @@ -20371,7 +20531,7 @@ global.set $~argumentsLength local.get $fn|4 i32.load - call_indirect (type $20) + call_indirect (type $21) local.set $initialValue|5 local.get $i i32.const 1 @@ -23911,7 +24071,7 @@ global.set $~argumentsLength local.get $fn|4 i32.load - call_indirect (type $19) + call_indirect (type $20) local.set $initialValue|5 local.get $i i32.const 1 @@ -24082,7 +24242,7 @@ global.set $~argumentsLength local.get $fn|4 i32.load - call_indirect (type $20) + call_indirect (type $21) local.set $initialValue|5 local.get $i i32.const 1 @@ -26199,7 +26359,7 @@ global.set $~argumentsLength local.get $fn|3 i32.load - call_indirect (type $21) + call_indirect (type $22) i64.store local.get $i i32.const 1 @@ -26497,7 +26657,7 @@ global.set $~argumentsLength local.get $fn|3 i32.load - call_indirect (type $21) + call_indirect (type $22) i64.store local.get $i i32.const 1 @@ -41334,7 +41494,7 @@ global.set $~argumentsLength local.get $fn|3 i32.load - call_indirect (type $25) + call_indirect (type $26) local.get $i i32.const 1 i32.add @@ -41584,7 +41744,7 @@ global.set $~argumentsLength local.get $fn|3 i32.load - call_indirect (type $25) + call_indirect (type $26) local.get $i i32.const 1 i32.add @@ -41834,7 +41994,7 @@ global.set $~argumentsLength local.get $fn|3 i32.load - call_indirect (type $38) + call_indirect (type $37) local.get $i i32.const 1 i32.add @@ -42084,7 +42244,7 @@ global.set $~argumentsLength local.get $fn|3 i32.load - call_indirect (type $39) + call_indirect (type $38) local.get $i i32.const 1 i32.add @@ -60147,8 +60307,7 @@ if local.get $dataStart f32.load - f64.promote_f32 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $10 global.get $~lib/memory/__stack_pointer i32.const 8 @@ -60204,8 +60363,7 @@ i32.shl i32.add local.get $value - f64.promote_f32 - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered i32.add local.set $offset local.get $sepLen @@ -60246,8 +60404,7 @@ i32.shl i32.add local.get $value - f64.promote_f32 - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered i32.add local.set $offset local.get $estLen @@ -60521,7 +60678,7 @@ if local.get $dataStart f64.load - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $10 global.get $~lib/memory/__stack_pointer i32.const 8 @@ -60577,7 +60734,7 @@ i32.shl i32.add local.get $value - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered i32.add local.set $offset local.get $sepLen @@ -60618,7 +60775,7 @@ i32.shl i32.add local.get $value - call $~lib/util/number/dtoa_buffered + call $~lib/util/number/dtoa_buffered i32.add local.set $offset local.get $estLen @@ -93815,10 +93972,12 @@ local.get $17 return ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa (param $value f32) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -93827,76 +93986,151 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 8640 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value + i32.const 4 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - f64.ne + f64.promote_f32 + local.set $value|1 + i32.const 1 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 8672 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 8640 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 8704 - i32.const 8752 - local.get $value + local.get $value|1 + local.get $value|1 + f64.sub f64.const 0 - f64.lt - select - local.set $3 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 8672 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 8704 + i32.const 8752 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 8784 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 8784 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 8784 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $~lib/util/number/dtoa (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) + (local $size i32) + (local $result i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 i32.store - local.get $result - i32.const 8784 - local.get $size - memory.copy - local.get $result - local.set $3 + i32.const 8 + i32.const 4 + i32.eq + drop + block $~lib/util/number/dtoa_impl|inlined.1 (result i32) + local.get $value + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq + if + i32.const 8640 + br $~lib/util/number/dtoa_impl|inlined.1 + end + local.get $value|1 + local.get $value|1 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 8672 + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 8704 + i32.const 8752 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 8784 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size + global.get $~lib/memory/__stack_pointer + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 8784 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.1 + end + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) (func $~lib/arraybuffer/ArrayBuffer#constructor (param $this i32) (param $length i32) (result i32) diff --git a/tests/compiler/std/typedarray.release.wat b/tests/compiler/std/typedarray.release.wat index 6b63063fcc..30c2366c5a 100644 --- a/tests/compiler/std/typedarray.release.wat +++ b/tests/compiler/std/typedarray.release.wat @@ -24,24 +24,23 @@ (type $22 (func (param f32 f32 i32 i32) (result f32))) (type $23 (func (param f64 f64 i32 i32) (result f64))) (type $24 (func (param i64 i32 i32) (result i64))) - (type $25 (func (param i32 f64) (result i32))) + (type $25 (func (param i32 f64 i32) (result i32))) (type $26 (func (param i32 i32) (result f64))) (type $27 (func (param i32 i32) (result f32))) (type $28 (func (param i64 i32 i32))) (type $29 (func (param f32 i32 i32) (result f32))) (type $30 (func (param f64 i32 i32) (result f64))) - (type $31 (func (param f32 i32 i32))) - (type $32 (func (param f64 i32 i32))) - (type $33 (func (param i32 f32 i32) (result i32))) - (type $34 (func (param i32 f64 i32) (result i32))) - (type $35 (func (result i32))) - (type $36 (func (param i32 i64 i32))) - (type $37 (func (param i32 i64 i64 i32 i64 i32) (result i32))) - (type $38 (func (param i32 i32 f64 f64 f64 f64 f64))) - (type $39 (func (param i32 i32 f64))) - (type $40 (func (param i32 i32 f32))) - (type $41 (func (param i32 f32) (result i32))) - (type $42 (func (param f64) (result i32))) + (type $31 (func (param i32 f32) (result i32))) + (type $32 (func (param i32 f64) (result i32))) + (type $33 (func (param f32 i32 i32))) + (type $34 (func (param f64 i32 i32))) + (type $35 (func (param i32 f32 i32) (result i32))) + (type $36 (func (result i32))) + (type $37 (func (param i32 i64 i32))) + (type $38 (func (param i32 i64 i64 i32 i64 i32) (result i32))) + (type $39 (func (param i32 i32 f64 f64 f64 f64 f64))) + (type $40 (func (param i32 i32 f64))) + (type $41 (func (param i32 i32 f32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -767,7 +766,7 @@ local.get $1 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$1388 + block $__inlined_func$~lib/rt/itcms/Object#unlink$1391 local.get $0 i32.load offset=4 i32.const -4 @@ -791,7 +790,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$1388 + br $__inlined_func$~lib/rt/itcms/Object#unlink$1391 end local.get $0 i32.load offset=8 @@ -4969,13 +4968,12 @@ end end ) - (func $~lib/util/number/dtoa_core (param $0 i32) (param $1 f64) (result i32) - (local $2 i64) - (local $3 i32) - (local $4 i64) - (local $5 i64) + (func $~lib/util/number/dtoa_core (param $0 i32) (param $1 f64) (param $2 i32) (result i32) + (local $3 i64) + (local $4 i32) + (local $5 i32) (local $6 i64) - (local $7 i32) + (local $7 i64) (local $8 i32) (local $9 i32) (local $10 i64) @@ -4984,74 +4982,110 @@ (local $13 i64) (local $14 i64) (local $15 i64) + (local $16 i64) local.get $1 f64.const 0 f64.lt - local.tee $3 - if (result f64) + local.tee $4 + if local.get $0 i32.const 45 i32.store16 local.get $1 f64.neg + local.set $1 + end + local.get $2 + if (result i64) + local.get $1 + f32.demote_f64 + i32.reinterpret_f32 + local.tee $8 + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.tee $9 + i32.const 1 + local.get $9 + select + i32.const 150 + i32.sub + local.set $5 + local.get $8 + i32.const 8388607 + i32.and + i64.extend_i32_u + local.get $9 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + i64.add else local.get $1 + i64.reinterpret_f64 + local.tee $3 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.tee $8 + i32.const 1 + local.get $8 + select + i32.const 1075 + i32.sub + local.set $5 + local.get $3 + i64.const 4503599627370495 + i64.and + local.get $8 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + i64.add end - i64.reinterpret_f64 - local.tee $2 - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.tee $7 - i32.const 1 - local.get $7 - select - i32.const 1075 - i32.sub - local.tee $8 + local.set $3 + local.get $5 i32.const 1 i32.sub - local.get $2 - i64.const 4503599627370495 - i64.and - local.get $7 - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - i64.add - local.tee $2 + local.get $3 i64.const 1 i64.shl i64.const 1 i64.add - local.tee $4 + local.tee $6 i64.clz i32.wrap_i64 - local.tee $7 + local.tee $8 i32.sub local.set $9 - local.get $4 - local.get $7 + local.get $6 + local.get $8 i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_plus - local.get $2 - local.get $2 + local.get $3 + local.get $3 + i64.const 8388608 i64.const 4503599627370496 + local.get $2 + select i64.eq i32.const 1 i32.add - local.tee $7 + local.tee $2 i64.extend_i32_s i64.shl i64.const 1 i64.sub - local.get $8 - local.get $7 + local.get $5 + local.get $2 i32.sub local.get $9 i32.sub @@ -5071,8 +5105,8 @@ f64.add local.tee $1 i32.trunc_sat_f64_s - local.tee $7 - local.get $7 + local.tee $2 + local.get $2 f64.convert_i32_s local.get $1 f64.ne @@ -5081,99 +5115,99 @@ i32.shr_s i32.const 1 i32.add - local.tee $7 + local.tee $2 i32.const 3 i32.shl - local.tee $8 + local.tee $5 i32.sub global.set $~lib/util/number/_K - local.get $8 + local.get $5 i32.const 9864 i32.add i64.load global.set $~lib/util/number/_frc_pow - local.get $7 + local.get $2 i32.const 1 i32.shl i32.const 10560 i32.add i32.load16_s global.set $~lib/util/number/_exp_pow - local.get $2 - local.get $2 + local.get $3 + local.get $3 i64.clz i64.shl - local.tee $2 + local.tee $3 i64.const 4294967295 i64.and - local.set $5 - local.get $2 + local.set $10 + local.get $3 i64.const 32 i64.shr_u - local.tee $4 + local.tee $6 global.get $~lib/util/number/_frc_pow - local.tee $10 + local.tee $11 i64.const 4294967295 i64.and - local.tee $11 + local.tee $12 i64.mul - local.get $5 - local.get $11 + local.get $10 + local.get $12 i64.mul i64.const 32 i64.shr_u i64.add - local.set $12 + local.set $13 global.get $~lib/util/number/_frc_plus - local.tee $2 + local.tee $3 i64.const 4294967295 i64.and - local.set $13 - local.get $11 - local.get $2 + local.set $14 + local.get $12 + local.get $3 i64.const 32 i64.shr_u - local.tee $6 + local.tee $7 i64.mul - local.get $11 - local.get $13 + local.get $12 + local.get $14 i64.mul i64.const 32 i64.shr_u i64.add - local.set $14 + local.set $15 global.get $~lib/util/number/_frc_minus - local.tee $15 + local.tee $16 i64.const 4294967295 i64.and - local.set $2 - local.get $11 - local.get $15 + local.set $3 + local.get $12 + local.get $16 i64.const 32 i64.shr_u - local.tee $15 + local.tee $16 i64.mul - local.get $2 - local.get $11 + local.get $3 + local.get $12 i64.mul i64.const 32 i64.shr_u i64.add - local.set $11 - local.get $10 + local.set $12 + local.get $11 i64.const 32 i64.shr_u - local.tee $10 - local.get $6 + local.tee $11 + local.get $7 i64.mul - local.get $14 + local.get $15 i64.const 32 i64.shr_u i64.add - local.get $10 - local.get $13 - i64.mul + local.get $11 local.get $14 + i64.mul + local.get $15 i64.const 4294967295 i64.and i64.add @@ -5184,24 +5218,24 @@ i64.add i64.const 1 i64.sub - local.set $6 + local.set $7 local.get $0 - local.get $3 + local.get $4 i32.const 1 i32.shl i32.add local.get $0 - local.get $4 - local.get $10 + local.get $6 + local.get $11 i64.mul - local.get $12 + local.get $13 i64.const 32 i64.shr_u i64.add - local.get $5 local.get $10 + local.get $11 i64.mul - local.get $12 + local.get $13 i64.const 4294967295 i64.and i64.add @@ -5210,24 +5244,24 @@ i64.const 32 i64.shr_u i64.add - local.get $6 + local.get $7 global.get $~lib/util/number/_exp_pow global.get $~lib/util/number/_exp i32.add i32.const -64 i32.sub - local.get $6 - local.get $10 - local.get $15 - i64.mul + local.get $7 local.get $11 + local.get $16 + i64.mul + local.get $12 i64.const 32 i64.shr_u i64.add - local.get $2 - local.get $10 - i64.mul + local.get $3 local.get $11 + i64.mul + local.get $12 i64.const 4294967295 i64.and i64.add @@ -5239,84 +5273,163 @@ i64.const 1 i64.add i64.sub - local.get $3 + local.get $4 call $~lib/util/number/genDigits - local.get $3 + local.get $4 i32.sub global.get $~lib/util/number/_K call $~lib/util/number/prettify - local.get $3 + local.get $4 i32.add ) - (func $~lib/util/number/dtoa_buffered (param $0 i32) (param $1 f64) (result i32) - (local $2 i32) - local.get $1 - f64.const 0 - f64.eq - if - local.get $0 - i32.const 48 - i32.store16 - local.get $0 - i32.const 46 - i32.store16 offset=2 + (func $~lib/util/number/dtoa_buffered (param $0 i32) (param $1 f32) (result i32) + (local $2 f64) + (local $3 i32) + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) + local.get $1 + f64.promote_f32 + local.tee $2 + f64.const 0 + f64.eq + if + local.get $0 + i32.const 48 + i32.store16 + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + i32.const 48 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + local.get $2 + local.get $2 + f64.sub + f64.const 0 + f64.ne + if + local.get $2 + local.get $2 + f64.ne + if + local.get $0 + i32.const 78 + i32.store16 + local.get $0 + i32.const 97 + i32.store16 offset=2 + local.get $0 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + else + local.get $2 + f64.const 0 + f64.lt + local.tee $3 + if + local.get $0 + i32.const 45 + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + end + local.get $0 + i64.const 29555310648492105 + i64.store + local.get $0 + i64.const 34058970405077102 + i64.store offset=8 + local.get $3 + i32.const 8 + i32.add + br $~lib/util/number/dtoa_buffered_impl|inlined.0 + end + unreachable + end local.get $0 - i32.const 48 - i32.store16 offset=4 - i32.const 3 - return + local.get $2 + i32.const 1 + call $~lib/util/number/dtoa_core end - local.get $1 - local.get $1 - f64.sub - f64.const 0 - f64.ne - if - local.get $1 + ) + (func $~lib/util/number/dtoa_buffered (param $0 i32) (param $1 f64) (result i32) + (local $2 i32) + block $~lib/util/number/dtoa_buffered_impl|inlined.1 (result i32) local.get $1 - f64.ne + f64.const 0 + f64.eq if local.get $0 - i32.const 78 + i32.const 48 i32.store16 local.get $0 - i32.const 97 + i32.const 46 i32.store16 offset=2 local.get $0 - i32.const 78 + i32.const 48 i32.store16 offset=4 i32.const 3 - return - else + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + end + local.get $1 + local.get $1 + f64.sub + f64.const 0 + f64.ne + if local.get $1 - f64.const 0 - f64.lt - local.tee $2 + local.get $1 + f64.ne if local.get $0 - i32.const 45 + i32.const 78 i32.store16 local.get $0 - i32.const 2 + i32.const 97 + i32.store16 offset=2 + local.get $0 + i32.const 78 + i32.store16 offset=4 + i32.const 3 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 + else + local.get $1 + f64.const 0 + f64.lt + local.tee $2 + if + local.get $0 + i32.const 45 + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + end + local.get $0 + i64.const 29555310648492105 + i64.store + local.get $0 + i64.const 34058970405077102 + i64.store offset=8 + local.get $2 + i32.const 8 i32.add - local.set $0 + br $~lib/util/number/dtoa_buffered_impl|inlined.1 end - local.get $0 - i64.const 29555310648492105 - i64.store - local.get $0 - i64.const 34058970405077102 - i64.store offset=8 - local.get $2 - i32.const 8 - i32.add - return + unreachable end - unreachable + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/number/dtoa_core end - local.get $0 - local.get $1 - call $~lib/util/number/dtoa_core ) (func $~lib/util/sort/insertionSort (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (local $5 i32) @@ -37625,56 +37738,31 @@ global.set $~lib/memory/__stack_pointer local.get $0 ) - (func $~lib/typedarray/Float32Array#join (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/util/string/joinFloatArray (param $0 i32) (param $1 i32) (result i32) (local $2 i32) - (local $3 i32) + (local $3 f64) (local $4 i32) - (local $5 i32) + (local $5 f32) (local $6 i32) + (local $7 i32) + (local $8 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 16320 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - i32.load offset=4 - local.set $5 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/typedarray/Int32Array#get:length - local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 9584 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 16320 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - block $__inlined_func$~lib/util/string/joinFloatArray$1393 - local.get $0 + block $folding-inner1 + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 16320 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $1 i32.const 1 i32.sub - local.tee $6 + local.tee $8 i32.const 0 i32.lt_s if @@ -37683,22 +37771,78 @@ i32.add global.set $~lib/memory/__stack_pointer i32.const 7776 - local.set $0 - br $__inlined_func$~lib/util/string/joinFloatArray$1393 + return end - local.get $6 + local.get $8 i32.eqz if - local.get $5 + local.get $0 f32.load - f64.promote_f32 - call $~lib/util/number/dtoa + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 16320 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 9664 local.set $0 + block $~lib/util/number/dtoa_impl|inlined.0 + local.get $5 + f64.promote_f32 + local.tee $3 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.0 + local.get $3 + local.get $3 + f64.sub + f64.const 0 + f64.ne + if + i32.const 9696 + local.set $0 + local.get $3 + local.get $3 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.0 + i32.const 9728 + i32.const 9776 + local.get $3 + f64.const 0 + f64.lt + select + local.set $0 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 9808 + local.get $3 + i32.const 1 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + local.get $0 + i32.const 9808 + local.get $1 + memory.copy + end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/util/string/joinFloatArray$1393 + br $folding-inner1 end global.get $~lib/memory/__stack_pointer i32.const 9584 @@ -37708,166 +37852,180 @@ i32.load i32.const 1 i32.shr_u - local.tee $4 + local.tee $1 i32.const 28 i32.add - local.get $6 + local.get $8 i32.mul i32.const 28 i32.add - local.tee $2 + local.tee $6 i32.const 1 i32.shl i32.const 2 call $~lib/rt/itcms/__new - local.tee $0 + local.tee $7 i32.store offset=4 loop $for-loop|0 - local.get $3 - local.get $6 + local.get $4 + local.get $8 i32.lt_s if - local.get $0 - local.get $1 + local.get $7 + local.get $2 i32.const 1 i32.shl i32.add - local.get $5 - local.get $3 + local.get $0 + local.get $4 i32.const 2 i32.shl i32.add f32.load - f64.promote_f32 - call $~lib/util/number/dtoa_buffered - local.get $1 + call $~lib/util/number/dtoa_buffered + local.get $2 i32.add - local.set $1 - local.get $4 + local.set $2 + local.get $1 if - local.get $0 - local.get $1 + local.get $7 + local.get $2 i32.const 1 i32.shl i32.add i32.const 9584 - local.get $4 + local.get $1 i32.const 1 i32.shl memory.copy local.get $1 - local.get $4 + local.get $2 i32.add - local.set $1 + local.set $2 end - local.get $3 + local.get $4 i32.const 1 i32.add - local.set $3 + local.set $4 br $for-loop|0 end end + local.get $6 + local.get $7 local.get $2 - local.get $0 - local.get $1 i32.const 1 i32.shl i32.add - local.get $5 - local.get $6 + local.get $0 + local.get $8 i32.const 2 i32.shl i32.add f32.load - f64.promote_f32 - call $~lib/util/number/dtoa_buffered - local.get $1 + call $~lib/util/number/dtoa_buffered + local.get $2 i32.add - local.tee $1 + local.tee $0 i32.gt_s if global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $7 i32.store + local.get $7 local.get $0 - local.get $1 call $~lib/string/String#substring local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/util/string/joinFloatArray$1393 + br $folding-inner1 end global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer + local.get $7 + return end - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - return + i32.const 49120 + i32.const 49168 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable end - i32.const 49120 - i32.const 49168 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 ) - (func $~lib/typedarray/Float64Array#join (param $0 i32) (result i32) + (func $~lib/typedarray/Float32Array#join (param $0 i32) (result i32) (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 16320 + i32.lt_s + if + i32.const 49120 + i32.const 49168 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.load offset=4 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/typedarray/Int32Array#get:length + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 9584 + i32.store + local.get $1 + local.get $0 + call $~lib/util/string/joinFloatArray + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/util/string/joinFloatArray (param $0 i32) (param $1 i32) (result i32) (local $2 i32) - (local $3 i32) + (local $3 f64) (local $4 i32) (local $5 i32) (local $6 i32) + (local $7 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 16320 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - i32.load offset=4 - local.set $5 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/typedarray/Int64Array#get:length - local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 9584 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 16320 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - block $__inlined_func$~lib/util/string/joinFloatArray$1394 - local.get $0 + block $folding-inner1 + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 16320 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $1 i32.const 1 i32.sub - local.tee $6 + local.tee $7 i32.const 0 i32.lt_s if @@ -37876,21 +38034,76 @@ i32.add global.set $~lib/memory/__stack_pointer i32.const 7776 - local.set $0 - br $__inlined_func$~lib/util/string/joinFloatArray$1394 + return end - local.get $6 + local.get $7 i32.eqz if - local.get $5 + local.get $0 f64.load - call $~lib/util/number/dtoa + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 16320 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 9664 local.set $0 + block $~lib/util/number/dtoa_impl|inlined.1 + local.get $3 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.1 + local.get $3 + local.get $3 + f64.sub + f64.const 0 + f64.ne + if + i32.const 9696 + local.set $0 + local.get $3 + local.get $3 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.1 + i32.const 9728 + i32.const 9776 + local.get $3 + f64.const 0 + f64.lt + select + local.set $0 + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 9808 + local.get $3 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + local.get $0 + i32.const 9808 + local.get $1 + memory.copy + end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/util/string/joinFloatArray$1394 + br $folding-inner1 end global.get $~lib/memory/__stack_pointer i32.const 9584 @@ -37900,113 +38113,155 @@ i32.load i32.const 1 i32.shr_u - local.tee $4 + local.tee $1 i32.const 28 i32.add - local.get $6 + local.get $7 i32.mul i32.const 28 i32.add - local.tee $2 + local.tee $5 i32.const 1 i32.shl i32.const 2 call $~lib/rt/itcms/__new - local.tee $0 + local.tee $6 i32.store offset=4 loop $for-loop|0 - local.get $3 - local.get $6 + local.get $4 + local.get $7 i32.lt_s if - local.get $0 - local.get $1 + local.get $6 + local.get $2 i32.const 1 i32.shl i32.add - local.get $5 - local.get $3 + local.get $0 + local.get $4 i32.const 3 i32.shl i32.add f64.load - call $~lib/util/number/dtoa_buffered - local.get $1 + call $~lib/util/number/dtoa_buffered + local.get $2 i32.add - local.set $1 - local.get $4 + local.set $2 + local.get $1 if - local.get $0 - local.get $1 + local.get $6 + local.get $2 i32.const 1 i32.shl i32.add i32.const 9584 - local.get $4 + local.get $1 i32.const 1 i32.shl memory.copy local.get $1 - local.get $4 + local.get $2 i32.add - local.set $1 + local.set $2 end - local.get $3 + local.get $4 i32.const 1 i32.add - local.set $3 + local.set $4 br $for-loop|0 end end + local.get $5 + local.get $6 local.get $2 - local.get $0 - local.get $1 i32.const 1 i32.shl i32.add - local.get $5 - local.get $6 + local.get $0 + local.get $7 i32.const 3 i32.shl i32.add f64.load - call $~lib/util/number/dtoa_buffered - local.get $1 + call $~lib/util/number/dtoa_buffered + local.get $2 i32.add - local.tee $1 + local.tee $0 i32.gt_s if global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $6 i32.store + local.get $6 local.get $0 - local.get $1 call $~lib/string/String#substring local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/util/string/joinFloatArray$1394 + br $folding-inner1 end global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer + local.get $6 + return end - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - return + i32.const 49120 + i32.const 49168 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable end - i32.const 49120 - i32.const 49168 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/typedarray/Float64Array#join (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 16320 + i32.lt_s + if + i32.const 49120 + i32.const 49168 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.load offset=4 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/typedarray/Int64Array#get:length + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 9584 + i32.store + local.get $1 + local.get $0 + call $~lib/util/string/joinFloatArray + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 ) (func $~lib/typedarray/Uint8Array.wrap@varargs (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -63600,7 +63855,7 @@ local.get $1 i32.const 7488 i32.load - call_indirect (type $31) + call_indirect (type $33) local.get $0 i32.const 1 i32.add @@ -63744,7 +63999,7 @@ local.get $1 i32.const 7520 i32.load - call_indirect (type $32) + call_indirect (type $34) local.get $0 i32.const 1 i32.add @@ -68554,89 +68809,6 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) - (func $~lib/util/number/dtoa (param $0 f64) (result i32) - (local $1 i32) - (local $2 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 16320 - i32.lt_s - if - i32.const 49120 - i32.const 49168 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $0 - f64.const 0 - f64.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 9664 - return - end - local.get $0 - local.get $0 - f64.sub - f64.const 0 - f64.ne - if - local.get $0 - local.get $0 - f64.ne - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 9696 - return - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 9728 - i32.const 9776 - local.get $0 - f64.const 0 - f64.lt - select - return - end - i32.const 9808 - local.get $0 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $2 - i32.store - local.get $2 - i32.const 9808 - local.get $1 - memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $2 - ) (func $~lib/arraybuffer/ArrayBuffer#constructor (param $0 i32) (result i32) global.get $~lib/memory/__stack_pointer i32.const 4 diff --git a/tests/compiler/templateliteral.debug.wat b/tests/compiler/templateliteral.debug.wat index 4afd1b5eec..795e5c6002 100644 --- a/tests/compiler/templateliteral.debug.wat +++ b/tests/compiler/templateliteral.debug.wat @@ -14,7 +14,7 @@ (type $12 (func (param i64 i32) (result i32))) (type $13 (func (param i32 i64 i32 i32))) (type $14 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) - (type $15 (func (param i32 f64) (result i32))) + (type $15 (func (param i32 f64 i32) (result i32))) (type $16 (func (param f64 i32) (result i32))) (type $17 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) @@ -3771,26 +3771,30 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) (local $sign i32) - (local $value|3 f64) - (local $buffer|4 i32) - (local $sign|5 i32) - (local $uv i64) - (local $exp i32) - (local $sid i64) + (local $value|4 f64) + (local $buffer|5 i32) + (local $sign|6 i32) + (local $isSinglePrecision|7 i32) (local $frc i64) + (local $exp i32) + (local $uv i32) + (local $sid i32) + (local $uv|12 i64) + (local $sid|13 i64) (local $f i64) (local $e i32) - (local $frc|12 i64) - (local $exp|13 i32) + (local $isSinglePrecision|16 i32) + (local $frc|17 i64) + (local $exp|18 i32) (local $off i32) (local $m i32) (local $minExp i32) (local $dk f64) (local $k i32) (local $index i32) - (local $off|20 i32) + (local $off|25 i32) (local $frc_pow i64) (local $exp_pow i32) (local $u i64) @@ -3806,28 +3810,28 @@ (local $e1 i32) (local $e2 i32) (local $w_exp i32) - (local $u|36 i64) - (local $v|37 i64) - (local $u0|38 i64) - (local $v0|39 i64) - (local $u1|40 i64) - (local $v1|41 i64) - (local $l|42 i64) - (local $t|43 i64) - (local $w|44 i64) + (local $u|41 i64) + (local $v|42 i64) + (local $u0|43 i64) + (local $v0|44 i64) + (local $u1|45 i64) + (local $v1|46 i64) + (local $l|47 i64) + (local $t|48 i64) + (local $w|49 i64) (local $wp_frc i64) - (local $e1|46 i32) - (local $e2|47 i32) + (local $e1|51 i32) + (local $e2|52 i32) (local $wp_exp i32) - (local $u|49 i64) - (local $v|50 i64) - (local $u0|51 i64) - (local $v0|52 i64) - (local $u1|53 i64) - (local $v1|54 i64) - (local $l|55 i64) - (local $t|56 i64) - (local $w|57 i64) + (local $u|54 i64) + (local $v|55 i64) + (local $u0|56 i64) + (local $v0|57 i64) + (local $u1|58 i64) + (local $v1|59 i64) + (local $l|60 i64) + (local $t|61 i64) + (local $w|62 i64) (local $wm_frc i64) (local $delta i64) (local $len i32) @@ -3846,77 +3850,123 @@ end block $~lib/util/number/grisu2|inlined.0 (result i32) local.get $value - local.set $value|3 + local.set $value|4 local.get $buffer - local.set $buffer|4 + local.set $buffer|5 local.get $sign - local.set $sign|5 - local.get $value|3 - i64.reinterpret_f64 - local.set $uv - local.get $uv - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $exp - local.get $uv - i64.const 4503599627370495 - i64.and - local.set $sid - local.get $exp - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $sid - i64.add - local.set $frc - local.get $exp - i32.const 1 - local.get $exp - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $exp + local.set $sign|6 + local.get $isSinglePrecision + local.set $isSinglePrecision|7 + local.get $isSinglePrecision|7 + if + local.get $value|4 + f32.demote_f64 + i32.reinterpret_f32 + local.set $uv + local.get $uv + i32.const 2139095040 + i32.and + i32.const 23 + i32.shr_u + local.set $exp + local.get $uv + i32.const 8388607 + i32.and + local.set $sid + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 23 + i64.shl + local.get $sid + i64.extend_i32_u + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 127 + i32.const 23 + i32.add + i32.sub + local.set $exp + else + local.get $value|4 + i64.reinterpret_f64 + local.set $uv|12 + local.get $uv|12 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $exp + local.get $uv|12 + i64.const 4503599627370495 + i64.and + local.set $sid|13 + local.get $exp + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $sid|13 + i64.add + local.set $frc + local.get $exp + i32.const 1 + local.get $exp + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $exp + end local.get $frc local.set $f local.get $exp local.set $e + local.get $isSinglePrecision|7 + local.set $isSinglePrecision|16 local.get $f i64.const 1 i64.shl i64.const 1 i64.add - local.set $frc|12 + local.set $frc|17 local.get $e i32.const 1 i32.sub - local.set $exp|13 - local.get $frc|12 + local.set $exp|18 + local.get $frc|17 i64.clz i32.wrap_i64 local.set $off - local.get $frc|12 + local.get $frc|17 local.get $off i64.extend_i32_s i64.shl - local.set $frc|12 - local.get $exp|13 + local.set $frc|17 + local.get $exp|18 local.get $off i32.sub - local.set $exp|13 + local.set $exp|18 i32.const 1 local.get $f - i64.const 4503599627370496 + local.get $isSinglePrecision|16 + if (result i64) + i64.const 8388608 + else + i64.const 4503599627370496 + end i64.eq i32.add local.set $m - local.get $frc|12 + local.get $frc|17 global.set $~lib/util/number/_frc_plus local.get $f local.get $m @@ -3927,12 +3977,12 @@ local.get $e local.get $m i32.sub - local.get $exp|13 + local.get $exp|18 i32.sub i64.extend_i32_s i64.shl global.set $~lib/util/number/_frc_minus - local.get $exp|13 + local.get $exp|18 global.set $~lib/util/number/_exp global.get $~lib/util/number/_exp local.set $minExp @@ -3984,14 +4034,14 @@ local.get $frc i64.clz i32.wrap_i64 - local.set $off|20 + local.set $off|25 local.get $frc - local.get $off|20 + local.get $off|25 i64.extend_i32_s i64.shl local.set $frc local.get $exp - local.get $off|20 + local.get $off|25 i32.sub local.set $exp global.get $~lib/util/number/_frc_pow @@ -4076,63 +4126,63 @@ local.set $w_exp block $~lib/util/number/umul64f|inlined.1 (result i64) global.get $~lib/util/number/_frc_plus - local.set $u|36 + local.set $u|41 local.get $frc_pow - local.set $v|37 - local.get $u|36 + local.set $v|42 + local.get $u|41 i64.const 4294967295 i64.and - local.set $u0|38 - local.get $v|37 + local.set $u0|43 + local.get $v|42 i64.const 4294967295 i64.and - local.set $v0|39 - local.get $u|36 + local.set $v0|44 + local.get $u|41 i64.const 32 i64.shr_u - local.set $u1|40 - local.get $v|37 + local.set $u1|45 + local.get $v|42 i64.const 32 i64.shr_u - local.set $v1|41 - local.get $u0|38 - local.get $v0|39 + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 i64.mul - local.set $l|42 - local.get $u1|40 - local.get $v0|39 + local.set $l|47 + local.get $u1|45 + local.get $v0|44 i64.mul - local.get $l|42 + local.get $l|47 i64.const 32 i64.shr_u i64.add - local.set $t|43 - local.get $u0|38 - local.get $v1|41 + local.set $t|48 + local.get $u0|43 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.const 4294967295 i64.and i64.add - local.set $w|44 - local.get $w|44 + local.set $w|49 + local.get $w|49 i64.const 2147483647 i64.add - local.set $w|44 - local.get $t|43 + local.set $w|49 + local.get $t|48 i64.const 32 i64.shr_u - local.set $t|43 - local.get $w|44 + local.set $t|48 + local.get $w|49 i64.const 32 i64.shr_u - local.set $w|44 - local.get $u1|40 - local.get $v1|41 + local.set $w|49 + local.get $u1|45 + local.get $v1|46 i64.mul - local.get $t|43 + local.get $t|48 i64.add - local.get $w|44 + local.get $w|49 i64.add br $~lib/util/number/umul64f|inlined.1 end @@ -4141,11 +4191,11 @@ local.set $wp_frc block $~lib/util/number/umul64e|inlined.1 (result i32) global.get $~lib/util/number/_exp - local.set $e1|46 + local.set $e1|51 local.get $exp_pow - local.set $e2|47 - local.get $e1|46 - local.get $e2|47 + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 i32.add i32.const 64 i32.add @@ -4154,63 +4204,63 @@ local.set $wp_exp block $~lib/util/number/umul64f|inlined.2 (result i64) global.get $~lib/util/number/_frc_minus - local.set $u|49 + local.set $u|54 local.get $frc_pow - local.set $v|50 - local.get $u|49 + local.set $v|55 + local.get $u|54 i64.const 4294967295 i64.and - local.set $u0|51 - local.get $v|50 + local.set $u0|56 + local.get $v|55 i64.const 4294967295 i64.and - local.set $v0|52 - local.get $u|49 + local.set $v0|57 + local.get $u|54 i64.const 32 i64.shr_u - local.set $u1|53 - local.get $v|50 + local.set $u1|58 + local.get $v|55 i64.const 32 i64.shr_u - local.set $v1|54 - local.get $u0|51 - local.get $v0|52 + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 i64.mul - local.set $l|55 - local.get $u1|53 - local.get $v0|52 + local.set $l|60 + local.get $u1|58 + local.get $v0|57 i64.mul - local.get $l|55 + local.get $l|60 i64.const 32 i64.shr_u i64.add - local.set $t|56 - local.get $u0|51 - local.get $v1|54 + local.set $t|61 + local.get $u0|56 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.const 4294967295 i64.and i64.add - local.set $w|57 - local.get $w|57 + local.set $w|62 + local.get $w|62 i64.const 2147483647 i64.add - local.set $w|57 - local.get $t|56 + local.set $w|62 + local.get $t|61 i64.const 32 i64.shr_u - local.set $t|56 - local.get $w|57 + local.set $t|61 + local.get $w|62 i64.const 32 i64.shr_u - local.set $w|57 - local.get $u1|53 - local.get $v1|54 + local.set $w|62 + local.get $u1|58 + local.get $v1|59 i64.mul - local.get $t|56 + local.get $t|61 i64.add - local.get $w|57 + local.get $w|62 i64.add br $~lib/util/number/umul64f|inlined.2 end @@ -4221,13 +4271,13 @@ local.get $wm_frc i64.sub local.set $delta - local.get $buffer|4 + local.get $buffer|5 local.get $w_frc local.get $w_exp local.get $wp_frc local.get $wp_exp local.get $delta - local.get $sign|5 + local.get $sign|6 call $~lib/util/number/genDigits br $~lib/util/number/grisu2|inlined.0 end @@ -4250,7 +4300,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa64 return ) (func $templateliteral/Ref#set:value (param $this i32) (param $value i32) @@ -6380,10 +6430,12 @@ local.get $14 return ) - (func $~lib/util/number/dtoa (param $value f64) (result i32) + (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (local $value|1 f64) + (local $isSinglePrecision i32) (local $size i32) (local $result i32) - (local $3 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -6392,76 +6444,66 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $value - f64.const 0 - f64.eq - if - i32.const 2752 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return - end - local.get $value - local.get $value - f64.sub - f64.const 0 - f64.eq - i32.eqz - if + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - local.get $value - f64.ne + local.set $value|1 + i32.const 0 + local.set $isSinglePrecision + local.get $value|1 + f64.const 0 + f64.eq if - i32.const 2784 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + i32.const 2752 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 2816 - i32.const 2864 - local.get $value + local.get $value|1 + local.get $value|1 + f64.sub f64.const 0 - f64.lt - select - local.set $3 + f64.eq + i32.eqz + if + local.get $value|1 + local.get $value|1 + f64.ne + if + i32.const 2784 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 2816 + i32.const 2864 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 2896 + local.get $value|1 + local.get $isSinglePrecision + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $size global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - return + local.get $size + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store + local.get $result + i32.const 2896 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 2896 - local.get $value - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 2896 - local.get $size - memory.copy - local.get $result - local.set $3 + local.set $5 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $3 + local.get $5 return ) ) diff --git a/tests/compiler/templateliteral.release.wat b/tests/compiler/templateliteral.release.wat index 556b3108ac..a2ded6a5ae 100644 --- a/tests/compiler/templateliteral.release.wat +++ b/tests/compiler/templateliteral.release.wat @@ -2962,41 +2962,25 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - block $__inlined_func$~lib/util/number/dtoa$79 + i32.const 3776 + local.set $1 + block $~lib/util/number/dtoa_impl|inlined.0 local.get $0 f64.const 0 f64.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 3776 - local.set $1 - br $__inlined_func$~lib/util/number/dtoa$79 - end + br_if $~lib/util/number/dtoa_impl|inlined.0 local.get $0 local.get $0 f64.sub f64.const 0 f64.ne if + i32.const 3808 + local.set $1 local.get $0 local.get $0 f64.ne - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 3808 - local.set $1 - br $__inlined_func$~lib/util/number/dtoa$79 - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer + br_if $~lib/util/number/dtoa_impl|inlined.0 i32.const 3840 i32.const 3888 local.get $0 @@ -3004,7 +2988,7 @@ f64.lt select local.set $1 - br $__inlined_func$~lib/util/number/dtoa$79 + br $~lib/util/number/dtoa_impl|inlined.0 end local.get $0 call $~lib/util/number/dtoa_core @@ -3021,11 +3005,11 @@ i32.const 3920 local.get $2 memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer local.get $1 ) (func $start:templateliteral From 65ebc460d7a1c6cde0f8b1976fb2e216128ecc4e Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 11:20:33 -0800 Subject: [PATCH 04/10] re-create test fixture on Linux --- tests/compiler/std/math.release.wat | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/compiler/std/math.release.wat b/tests/compiler/std/math.release.wat index bc8b278553..9e691da3f0 100644 --- a/tests/compiler/std/math.release.wat +++ b/tests/compiler/std/math.release.wat @@ -49901,7 +49901,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -49945,7 +49945,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -49967,7 +49967,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50033,7 +50033,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50099,7 +50099,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50165,7 +50165,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50253,7 +50253,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50363,7 +50363,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -50517,7 +50517,7 @@ call $~lib/builtins/abort unreachable end - f64.const nan:0x8000000000000 + f64.const -nan:0x8000000000000 f64.const nan:0x8000000000000 f64.const 0 call $std/math/check @@ -51749,7 +51749,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51775,7 +51775,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51788,7 +51788,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51827,7 +51827,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51866,7 +51866,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51905,7 +51905,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -51957,7 +51957,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -52022,7 +52022,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check @@ -52048,7 +52048,7 @@ call $~lib/builtins/abort unreachable end - f32.const nan:0x400000 + f32.const -nan:0x400000 f32.const nan:0x400000 f32.const 0 call $std/math/check From 91929af7b44281bb80a5653190bc065f669318c7 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 15:04:17 -0800 Subject: [PATCH 05/10] . --- std/assembly/util/number.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index c2df8b8c48..7e9eab6826 100644 --- a/std/assembly/util/number.ts +++ b/std/assembly/util/number.ts @@ -565,13 +565,13 @@ function grisu2(value: f64, buffer: usize, sign: i32, isSinglePrecision: bool): // frexp routine if (isSinglePrecision) { - let uv = reinterpret(value); + let uv = reinterpret(value); exp = (uv & 0x7F800000) >>> 23; let sid = uv & 0x007FFFFF; frc = (u64(exp != 0) << 23) + sid; exp = select(exp, 1, exp) - (0x7F + 23); } else { - let uv = reinterpret(value); + let uv = reinterpret(value); exp = i32((uv & 0x7FF0000000000000) >>> 52); let sid = uv & 0x000FFFFFFFFFFFFF; frc = (u64(exp != 0) << 52) + sid; From 09013bc221733d7da7d1425d8182f3d18dfdb8c9 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 17:04:55 -0800 Subject: [PATCH 06/10] . --- std/assembly/util/number.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index 7e9eab6826..70c0605bb7 100644 --- a/std/assembly/util/number.ts +++ b/std/assembly/util/number.ts @@ -511,14 +511,14 @@ function umul64e(e1: i32, e2: i32): i32 { // @ts-ignore: decorator @inline -function normalizedBoundaries(f: u64, e: i32, isSinglePrecision: bool): void { +function normalizedBoundaries(f: u64, e: i32, isSingle: bool): void { let frc = (f << 1) + 1; let exp = e - 1; let off = clz(frc); frc <<= off; exp -= off; - let m = 1 + i32(f == (isSinglePrecision ? 0x00800000 : 0x0010000000000000)); + let m = 1 + i32(f == (isSingle ? 0x00800000 : 0x0010000000000000)); _frc_plus = frc; _frc_minus = ((f << m) - 1) << e - m - exp; @@ -559,26 +559,26 @@ function getCachedPower(minExp: i32): void { // @ts-ignore: decorator @inline -function grisu2(value: f64, buffer: usize, sign: i32, isSinglePrecision: bool): i32 { +function grisu2(value: f64, buffer: usize, sign: i32, isSingle: bool): i32 { let frc: u64; let exp: i32; // frexp routine - if (isSinglePrecision) { + if (isSingle) { let uv = reinterpret(value); exp = (uv & 0x7F800000) >>> 23; let sid = uv & 0x007FFFFF; frc = (u64(exp != 0) << 23) + sid; - exp = select(exp, 1, exp) - (0x7F + 23); + exp = (exp || 1) - (0x7F + 23); } else { let uv = reinterpret(value); exp = i32((uv & 0x7FF0000000000000) >>> 52); let sid = uv & 0x000FFFFFFFFFFFFF; frc = (u64(exp != 0) << 52) + sid; - exp = select(exp, 1, exp) - (0x3FF + 52); + exp = (exp || 1) - (0x3FF + 52); } - normalizedBoundaries(frc, exp, isSinglePrecision); + normalizedBoundaries(frc, exp, isSingle); getCachedPower(_exp); // normalize @@ -726,14 +726,14 @@ function prettify(buffer: usize, length: i32, k: i32): i32 { } } -function dtoa_core(buffer: usize, value: f64, isSinglePrecision: bool): i32 { +function dtoa_core(buffer: usize, value: f64, isSingle: bool): i32 { let sign = i32(value < 0); if (sign) { value = -value; store(buffer, CharCode.MINUS); } - // assert(value > 0 && value <= (isSinglePrecision ? f32.MAX_VALUE : f64.MAX_VALUE)); - let len = grisu2(value, buffer, sign, isSinglePrecision); + // assert(value > 0 && value <= (isSingle ? f32.MAX_VALUE : f64.MAX_VALUE)); + let len = grisu2(value, buffer, sign, isSingle); len = prettify(buffer + (sign << 1), len - sign, _K); return len + sign; } @@ -760,13 +760,13 @@ export function dtoa64(value: f64): String { // @ts-ignore: decorator @inline -function dtoa_impl(value: f64, isSinglePrecision: bool): String { +function dtoa_impl(value: f64, isSingle: bool): String { if (value == 0) return "0.0"; if (!isFinite(value)) { if (isNaN(value)) return "NaN"; return select("-Infinity", "Infinity", value < 0); } - let size = dtoa_core(dtoa_buf, value, isSinglePrecision) << 1; + let size = dtoa_core(dtoa_buf, value, isSingle) << 1; let result = changetype(__new(size, idof())); memory.copy(changetype(result), dtoa_buf, size); return result; @@ -861,7 +861,7 @@ export function dtoa_buffered(buffer: usize, value: T): u32 { // @ts-ignore: decorator @inline -function dtoa_buffered_impl(buffer: usize, value: f64, isSinglePrecision: bool): u32 { +function dtoa_buffered_impl(buffer: usize, value: f64, isSingle: bool): u32 { if (value == 0) { store(buffer, CharCode._0); store(buffer, CharCode.DOT, 2); @@ -885,5 +885,5 @@ function dtoa_buffered_impl(buffer: usize, value: f64, isSinglePrecision: bool): return 8 + u32(sign); } } - return dtoa_core(buffer, value, isSinglePrecision); + return dtoa_core(buffer, value, isSingle); } From bf9a07bdd46a93619a71010439543c80ab43313f Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 17:06:36 -0800 Subject: [PATCH 07/10] . --- tests/compiler/issues/2873.debug.wat | 70 ++++++++++--------- tests/compiler/resolve-binary.debug.wat | 40 ++++++----- .../compiler/resolve-elementaccess.debug.wat | 40 ++++++----- tests/compiler/resolve-ternary.debug.wat | 40 ++++++----- tests/compiler/std/array.debug.wat | 46 ++++++------ tests/compiler/std/string.debug.wat | 58 ++++++++------- tests/compiler/std/typedarray.debug.wat | 58 ++++++++------- tests/compiler/templateliteral.debug.wat | 40 ++++++----- 8 files changed, 212 insertions(+), 180 deletions(-) diff --git a/tests/compiler/issues/2873.debug.wat b/tests/compiler/issues/2873.debug.wat index 8d0c6993a5..657a252353 100644 --- a/tests/compiler/issues/2873.debug.wat +++ b/tests/compiler/issues/2873.debug.wat @@ -1112,12 +1112,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -1126,7 +1126,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -1196,9 +1196,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -1225,9 +1225,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -1258,9 +1260,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -1271,8 +1275,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -1298,7 +1302,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -3977,7 +3981,7 @@ (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f32) (result i32) (local $buffer|2 i32) (local $value|3 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $sign i32) i32.const 4 i32.const 4 @@ -3990,7 +3994,7 @@ f64.promote_f32 local.set $value|3 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|3 f64.const 0 f64.eq @@ -4059,7 +4063,7 @@ end local.get $buffer|2 local.get $value|3 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core br $~lib/util/number/dtoa_buffered_impl|inlined.0 end @@ -4076,7 +4080,7 @@ (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) (local $buffer|2 i32) (local $value|3 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $sign i32) i32.const 8 i32.const 4 @@ -4088,7 +4092,7 @@ local.get $value local.set $value|3 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|3 f64.const 0 f64.eq @@ -4157,7 +4161,7 @@ end local.get $buffer|2 local.get $value|3 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core br $~lib/util/number/dtoa_buffered_impl|inlined.1 end @@ -5173,7 +5177,7 @@ ) (func $~lib/util/number/dtoa32 (param $value f32) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -5190,7 +5194,7 @@ f64.promote_f32 local.set $value|1 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -5222,7 +5226,7 @@ end i32.const 176 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -5250,7 +5254,7 @@ ) (func $~lib/util/number/dtoa64 (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -5266,7 +5270,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -5298,7 +5302,7 @@ end i32.const 176 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -5326,7 +5330,7 @@ ) (func $~lib/util/number/dtoa (param $value f32) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -5347,7 +5351,7 @@ f64.promote_f32 local.set $value|1 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -5379,7 +5383,7 @@ end i32.const 176 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -5407,7 +5411,7 @@ ) (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -5427,7 +5431,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -5459,7 +5463,7 @@ end i32.const 176 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/resolve-binary.debug.wat b/tests/compiler/resolve-binary.debug.wat index c1572dbfa2..193b2727b0 100644 --- a/tests/compiler/resolve-binary.debug.wat +++ b/tests/compiler/resolve-binary.debug.wat @@ -4727,12 +4727,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -4741,7 +4741,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -4811,9 +4811,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -4840,9 +4840,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -4873,9 +4875,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -4886,8 +4890,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -4913,7 +4917,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -7703,7 +7707,7 @@ ) (func $~lib/util/number/dtoa64 (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -7719,7 +7723,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -7751,7 +7755,7 @@ end i32.const 8704 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/resolve-elementaccess.debug.wat b/tests/compiler/resolve-elementaccess.debug.wat index d506be6355..0c1c12a8ef 100644 --- a/tests/compiler/resolve-elementaccess.debug.wat +++ b/tests/compiler/resolve-elementaccess.debug.wat @@ -3415,12 +3415,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -3429,7 +3429,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -3499,9 +3499,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -3528,9 +3528,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -3561,9 +3563,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -3574,8 +3578,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -3601,7 +3605,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -5309,7 +5313,7 @@ ) (func $~lib/util/number/dtoa32 (param $value f32) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -5326,7 +5330,7 @@ f64.promote_f32 local.set $value|1 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -5358,7 +5362,7 @@ end i32.const 752 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/resolve-ternary.debug.wat b/tests/compiler/resolve-ternary.debug.wat index 022a677121..3d54c1a709 100644 --- a/tests/compiler/resolve-ternary.debug.wat +++ b/tests/compiler/resolve-ternary.debug.wat @@ -3654,12 +3654,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -3668,7 +3668,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -3738,9 +3738,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -3767,9 +3767,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -3800,9 +3802,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -3813,8 +3817,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -3840,7 +3844,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -4758,7 +4762,7 @@ ) (func $~lib/util/number/dtoa64 (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -4774,7 +4778,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -4806,7 +4810,7 @@ end i32.const 2448 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/std/array.debug.wat b/tests/compiler/std/array.debug.wat index 6b082a6f6b..dd62271707 100644 --- a/tests/compiler/std/array.debug.wat +++ b/tests/compiler/std/array.debug.wat @@ -7663,12 +7663,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -7677,7 +7677,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -7747,9 +7747,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -7776,9 +7776,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -7809,9 +7811,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -7822,8 +7826,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -7849,7 +7853,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -8193,7 +8197,7 @@ (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) (local $buffer|2 i32) (local $value|3 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $sign i32) i32.const 8 i32.const 4 @@ -8205,7 +8209,7 @@ local.get $value local.set $value|3 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|3 f64.const 0 f64.eq @@ -8274,7 +8278,7 @@ end local.get $buffer|2 local.get $value|3 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core br $~lib/util/number/dtoa_buffered_impl|inlined.0 end @@ -46881,7 +46885,7 @@ ) (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -46901,7 +46905,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -46933,7 +46937,7 @@ end i32.const 11440 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/std/string.debug.wat b/tests/compiler/std/string.debug.wat index 91e1b529be..7d4c98a8ad 100644 --- a/tests/compiler/std/string.debug.wat +++ b/tests/compiler/std/string.debug.wat @@ -4932,12 +4932,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -4946,7 +4946,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -5016,9 +5016,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -5045,9 +5045,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -5078,9 +5080,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -5091,8 +5095,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -5118,7 +5122,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -29639,7 +29643,7 @@ ) (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -29659,7 +29663,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -29691,7 +29695,7 @@ end i32.const 22320 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -29719,7 +29723,7 @@ ) (func $~lib/util/number/dtoa (param $value f32) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -29740,7 +29744,7 @@ f64.promote_f32 local.set $value|1 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -29772,7 +29776,7 @@ end i32.const 22320 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -29800,7 +29804,7 @@ ) (func $~lib/util/number/dtoa (param $value i64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -29821,7 +29825,7 @@ f64.convert_i64_u local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -29853,7 +29857,7 @@ end i32.const 22320 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -29881,7 +29885,7 @@ ) (func $~lib/util/number/dtoa (param $value i32) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -29903,7 +29907,7 @@ f64.promote_f32 local.set $value|1 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -29935,7 +29939,7 @@ end i32.const 22320 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/std/typedarray.debug.wat b/tests/compiler/std/typedarray.debug.wat index 46525d53ab..2bc0756aa4 100644 --- a/tests/compiler/std/typedarray.debug.wat +++ b/tests/compiler/std/typedarray.debug.wat @@ -7732,12 +7732,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -7746,7 +7746,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -7816,9 +7816,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -7845,9 +7845,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -7878,9 +7880,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -7891,8 +7895,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -7918,7 +7922,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -8262,7 +8266,7 @@ (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f32) (result i32) (local $buffer|2 i32) (local $value|3 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $sign i32) i32.const 4 i32.const 4 @@ -8275,7 +8279,7 @@ f64.promote_f32 local.set $value|3 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|3 f64.const 0 f64.eq @@ -8344,7 +8348,7 @@ end local.get $buffer|2 local.get $value|3 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core br $~lib/util/number/dtoa_buffered_impl|inlined.0 end @@ -8353,7 +8357,7 @@ (func $~lib/util/number/dtoa_buffered (param $buffer i32) (param $value f64) (result i32) (local $buffer|2 i32) (local $value|3 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $sign i32) i32.const 8 i32.const 4 @@ -8365,7 +8369,7 @@ local.get $value local.set $value|3 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|3 f64.const 0 f64.eq @@ -8434,7 +8438,7 @@ end local.get $buffer|2 local.get $value|3 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core br $~lib/util/number/dtoa_buffered_impl|inlined.1 end @@ -93974,7 +93978,7 @@ ) (func $~lib/util/number/dtoa (param $value f32) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -93995,7 +93999,7 @@ f64.promote_f32 local.set $value|1 i32.const 1 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -94027,7 +94031,7 @@ end i32.const 8784 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl @@ -94055,7 +94059,7 @@ ) (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -94075,7 +94079,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -94107,7 +94111,7 @@ end i32.const 8784 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl diff --git a/tests/compiler/templateliteral.debug.wat b/tests/compiler/templateliteral.debug.wat index 795e5c6002..3dda967d00 100644 --- a/tests/compiler/templateliteral.debug.wat +++ b/tests/compiler/templateliteral.debug.wat @@ -3771,12 +3771,12 @@ end unreachable ) - (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSinglePrecision i32) (result i32) + (func $~lib/util/number/dtoa_core (param $buffer i32) (param $value f64) (param $isSingle i32) (result i32) (local $sign i32) (local $value|4 f64) (local $buffer|5 i32) (local $sign|6 i32) - (local $isSinglePrecision|7 i32) + (local $isSingle|7 i32) (local $frc i64) (local $exp i32) (local $uv i32) @@ -3785,7 +3785,7 @@ (local $sid|13 i64) (local $f i64) (local $e i32) - (local $isSinglePrecision|16 i32) + (local $isSingle|16 i32) (local $frc|17 i64) (local $exp|18 i32) (local $off i32) @@ -3855,9 +3855,9 @@ local.set $buffer|5 local.get $sign local.set $sign|6 - local.get $isSinglePrecision - local.set $isSinglePrecision|7 - local.get $isSinglePrecision|7 + local.get $isSingle + local.set $isSingle|7 + local.get $isSingle|7 if local.get $value|4 f32.demote_f64 @@ -3884,9 +3884,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 127 i32.const 23 i32.add @@ -3917,9 +3919,11 @@ i64.add local.set $frc local.get $exp - i32.const 1 - local.get $exp - select + if (result i32) + local.get $exp + else + i32.const 1 + end i32.const 1023 i32.const 52 i32.add @@ -3930,8 +3934,8 @@ local.set $f local.get $exp local.set $e - local.get $isSinglePrecision|7 - local.set $isSinglePrecision|16 + local.get $isSingle|7 + local.set $isSingle|16 local.get $f i64.const 1 i64.shl @@ -3957,7 +3961,7 @@ local.set $exp|18 i32.const 1 local.get $f - local.get $isSinglePrecision|16 + local.get $isSingle|16 if (result i64) i64.const 8388608 else @@ -6432,7 +6436,7 @@ ) (func $~lib/util/number/dtoa64 (param $value f64) (result i32) (local $value|1 f64) - (local $isSinglePrecision i32) + (local $isSingle i32) (local $size i32) (local $result i32) (local $5 i32) @@ -6448,7 +6452,7 @@ local.get $value local.set $value|1 i32.const 0 - local.set $isSinglePrecision + local.set $isSingle local.get $value|1 f64.const 0 f64.eq @@ -6480,7 +6484,7 @@ end i32.const 2896 local.get $value|1 - local.get $isSinglePrecision + local.get $isSingle call $~lib/util/number/dtoa_core i32.const 1 i32.shl From 55db7058ac7822de5fd2efc8bd4d1c40556260d6 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 17:10:48 -0800 Subject: [PATCH 08/10] remove dtoa32/dtoa64 --- std/assembly/number.ts | 6 +- std/assembly/util/number.ts | 8 - tests/compiler/issues/2873.debug.wat | 201 +--- tests/compiler/issues/2873.release.wat | 977 +++++++++--------- tests/compiler/resolve-binary.debug.wat | 8 +- .../compiler/resolve-elementaccess.debug.wat | 8 +- tests/compiler/resolve-ternary.debug.wat | 8 +- tests/compiler/templateliteral.debug.wat | 8 +- 8 files changed, 512 insertions(+), 712 deletions(-) diff --git a/std/assembly/number.ts b/std/assembly/number.ts index 589651c2fa..47a4a7a94f 100644 --- a/std/assembly/number.ts +++ b/std/assembly/number.ts @@ -1,4 +1,4 @@ -import { itoa32, utoa32, itoa64, utoa64, dtoa32, dtoa64 } from "./util/number"; +import { itoa32, utoa32, itoa64, utoa64, dtoa } from "./util/number"; import { strtol, strtod } from "./util/string"; // @ts-ignore: decorator @@ -315,7 +315,7 @@ export abstract class F32 { } toString(this: f32, radix: i32 = 0): String { - return dtoa32(this); + return dtoa(this); } } @@ -381,7 +381,7 @@ export abstract class F64 { } toString(this: f64, radix: i32 = 0): String { - return dtoa64(this); + return dtoa(this); } } diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index 70c0605bb7..6397fb1e52 100644 --- a/std/assembly/util/number.ts +++ b/std/assembly/util/number.ts @@ -750,14 +750,6 @@ export function dtoa(value: T): String { } } -export function dtoa32(value: f32): String { - return dtoa_impl(value, true); -} - -export function dtoa64(value: f64): String { - return dtoa_impl(value, false); -} - // @ts-ignore: decorator @inline function dtoa_impl(value: f64, isSingle: bool): String { diff --git a/tests/compiler/issues/2873.debug.wat b/tests/compiler/issues/2873.debug.wat index 657a252353..91aeb4ba0b 100644 --- a/tests/compiler/issues/2873.debug.wat +++ b/tests/compiler/issues/2873.debug.wat @@ -6,18 +6,18 @@ (type $4 (func)) (type $5 (func (param i32 i32 i32) (result i32))) (type $6 (func (param i32 i32 i32))) - (type $7 (func (param f32) (result i32))) - (type $8 (func (param f64) (result i32))) - (type $9 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) - (type $10 (func (param i32 f64 i32) (result i32))) - (type $11 (func (param i32 i32 i32 i32))) - (type $12 (func (param i32 i32 i64) (result i32))) - (type $13 (func (result i32))) - (type $14 (func (param f32 i32) (result i32))) - (type $15 (func (param i32 i32 i32 i32 i32) (result i32))) - (type $16 (func (param f64 i32) (result i32))) - (type $17 (func (param i32 f32) (result i32))) - (type $18 (func (param i32 f64) (result i32))) + (type $7 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $8 (func (param i32 f64 i32) (result i32))) + (type $9 (func (param i32 i32 i32 i32))) + (type $10 (func (param i32 i32 i64) (result i32))) + (type $11 (func (result i32))) + (type $12 (func (param f32 i32) (result i32))) + (type $13 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $14 (func (param f64 i32) (result i32))) + (type $15 (func (param i32 f32) (result i32))) + (type $16 (func (param i32 f64) (result i32))) + (type $17 (func (param f32) (result i32))) + (type $18 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/util/number/_frc_plus (mut i64) (i64.const 0)) (global $~lib/util/number/_frc_minus (mut i64) (i64.const 0)) @@ -3845,7 +3845,7 @@ ) (func $~lib/number/F32#toString (param $this f32) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa32 + call $~lib/util/number/dtoa return ) (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) @@ -3967,7 +3967,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa64 + call $~lib/util/number/dtoa return ) (func $~lib/array/Array#get:dataStart (param $this i32) (result i32) @@ -5175,159 +5175,6 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/util/number/dtoa32 (param $value f32) (result i32) - (local $value|1 f64) - (local $isSingle i32) - (local $size i32) - (local $result i32) - (local $5 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - block $~lib/util/number/dtoa_impl|inlined.0 (result i32) - local.get $value - f64.promote_f32 - local.set $value|1 - i32.const 1 - local.set $isSingle - local.get $value|1 - f64.const 0 - f64.eq - if - i32.const 32 - br $~lib/util/number/dtoa_impl|inlined.0 - end - local.get $value|1 - local.get $value|1 - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value|1 - local.get $value|1 - f64.ne - if - i32.const 64 - br $~lib/util/number/dtoa_impl|inlined.0 - end - i32.const 96 - i32.const 144 - local.get $value|1 - f64.const 0 - f64.lt - select - br $~lib/util/number/dtoa_impl|inlined.0 - end - i32.const 176 - local.get $value|1 - local.get $isSingle - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 176 - local.get $size - memory.copy - local.get $result - br $~lib/util/number/dtoa_impl|inlined.0 - end - local.set $5 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $5 - return - ) - (func $~lib/util/number/dtoa64 (param $value f64) (result i32) - (local $value|1 f64) - (local $isSingle i32) - (local $size i32) - (local $result i32) - (local $5 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - block $~lib/util/number/dtoa_impl|inlined.1 (result i32) - local.get $value - local.set $value|1 - i32.const 0 - local.set $isSingle - local.get $value|1 - f64.const 0 - f64.eq - if - i32.const 32 - br $~lib/util/number/dtoa_impl|inlined.1 - end - local.get $value|1 - local.get $value|1 - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value|1 - local.get $value|1 - f64.ne - if - i32.const 64 - br $~lib/util/number/dtoa_impl|inlined.1 - end - i32.const 96 - i32.const 144 - local.get $value|1 - f64.const 0 - f64.lt - select - br $~lib/util/number/dtoa_impl|inlined.1 - end - i32.const 176 - local.get $value|1 - local.get $isSingle - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 176 - local.get $size - memory.copy - local.get $result - br $~lib/util/number/dtoa_impl|inlined.1 - end - local.set $5 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $5 - return - ) (func $~lib/util/number/dtoa (param $value f32) (result i32) (local $value|1 f64) (local $isSingle i32) @@ -5346,7 +5193,7 @@ i32.const 4 i32.eq drop - block $~lib/util/number/dtoa_impl|inlined.2 (result i32) + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value f64.promote_f32 local.set $value|1 @@ -5357,7 +5204,7 @@ f64.eq if i32.const 32 - br $~lib/util/number/dtoa_impl|inlined.2 + br $~lib/util/number/dtoa_impl|inlined.0 end local.get $value|1 local.get $value|1 @@ -5371,7 +5218,7 @@ f64.ne if i32.const 64 - br $~lib/util/number/dtoa_impl|inlined.2 + br $~lib/util/number/dtoa_impl|inlined.0 end i32.const 96 i32.const 144 @@ -5379,7 +5226,7 @@ f64.const 0 f64.lt select - br $~lib/util/number/dtoa_impl|inlined.2 + br $~lib/util/number/dtoa_impl|inlined.0 end i32.const 176 local.get $value|1 @@ -5399,7 +5246,7 @@ local.get $size memory.copy local.get $result - br $~lib/util/number/dtoa_impl|inlined.2 + br $~lib/util/number/dtoa_impl|inlined.0 end local.set $5 global.get $~lib/memory/__stack_pointer @@ -5427,7 +5274,7 @@ i32.const 4 i32.eq drop - block $~lib/util/number/dtoa_impl|inlined.3 (result i32) + block $~lib/util/number/dtoa_impl|inlined.1 (result i32) local.get $value local.set $value|1 i32.const 0 @@ -5437,7 +5284,7 @@ f64.eq if i32.const 32 - br $~lib/util/number/dtoa_impl|inlined.3 + br $~lib/util/number/dtoa_impl|inlined.1 end local.get $value|1 local.get $value|1 @@ -5451,7 +5298,7 @@ f64.ne if i32.const 64 - br $~lib/util/number/dtoa_impl|inlined.3 + br $~lib/util/number/dtoa_impl|inlined.1 end i32.const 96 i32.const 144 @@ -5459,7 +5306,7 @@ f64.const 0 f64.lt select - br $~lib/util/number/dtoa_impl|inlined.3 + br $~lib/util/number/dtoa_impl|inlined.1 end i32.const 176 local.get $value|1 @@ -5479,7 +5326,7 @@ local.get $size memory.copy local.get $result - br $~lib/util/number/dtoa_impl|inlined.3 + br $~lib/util/number/dtoa_impl|inlined.1 end local.set $5 global.get $~lib/memory/__stack_pointer diff --git a/tests/compiler/issues/2873.release.wat b/tests/compiler/issues/2873.release.wat index 6f4a013fb6..aba1809221 100644 --- a/tests/compiler/issues/2873.release.wat +++ b/tests/compiler/issues/2873.release.wat @@ -1,7 +1,7 @@ (module - (type $0 (func (param i32 i32) (result i32))) - (type $1 (func)) - (type $2 (func (param i32))) + (type $0 (func)) + (type $1 (func (param i32))) + (type $2 (func (param i32 i32) (result i32))) (type $3 (func (param i32 i32))) (type $4 (func (param i32 i64 i64 i32 i64 i32) (result i32))) (type $5 (func (param i32 i32 i32))) @@ -13,6 +13,8 @@ (type $11 (func (param i32) (result i32))) (type $12 (func (param i32 f32) (result i32))) (type $13 (func (param i32 f64) (result i32))) + (type $14 (func (param f32) (result i32))) + (type $15 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/util/number/_frc_plus (mut i64) (i64.const 0)) (global $~lib/util/number/_frc_minus (mut i64) (i64.const 0)) @@ -1333,7 +1335,7 @@ local.get $0 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$142 + block $__inlined_func$~lib/rt/itcms/Object#unlink$138 local.get $1 i32.load offset=4 i32.const -4 @@ -1357,7 +1359,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$142 + br $__inlined_func$~lib/rt/itcms/Object#unlink$138 end local.get $1 i32.load offset=8 @@ -2961,6 +2963,11 @@ (func $~start (local $0 i32) (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $~lib/memory/__stack_pointer i32.const 16 i32.sub @@ -3008,37 +3015,9 @@ i32.store i32.const 2880 global.set $~lib/rt/itcms/fromSpace - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 3372 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - i32.const 1200 - f64.const 1.100000023841858 - i32.const 1 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - call $~lib/rt/itcms/__new - local.tee $1 - i32.store - local.get $1 - i32.const 1200 - local.get $0 - memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer + f32.const 1.100000023841858 + call $~lib/util/number/dtoa + local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 i32.store @@ -3057,37 +3036,9 @@ call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 3372 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - i32.const 1200 f64.const 1.1 - i32.const 0 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - call $~lib/rt/itcms/__new - local.tee $1 - i32.store - local.get $1 - i32.const 1200 - local.get $0 - memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer + call $~lib/util/number/dtoa + local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 i32.store @@ -3128,7 +3079,7 @@ i32.store i32.const 3108 i32.load - local.set $0 + local.set $3 global.get $~lib/memory/__stack_pointer i32.const 3104 i32.store @@ -3138,21 +3089,158 @@ global.get $~lib/memory/__stack_pointer i32.const 3184 i32.store - local.get $0 - local.get $1 - call $~lib/util/string/joinFloatArray - local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + block $__inlined_func$~lib/util/string/joinFloatArray$143 + local.get $1 + i32.const 1 + i32.sub + local.tee $4 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3152 + local.set $1 + br $__inlined_func$~lib/util/string/joinFloatArray$143 + end + local.get $4 + i32.eqz + if + local.get $3 + f32.load + call $~lib/util/number/dtoa + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$~lib/util/string/joinFloatArray$143 + end + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3180 + i32.load + i32.const 1 + i32.shr_u + local.tee $5 + i32.const 28 + i32.add + local.get $4 + i32.mul + i32.const 28 + i32.add + local.tee $6 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__new + local.tee $1 + i32.store offset=4 + loop $for-loop|0 + local.get $2 + local.get $4 + i32.lt_s + if + local.get $1 + local.get $0 + i32.const 1 + i32.shl + i32.add + local.get $3 + local.get $2 + i32.const 2 + i32.shl + i32.add + f32.load + call $~lib/util/number/dtoa_buffered + local.get $0 + i32.add + local.set $0 + local.get $5 + if + local.get $1 + local.get $0 + i32.const 1 + i32.shl + i32.add + i32.const 3184 + local.get $5 + i32.const 1 + i32.shl + memory.copy + local.get $0 + local.get $5 + i32.add + local.set $0 + end + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|0 + end + end + local.get $1 + local.get $0 + i32.const 1 + i32.shl + i32.add + local.get $3 + local.get $4 + i32.const 2 + i32.shl + i32.add + f32.load + call $~lib/util/number/dtoa_buffered + local.get $0 + i32.add + local.tee $0 + local.get $6 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + local.get $0 + call $~lib/string/String#substring + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$~lib/util/string/joinFloatArray$143 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + end global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $1 i32.store global.get $~lib/memory/__stack_pointer i32.const 3216 i32.store offset=4 - local.get $0 + local.get $1 i32.const 3216 call $~lib/string/String.__eq i32.eqz @@ -3186,57 +3274,198 @@ i32.store i32.const 3316 i32.load - local.set $0 + local.set $3 global.get $~lib/memory/__stack_pointer i32.const 3312 i32.store i32.const 3324 i32.load - local.set $1 + local.set $0 global.get $~lib/memory/__stack_pointer i32.const 3184 i32.store - local.get $0 - local.get $1 - call $~lib/util/string/joinFloatArray - local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add + i32.const 8 + i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store + i32.const 3372 + i32.lt_s + br_if $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 3216 - i32.store offset=4 - local.get $0 - i32.const 3216 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 3024 - i32.const 8 + i64.const 0 + i64.store + block $__inlined_func$~lib/util/string/joinFloatArray$144 + local.get $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 16 - i32.add - global.set $~lib/memory/__stack_pointer - return - end - i32.const 36160 - i32.const 36208 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + i32.sub + local.tee $4 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3152 + local.set $1 + br $__inlined_func$~lib/util/string/joinFloatArray$144 + end + local.get $4 + i32.eqz + if + local.get $3 + f64.load + call $~lib/util/number/dtoa + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$~lib/util/string/joinFloatArray$144 + end + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3180 + i32.load + i32.const 1 + i32.shr_u + local.tee $5 + i32.const 28 + i32.add + local.get $4 + i32.mul + i32.const 28 + i32.add + local.tee $6 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__new + local.tee $1 + i32.store offset=4 + i32.const 0 + local.set $0 + i32.const 0 + local.set $2 + loop $for-loop|01 + local.get $2 + local.get $4 + i32.lt_s + if + local.get $1 + local.get $0 + i32.const 1 + i32.shl + i32.add + local.get $3 + local.get $2 + i32.const 3 + i32.shl + i32.add + f64.load + call $~lib/util/number/dtoa_buffered + local.get $0 + i32.add + local.set $0 + local.get $5 + if + local.get $1 + local.get $0 + i32.const 1 + i32.shl + i32.add + i32.const 3184 + local.get $5 + i32.const 1 + i32.shl + memory.copy + local.get $0 + local.get $5 + i32.add + local.set $0 + end + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|01 + end + end + local.get $1 + local.get $0 + i32.const 1 + i32.shl + i32.add + local.get $3 + local.get $4 + i32.const 3 + i32.shl + i32.add + f64.load + call $~lib/util/number/dtoa_buffered + local.get $0 + i32.add + local.tee $0 + local.get $6 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + local.get $0 + call $~lib/string/String#substring + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$~lib/util/string/joinFloatArray$144 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3216 + i32.store offset=4 + local.get $1 + i32.const 3216 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 3024 + i32.const 8 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3348,7 +3577,7 @@ end end end - block $__inlined_func$~lib/util/string/compareImpl$84 + block $__inlined_func$~lib/util/string/compareImpl$82 loop $while-continue|1 local.get $0 local.tee $3 @@ -3368,7 +3597,7 @@ local.get $4 local.get $5 i32.ne - br_if $__inlined_func$~lib/util/string/compareImpl$84 + br_if $__inlined_func$~lib/util/string/compareImpl$82 local.get $2 i32.const 2 i32.add @@ -3503,424 +3732,92 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) - (func $~lib/util/string/joinFloatArray (param $0 i32) (param $1 i32) (result i32) + (func $~lib/util/number/dtoa (param $0 f32) (result i32) + (local $1 f64) (local $2 i32) - (local $3 f64) - (local $4 i32) - (local $5 f32) - (local $6 i32) - (local $7 i32) - (local $8 i32) + (local $3 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer - block $folding-inner1 - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 3372 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + if + i32.const 36160 + i32.const 36208 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1056 + local.set $2 + block $~lib/util/number/dtoa_impl|inlined.0 + local.get $0 + f64.promote_f32 + local.tee $1 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.0 + local.get $1 + local.get $1 + f64.sub + f64.const 0 + f64.ne + if + i32.const 1088 + local.set $2 local.get $1 - i32.const 1 - i32.sub - local.tee $8 - i32.const 0 - i32.lt_s - if - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 3152 - return - end - local.get $8 - i32.eqz - if - local.get $0 - f32.load - local.set $5 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 3372 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - i32.const 1056 - local.set $0 - block $~lib/util/number/dtoa_impl|inlined.2 - local.get $5 - f64.promote_f32 - local.tee $3 - f64.const 0 - f64.eq - br_if $~lib/util/number/dtoa_impl|inlined.2 - local.get $3 - local.get $3 - f64.sub - f64.const 0 - f64.ne - if - i32.const 1088 - local.set $0 - local.get $3 - local.get $3 - f64.ne - br_if $~lib/util/number/dtoa_impl|inlined.2 - i32.const 1120 - i32.const 1168 - local.get $3 - f64.const 0 - f64.lt - select - local.set $0 - br $~lib/util/number/dtoa_impl|inlined.2 - end - i32.const 1200 - local.get $3 - i32.const 1 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store - local.get $0 - i32.const 1200 - local.get $1 - memory.copy - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - br $folding-inner1 - end - global.get $~lib/memory/__stack_pointer - i32.const 3184 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3180 - i32.load - i32.const 1 - i32.shr_u - local.tee $1 - i32.const 28 - i32.add - local.get $8 - i32.mul - i32.const 28 - i32.add - local.tee $6 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__new - local.tee $7 - i32.store offset=4 - loop $for-loop|0 - local.get $4 - local.get $8 - i32.lt_s - if - local.get $7 - local.get $2 - i32.const 1 - i32.shl - i32.add - local.get $0 - local.get $4 - i32.const 2 - i32.shl - i32.add - f32.load - call $~lib/util/number/dtoa_buffered - local.get $2 - i32.add - local.set $2 - local.get $1 - if - local.get $7 - local.get $2 - i32.const 1 - i32.shl - i32.add - i32.const 3184 - local.get $1 - i32.const 1 - i32.shl - memory.copy - local.get $1 - local.get $2 - i32.add - local.set $2 - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - br $for-loop|0 - end - end - local.get $7 - local.get $2 - i32.const 1 - i32.shl - i32.add - local.get $0 - local.get $8 - i32.const 2 - i32.shl - i32.add - f32.load - call $~lib/util/number/dtoa_buffered - local.get $2 - i32.add - local.tee $0 - local.get $6 - i32.lt_s - if - global.get $~lib/memory/__stack_pointer - local.get $7 - i32.store - local.get $7 - local.get $0 - call $~lib/string/String#substring - local.set $0 - br $folding-inner1 - end - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $7 - return + local.get $1 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.0 + i32.const 1120 + i32.const 1168 + local.get $1 + f64.const 0 + f64.lt + select + local.set $2 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 36160 - i32.const 36208 + i32.const 1200 + local.get $1 i32.const 1 + call $~lib/util/number/dtoa_core i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shl + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + call $~lib/rt/itcms/__new + local.tee $2 + i32.store + local.get $2 + i32.const 1200 + local.get $3 + memory.copy end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $0 + local.get $2 ) - (func $~lib/util/string/joinFloatArray (param $0 i32) (param $1 i32) (result i32) + (func $~lib/util/number/dtoa (param $0 f64) (result i32) + (local $1 i32) (local $2 i32) - (local $3 f64) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer - block $folding-inner1 - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 3372 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - local.get $1 - i32.const 1 - i32.sub - local.tee $7 - i32.const 0 - i32.lt_s - if - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 3152 - return - end - local.get $7 - i32.eqz - if - local.get $0 - f64.load - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 3372 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - i32.const 1056 - local.set $0 - block $~lib/util/number/dtoa_impl|inlined.3 - local.get $3 - f64.const 0 - f64.eq - br_if $~lib/util/number/dtoa_impl|inlined.3 - local.get $3 - local.get $3 - f64.sub - f64.const 0 - f64.ne - if - i32.const 1088 - local.set $0 - local.get $3 - local.get $3 - f64.ne - br_if $~lib/util/number/dtoa_impl|inlined.3 - i32.const 1120 - i32.const 1168 - local.get $3 - f64.const 0 - f64.lt - select - local.set $0 - br $~lib/util/number/dtoa_impl|inlined.3 - end - i32.const 1200 - local.get $3 - i32.const 0 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store - local.get $0 - i32.const 1200 - local.get $1 - memory.copy - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - br $folding-inner1 - end - global.get $~lib/memory/__stack_pointer - i32.const 3184 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3180 - i32.load - i32.const 1 - i32.shr_u - local.tee $1 - i32.const 28 - i32.add - local.get $7 - i32.mul - i32.const 28 - i32.add - local.tee $5 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__new - local.tee $6 - i32.store offset=4 - loop $for-loop|0 - local.get $4 - local.get $7 - i32.lt_s - if - local.get $6 - local.get $2 - i32.const 1 - i32.shl - i32.add - local.get $0 - local.get $4 - i32.const 3 - i32.shl - i32.add - f64.load - call $~lib/util/number/dtoa_buffered - local.get $2 - i32.add - local.set $2 - local.get $1 - if - local.get $6 - local.get $2 - i32.const 1 - i32.shl - i32.add - i32.const 3184 - local.get $1 - i32.const 1 - i32.shl - memory.copy - local.get $1 - local.get $2 - i32.add - local.set $2 - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - br $for-loop|0 - end - end - local.get $6 - local.get $2 - i32.const 1 - i32.shl - i32.add - local.get $0 - local.get $7 - i32.const 3 - i32.shl - i32.add - f64.load - call $~lib/util/number/dtoa_buffered - local.get $2 - i32.add - local.tee $0 - local.get $5 - i32.lt_s - if - global.get $~lib/memory/__stack_pointer - local.get $6 - i32.store - local.get $6 - local.get $0 - call $~lib/string/String#substring - local.set $0 - br $folding-inner1 - end - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $6 - return - end + global.get $~lib/memory/__stack_pointer + i32.const 3372 + i32.lt_s + if i32.const 36160 i32.const 36208 i32.const 1 @@ -3929,9 +3826,57 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 0 + i32.store + i32.const 1056 + local.set $1 + block $~lib/util/number/dtoa_impl|inlined.1 + local.get $0 + f64.const 0 + f64.eq + br_if $~lib/util/number/dtoa_impl|inlined.1 + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.ne + if + i32.const 1088 + local.set $1 + local.get $0 + local.get $0 + f64.ne + br_if $~lib/util/number/dtoa_impl|inlined.1 + i32.const 1120 + i32.const 1168 + local.get $0 + f64.const 0 + f64.lt + select + local.set $1 + br $~lib/util/number/dtoa_impl|inlined.1 + end + i32.const 1200 + local.get $0 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + local.get $1 + i32.const 1200 + local.get $2 + memory.copy + end + global.get $~lib/memory/__stack_pointer + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $0 + local.get $1 ) ) diff --git a/tests/compiler/resolve-binary.debug.wat b/tests/compiler/resolve-binary.debug.wat index 193b2727b0..c499ae0dc6 100644 --- a/tests/compiler/resolve-binary.debug.wat +++ b/tests/compiler/resolve-binary.debug.wat @@ -5260,7 +5260,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa64 + call $~lib/util/number/dtoa return ) (func $~lib/math/ipow32 (param $x i32) (param $e i32) (result i32) @@ -7705,7 +7705,7 @@ local.get $14 return ) - (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) (local $isSingle i32) (local $size i32) @@ -7719,6 +7719,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 8 + i32.const 4 + i32.eq + drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/resolve-elementaccess.debug.wat b/tests/compiler/resolve-elementaccess.debug.wat index 0c1c12a8ef..a3a73756b3 100644 --- a/tests/compiler/resolve-elementaccess.debug.wat +++ b/tests/compiler/resolve-elementaccess.debug.wat @@ -3948,7 +3948,7 @@ ) (func $~lib/number/F32#toString (param $this f32) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa32 + call $~lib/util/number/dtoa return ) (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) @@ -5311,7 +5311,7 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/util/number/dtoa32 (param $value f32) (result i32) + (func $~lib/util/number/dtoa (param $value f32) (result i32) (local $value|1 f64) (local $isSingle i32) (local $size i32) @@ -5325,6 +5325,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 4 + i32.const 4 + i32.eq + drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value f64.promote_f32 diff --git a/tests/compiler/resolve-ternary.debug.wat b/tests/compiler/resolve-ternary.debug.wat index 3d54c1a709..42b9eaed57 100644 --- a/tests/compiler/resolve-ternary.debug.wat +++ b/tests/compiler/resolve-ternary.debug.wat @@ -4187,7 +4187,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa64 + call $~lib/util/number/dtoa return ) (func $start:resolve-ternary~anonymous|0 (param $x i32) (result i32) @@ -4760,7 +4760,7 @@ local.get $14 return ) - (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) (local $isSingle i32) (local $size i32) @@ -4774,6 +4774,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 8 + i32.const 4 + i32.eq + drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/templateliteral.debug.wat b/tests/compiler/templateliteral.debug.wat index 3dda967d00..786a425c9b 100644 --- a/tests/compiler/templateliteral.debug.wat +++ b/tests/compiler/templateliteral.debug.wat @@ -4304,7 +4304,7 @@ ) (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) local.get $this - call $~lib/util/number/dtoa64 + call $~lib/util/number/dtoa return ) (func $templateliteral/Ref#set:value (param $this i32) (param $value i32) @@ -6434,7 +6434,7 @@ local.get $14 return ) - (func $~lib/util/number/dtoa64 (param $value f64) (result i32) + (func $~lib/util/number/dtoa (param $value f64) (result i32) (local $value|1 f64) (local $isSingle i32) (local $size i32) @@ -6448,6 +6448,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 8 + i32.const 4 + i32.eq + drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 From 043c480386ee3133c8243ffcd689a86bfe59dac1 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 21:43:54 -0800 Subject: [PATCH 09/10] handle integers as f64, error for non-numeric types --- std/assembly/util/number.ts | 30 +- tests/compiler/issues/2873.debug.wat | 16 + tests/compiler/resolve-binary.debug.wat | 4 + .../compiler/resolve-elementaccess.debug.wat | 4 + tests/compiler/resolve-ternary.debug.wat | 4 + tests/compiler/std/array.debug.wat | 8 + tests/compiler/std/string.debug.wat | 313 +++------ tests/compiler/std/string.release.wat | 653 ++++++++---------- tests/compiler/std/string.ts | 7 +- tests/compiler/std/typedarray.debug.wat | 16 + tests/compiler/templateliteral.debug.wat | 4 + 11 files changed, 458 insertions(+), 601 deletions(-) diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index 6397fb1e52..a05a0fcd09 100644 --- a/std/assembly/util/number.ts +++ b/std/assembly/util/number.ts @@ -742,12 +742,19 @@ function dtoa_core(buffer: usize, value: f64, isSingle: bool): i32 { @lazy @inline const dtoa_buf = memory.data(MAX_DOUBLE_LENGTH << 1); export function dtoa(value: T): String { - // assert(isFloat()); - if (sizeof() == 4) { - return dtoa_impl(value, true); - } else { + if (isInteger()) { return dtoa_impl(value, false); } + + if (isFloat()) { + if (sizeof() == 4) { + return dtoa_impl(value, true); + } else { + return dtoa_impl(value, false); + } + } + + ERROR("dtoa: unsupported type"); } // @ts-ignore: decorator @@ -843,12 +850,19 @@ export function itoa_buffered(buffer: usize, value: T): u32 { } export function dtoa_buffered(buffer: usize, value: T): u32 { - // assert(isFloat()); - if (sizeof() == 4) { - return dtoa_buffered_impl(buffer, value, true); - } else { + if (isInteger()) { return dtoa_buffered_impl(buffer, value, false); } + + if (isFloat()) { + if (sizeof() == 4) { + return dtoa_buffered_impl(buffer, value, true); + } else { + return dtoa_buffered_impl(buffer, value, false); + } + } + + ERROR("dtoa_buffered: unsupported type"); } // @ts-ignore: decorator diff --git a/tests/compiler/issues/2873.debug.wat b/tests/compiler/issues/2873.debug.wat index 91aeb4ba0b..7859b10ece 100644 --- a/tests/compiler/issues/2873.debug.wat +++ b/tests/compiler/issues/2873.debug.wat @@ -3983,6 +3983,10 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) + i32.const 0 + drop + i32.const 1 + drop i32.const 4 i32.const 4 i32.eq @@ -4082,6 +4086,10 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq @@ -5189,6 +5197,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 4 i32.const 4 i32.eq @@ -5270,6 +5282,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq diff --git a/tests/compiler/resolve-binary.debug.wat b/tests/compiler/resolve-binary.debug.wat index c499ae0dc6..ab72efd4f3 100644 --- a/tests/compiler/resolve-binary.debug.wat +++ b/tests/compiler/resolve-binary.debug.wat @@ -7719,6 +7719,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq diff --git a/tests/compiler/resolve-elementaccess.debug.wat b/tests/compiler/resolve-elementaccess.debug.wat index a3a73756b3..fd5460b5d0 100644 --- a/tests/compiler/resolve-elementaccess.debug.wat +++ b/tests/compiler/resolve-elementaccess.debug.wat @@ -5325,6 +5325,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 4 i32.const 4 i32.eq diff --git a/tests/compiler/resolve-ternary.debug.wat b/tests/compiler/resolve-ternary.debug.wat index 42b9eaed57..753eb19d1b 100644 --- a/tests/compiler/resolve-ternary.debug.wat +++ b/tests/compiler/resolve-ternary.debug.wat @@ -4774,6 +4774,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq diff --git a/tests/compiler/std/array.debug.wat b/tests/compiler/std/array.debug.wat index dd62271707..7182b6b86e 100644 --- a/tests/compiler/std/array.debug.wat +++ b/tests/compiler/std/array.debug.wat @@ -8199,6 +8199,10 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq @@ -46897,6 +46901,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq diff --git a/tests/compiler/std/string.debug.wat b/tests/compiler/std/string.debug.wat index 7d4c98a8ad..55beae9ebb 100644 --- a/tests/compiler/std/string.debug.wat +++ b/tests/compiler/std/string.debug.wat @@ -11,14 +11,14 @@ (type $9 (func (param i32) (result f64))) (type $10 (func (result i32))) (type $11 (func (param i32 i64 i32))) - (type $12 (func (param i64) (result i32))) - (type $13 (func (param i32 i32) (result f64))) - (type $14 (func (param i32 i32) (result i64))) - (type $15 (func (param i32 i32 i32 i32 i32) (result i32))) - (type $16 (func (param i32 i32 i64) (result i32))) - (type $17 (func (param f64 i32) (result f64))) - (type $18 (func (param f64 f64) (result i32))) - (type $19 (func (param i32 i64 i32 i32))) + (type $12 (func (param i32 i32) (result f64))) + (type $13 (func (param i32 i32) (result i64))) + (type $14 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $15 (func (param i32 i32 i64) (result i32))) + (type $16 (func (param f64 i32) (result f64))) + (type $17 (func (param f64 f64) (result i32))) + (type $18 (func (param i32 i64 i32 i32))) + (type $19 (func (param i64) (result i32))) (type $20 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) (type $21 (func (param i32 f64 i32) (result i32))) (type $22 (func (param i32) (result f32))) @@ -70,10 +70,10 @@ (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) (global $~lib/builtins/f32.EPSILON f32 (f32.const 1.1920928955078125e-07)) (global $~lib/builtins/f32.MAX_VALUE f32 (f32.const 3402823466385288598117041e14)) - (global $~lib/rt/__rtti_base i32 (i32.const 25632)) - (global $~lib/memory/__data_end i32 (i32.const 25660)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 58428)) - (global $~lib/memory/__heap_base i32 (i32.const 58428)) + (global $~lib/rt/__rtti_base i32 (i32.const 25584)) + (global $~lib/memory/__data_end i32 (i32.const 25612)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 58380)) + (global $~lib/memory/__heap_base i32 (i32.const 58380)) (memory $0 1) (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g\00\00\00\00\00\00\00\00\00\00\00\00\00") (data $1 (i32.const 76) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00s\00t\00d\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00\00\00") @@ -529,29 +529,28 @@ (data $451 (i32.const 24460) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00-\003\000\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data $452 (i32.const 24508) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\001\00e\00-\003\002\003\00") (data $453 (i32.const 24540) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00-\001\00e\00-\003\002\003\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $454 (i32.const 24588) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008\00\00\00") - (data $455 (i32.const 24652) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006\00\00\00\00\00\00\00\00\00\00\00") - (data $456 (i32.const 24716) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\00\00\00\00\00\00\00\00\00") - (data $457 (i32.const 24780) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\001\002\00.\003\004\00\00\00") - (data $458 (i32.const 24812) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\00\00\00\00\00\00\00\00\00") - (data $459 (i32.const 24876) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $460 (i32.const 24956) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001\00\00\00\00\00\00\00\00\00\00\00") - (data $461 (i32.const 25004) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $462 (i32.const 25052) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00") - (data $463 (i32.const 25100) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $464 (i32.const 25148) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $465 (i32.const 25196) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $466 (i32.const 25244) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009\00\00\00\00\00\00\00") - (data $467 (i32.const 25292) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000\00\00\00\00\00") - (data $468 (i32.const 25340) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\004\002\009\004\009\006\007\003\000\000\00.\000\00\00\00\00\00") - (data $469 (i32.const 25388) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 \00") - (data $470 (i32.const 25420) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00W\00o\00r\00l\00d\00\00\00") - (data $471 (i32.const 25452) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d\00\00\00\00\00\00\00") - (data $472 (i32.const 25500) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00b\00a\00r\00\00\00\00\00\00\00") - (data $473 (i32.const 25532) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\c0\00\c8\00\00\00\00\00\00\00\00\00") - (data $474 (i32.const 25564) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\d8S\cf\91\00\00\00\00\00\00\00\00") - (data $475 (i32.const 25596) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df\00\00\00\00") - (data $476 (i32.const 25632) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A\00\00") + (data $454 (i32.const 24588) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000\00\00\00\00\00") + (data $455 (i32.const 24636) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008\00\00\00") + (data $456 (i32.const 24700) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006\00\00\00\00\00\00\00\00\00\00\00") + (data $457 (i32.const 24764) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\00\00\00\00\00\00\00\00\00") + (data $458 (i32.const 24828) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\001\002\00.\003\004\00\00\00") + (data $459 (i32.const 24860) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\00\00\00\00\00\00\00\00\00") + (data $460 (i32.const 24924) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $461 (i32.const 25004) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001\00\00\00\00\00\00\00\00\00\00\00") + (data $462 (i32.const 25052) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $463 (i32.const 25100) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008\00\00\00\00\00\00\00\00\00\00\00") + (data $464 (i32.const 25148) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $465 (i32.const 25196) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $466 (i32.const 25244) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $467 (i32.const 25292) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009\00\00\00\00\00\00\00") + (data $468 (i32.const 25340) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 \00") + (data $469 (i32.const 25372) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00W\00o\00r\00l\00d\00\00\00") + (data $470 (i32.const 25404) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d\00\00\00\00\00\00\00") + (data $471 (i32.const 25452) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00b\00a\00r\00\00\00\00\00\00\00") + (data $472 (i32.const 25484) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\c0\00\c8\00\00\00\00\00\00\00\00\00") + (data $473 (i32.const 25516) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\04\00\00\00\d8S\cf\91\00\00\00\00\00\00\00\00") + (data $474 (i32.const 25548) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df\00\00\00\00") + (data $475 (i32.const 25584) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "getString" (func $std/string/getString)) @@ -5633,8 +5632,8 @@ global.get $~lib/memory/__data_end i32.lt_s if + i32.const 58400 i32.const 58448 - i32.const 58496 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -28005,8 +28004,8 @@ call $~lib/builtins/abort unreachable end - f64.const 1.2312145673456234e-08 - call $~lib/util/number/dtoa + i32.const -24 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28028,14 +28027,14 @@ call $~lib/builtins/abort unreachable end - f64.const 555555555.5555556 + f64.const 1.2312145673456234e-08 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24672 + i32.const 24656 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28051,14 +28050,14 @@ call $~lib/builtins/abort unreachable end - f64.const 0.9999999999999999 + f64.const 555555555.5555556 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24736 + i32.const 24720 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28074,14 +28073,14 @@ call $~lib/builtins/abort unreachable end - f64.const 1 + f64.const 0.9999999999999999 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24032 + i32.const 24784 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28097,14 +28096,14 @@ call $~lib/builtins/abort unreachable end - f64.const 12.34 + f64.const 1 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24800 + i32.const 24032 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28120,16 +28119,14 @@ call $~lib/builtins/abort unreachable end - f64.const 1 - f64.const 3 - f64.div + f64.const 12.34 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24832 + i32.const 24848 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28145,14 +28142,16 @@ call $~lib/builtins/abort unreachable end - f64.const 1234e17 + f64.const 1 + f64.const 3 + f64.div call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24896 + i32.const 24880 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28168,14 +28167,14 @@ call $~lib/builtins/abort unreachable end - f64.const 1234e18 + f64.const 1234e17 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24976 + i32.const 24944 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28191,7 +28190,7 @@ call $~lib/builtins/abort unreachable end - f64.const 2.71828 + f64.const 1234e18 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer @@ -28214,7 +28213,7 @@ call $~lib/builtins/abort unreachable end - f64.const 0.0271828 + f64.const 2.71828 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer @@ -28237,7 +28236,7 @@ call $~lib/builtins/abort unreachable end - f64.const 271.828 + f64.const 0.0271828 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer @@ -28260,7 +28259,7 @@ call $~lib/builtins/abort unreachable end - f64.const 1.1e+128 + f64.const 271.828 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer @@ -28283,7 +28282,7 @@ call $~lib/builtins/abort unreachable end - f64.const 1.1e-64 + f64.const 1.1e+128 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer @@ -28306,7 +28305,7 @@ call $~lib/builtins/abort unreachable end - f64.const 0.000035689 + f64.const 1.1e-64 call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer @@ -28329,8 +28328,8 @@ call $~lib/builtins/abort unreachable end - i64.const 4294967272 - call $~lib/util/number/dtoa + f64.const 0.000035689 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28347,64 +28346,18 @@ if i32.const 0 i32.const 96 - i32.const 796 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const -24 - call $~lib/util/number/dtoa - local.set $55 - global.get $~lib/memory/__stack_pointer - local.get $55 - i32.store - local.get $55 - i32.const 25360 - local.set $55 - global.get $~lib/memory/__stack_pointer - local.get $55 - i32.store offset=4 - local.get $55 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 96 - i32.const 797 + i32.const 793 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const -24 - call $~lib/util/number/dtoa - local.set $55 - global.get $~lib/memory/__stack_pointer - local.get $55 - i32.store - local.get $55 i32.const 25360 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 - i32.store offset=4 - local.get $55 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 96 - i32.const 798 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 25408 - local.set $55 - global.get $~lib/memory/__stack_pointer - local.get $55 i32.store offset=8 local.get $55 - i32.const 25440 + i32.const 25392 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28416,7 +28369,7 @@ local.get $55 i32.store local.get $55 - i32.const 25472 + i32.const 25424 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28427,7 +28380,7 @@ if i32.const 0 i32.const 96 - i32.const 825 + i32.const 820 i32.const 1 call $~lib/builtins/abort unreachable @@ -28438,7 +28391,7 @@ local.get $55 i32.store offset=8 local.get $55 - i32.const 25520 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28450,7 +28403,7 @@ local.get $55 i32.store local.get $55 - i32.const 25520 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28461,12 +28414,12 @@ if i32.const 0 i32.const 96 - i32.const 826 + i32.const 821 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25520 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28484,7 +28437,7 @@ local.get $55 i32.store local.get $55 - i32.const 25520 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28495,7 +28448,7 @@ if i32.const 0 i32.const 96 - i32.const 827 + i32.const 822 i32.const 1 call $~lib/builtins/abort unreachable @@ -28529,18 +28482,18 @@ if i32.const 0 i32.const 96 - i32.const 828 + i32.const 823 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25552 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25552 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28551,18 +28504,18 @@ if i32.const 0 i32.const 96 - i32.const 836 + i32.const 831 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25552 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25552 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28573,18 +28526,18 @@ if i32.const 0 i32.const 96 - i32.const 837 + i32.const 832 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25584 + i32.const 25536 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25584 + i32.const 25536 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28595,18 +28548,18 @@ if i32.const 0 i32.const 96 - i32.const 838 + i32.const 833 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25616 + i32.const 25568 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25616 + i32.const 25568 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28617,7 +28570,7 @@ if i32.const 0 i32.const 96 - i32.const 839 + i32.const 834 i32.const 1 call $~lib/builtins/abort unreachable @@ -29655,6 +29608,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq @@ -29735,6 +29692,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 4 i32.const 4 i32.eq @@ -29802,7 +29763,7 @@ local.get $5 return ) - (func $~lib/util/number/dtoa (param $value i64) (result i32) + (func $~lib/util/number/dtoa (param $value i32) (result i32) (local $value|1 f64) (local $isSingle i32) (local $size i32) @@ -29816,13 +29777,11 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 8 - i32.const 4 - i32.eq + i32.const 1 drop block $~lib/util/number/dtoa_impl|inlined.2 (result i32) local.get $value - f64.convert_i64_u + f64.convert_i32_u local.set $value|1 i32.const 0 local.set $isSingle @@ -29883,86 +29842,4 @@ local.get $5 return ) - (func $~lib/util/number/dtoa (param $value i32) (result i32) - (local $value|1 f64) - (local $isSingle i32) - (local $size i32) - (local $result i32) - (local $5 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - i32.const 4 - i32.const 4 - i32.eq - drop - block $~lib/util/number/dtoa_impl|inlined.3 (result i32) - local.get $value - f32.convert_i32_u - f64.promote_f32 - local.set $value|1 - i32.const 1 - local.set $isSingle - local.get $value|1 - f64.const 0 - f64.eq - if - i32.const 22256 - br $~lib/util/number/dtoa_impl|inlined.3 - end - local.get $value|1 - local.get $value|1 - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $value|1 - local.get $value|1 - f64.ne - if - i32.const 6672 - br $~lib/util/number/dtoa_impl|inlined.3 - end - i32.const 7936 - i32.const 22288 - local.get $value|1 - f64.const 0 - f64.lt - select - br $~lib/util/number/dtoa_impl|inlined.3 - end - i32.const 22320 - local.get $value|1 - local.get $isSingle - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $size - global.get $~lib/memory/__stack_pointer - local.get $size - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $result - i32.store - local.get $result - i32.const 22320 - local.get $size - memory.copy - local.get $result - br $~lib/util/number/dtoa_impl|inlined.3 - end - local.set $5 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $5 - return - ) ) diff --git a/tests/compiler/std/string.release.wat b/tests/compiler/std/string.release.wat index 4dd9ea59bd..a18ea8e7a2 100644 --- a/tests/compiler/std/string.release.wat +++ b/tests/compiler/std/string.release.wat @@ -4,8 +4,8 @@ (type $2 (func (param i32) (result i32))) (type $3 (func)) (type $4 (func (param i32 i32))) - (type $5 (func (result i32))) - (type $6 (func (param i32))) + (type $5 (func (param i32))) + (type $6 (func (result i32))) (type $7 (func (param i32 i32 i32))) (type $8 (func (param i32 i32) (result f64))) (type $9 (func (param i32) (result f64))) @@ -41,7 +41,7 @@ (global $~lib/util/number/_K (mut i32) (i32.const 0)) (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 59452)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 59404)) (memory $0 1) (data $0 (i32.const 1036) "<") (data $0.1 (i32.const 1048) "\02\00\00\00 \00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g") @@ -938,51 +938,49 @@ (data $452.1 (i32.const 25544) "\02\00\00\00\0c\00\00\001\00e\00-\003\002\003") (data $453 (i32.const 25564) ",") (data $453.1 (i32.const 25576) "\02\00\00\00\0e\00\00\00-\001\00e\00-\003\002\003") - (data $454 (i32.const 25612) "<") - (data $454.1 (i32.const 25624) "\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008") - (data $455 (i32.const 25676) "<") - (data $455.1 (i32.const 25688) "\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006") - (data $456 (i32.const 25740) "<") - (data $456.1 (i32.const 25752) "\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009") - (data $457 (i32.const 25804) "\1c") - (data $457.1 (i32.const 25816) "\02\00\00\00\n\00\00\001\002\00.\003\004") - (data $458 (i32.const 25836) "<") - (data $458.1 (i32.const 25848) "\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003") - (data $459 (i32.const 25900) "L") - (data $459.1 (i32.const 25912) "\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000") - (data $460 (i32.const 25980) ",") - (data $460.1 (i32.const 25992) "\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001") + (data $454 (i32.const 25612) ",") + (data $454.1 (i32.const 25624) "\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000") + (data $455 (i32.const 25660) "<") + (data $455.1 (i32.const 25672) "\02\00\00\00*\00\00\001\00.\002\003\001\002\001\004\005\006\007\003\004\005\006\002\003\004\00e\00-\008") + (data $456 (i32.const 25724) "<") + (data $456.1 (i32.const 25736) "\02\00\00\00\"\00\00\005\005\005\005\005\005\005\005\005\00.\005\005\005\005\005\005\006") + (data $457 (i32.const 25788) "<") + (data $457.1 (i32.const 25800) "\02\00\00\00$\00\00\000\00.\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009") + (data $458 (i32.const 25852) "\1c") + (data $458.1 (i32.const 25864) "\02\00\00\00\n\00\00\001\002\00.\003\004") + (data $459 (i32.const 25884) "<") + (data $459.1 (i32.const 25896) "\02\00\00\00$\00\00\000\00.\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003") + (data $460 (i32.const 25948) "L") + (data $460.1 (i32.const 25960) "\02\00\00\00.\00\00\001\002\003\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00.\000") (data $461 (i32.const 26028) ",") - (data $461.1 (i32.const 26040) "\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008") + (data $461.1 (i32.const 26040) "\02\00\00\00\12\00\00\001\00.\002\003\004\00e\00+\002\001") (data $462 (i32.const 26076) ",") - (data $462.1 (i32.const 26088) "\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008") + (data $462.1 (i32.const 26088) "\02\00\00\00\0e\00\00\002\00.\007\001\008\002\008") (data $463 (i32.const 26124) ",") - (data $463.1 (i32.const 26136) "\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008") + (data $463.1 (i32.const 26136) "\02\00\00\00\12\00\00\000\00.\000\002\007\001\008\002\008") (data $464 (i32.const 26172) ",") - (data $464.1 (i32.const 26184) "\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008") + (data $464.1 (i32.const 26184) "\02\00\00\00\0e\00\00\002\007\001\00.\008\002\008") (data $465 (i32.const 26220) ",") - (data $465.1 (i32.const 26232) "\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004") + (data $465.1 (i32.const 26232) "\02\00\00\00\10\00\00\001\00.\001\00e\00+\001\002\008") (data $466 (i32.const 26268) ",") - (data $466.1 (i32.const 26280) "\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009") + (data $466.1 (i32.const 26280) "\02\00\00\00\0e\00\00\001\00.\001\00e\00-\006\004") (data $467 (i32.const 26316) ",") - (data $467.1 (i32.const 26328) "\02\00\00\00\18\00\00\004\002\009\004\009\006\007\002\007\002\00.\000") - (data $468 (i32.const 26364) ",") - (data $468.1 (i32.const 26376) "\02\00\00\00\18\00\00\004\002\009\004\009\006\007\003\000\000\00.\000") - (data $469 (i32.const 26412) "\1c") - (data $469.1 (i32.const 26424) "\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 ") - (data $470 (i32.const 26444) "\1c") - (data $470.1 (i32.const 26456) "\02\00\00\00\n\00\00\00W\00o\00r\00l\00d") - (data $471 (i32.const 26476) ",") - (data $471.1 (i32.const 26488) "\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d") - (data $472 (i32.const 26524) "\1c") - (data $472.1 (i32.const 26536) "\02\00\00\00\06\00\00\00b\00a\00r") - (data $473 (i32.const 26556) "\1c") - (data $473.1 (i32.const 26568) "\02\00\00\00\04\00\00\00\c0\00\c8") - (data $474 (i32.const 26588) "\1c") - (data $474.1 (i32.const 26600) "\02\00\00\00\04\00\00\00\d8S\cf\91") - (data $475 (i32.const 26620) "\1c") - (data $475.1 (i32.const 26632) "\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df") - (data $476 (i32.const 26656) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A") + (data $467.1 (i32.const 26328) "\02\00\00\00\16\00\00\000\00.\000\000\000\000\003\005\006\008\009") + (data $468 (i32.const 26364) "\1c") + (data $468.1 (i32.const 26376) "\02\00\00\00\0c\00\00\00H\00e\00l\00l\00o\00 ") + (data $469 (i32.const 26396) "\1c") + (data $469.1 (i32.const 26408) "\02\00\00\00\n\00\00\00W\00o\00r\00l\00d") + (data $470 (i32.const 26428) ",") + (data $470.1 (i32.const 26440) "\02\00\00\00\16\00\00\00H\00e\00l\00l\00o\00 \00W\00o\00r\00l\00d") + (data $471 (i32.const 26476) "\1c") + (data $471.1 (i32.const 26488) "\02\00\00\00\06\00\00\00b\00a\00r") + (data $472 (i32.const 26508) "\1c") + (data $472.1 (i32.const 26520) "\02\00\00\00\04\00\00\00\c0\00\c8") + (data $473 (i32.const 26540) "\1c") + (data $473.1 (i32.const 26552) "\02\00\00\00\04\00\00\00\d8S\cf\91") + (data $474 (i32.const 26572) "\1c") + (data $474.1 (i32.const 26584) "\02\00\00\00\08\00\00\00A\d8\0e\dfA\d81\df") + (data $475 (i32.const 26608) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\02\t\00\00\02A") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $~start) @@ -1151,7 +1149,7 @@ local.get $1 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$288 + block $__inlined_func$~lib/rt/itcms/Object#unlink$287 local.get $0 i32.load offset=4 i32.const -4 @@ -1163,7 +1161,7 @@ i32.load offset=8 i32.eqz local.get $0 - i32.const 59452 + i32.const 59404 i32.lt_u i32.and i32.eqz @@ -1175,7 +1173,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$288 + br $__inlined_func$~lib/rt/itcms/Object#unlink$287 end local.get $0 i32.load offset=8 @@ -1212,7 +1210,7 @@ i32.const 1 else local.get $1 - i32.const 26656 + i32.const 26608 i32.load i32.gt_u if @@ -1226,7 +1224,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 26660 + i32.const 26612 i32.add i32.load i32.const 32 @@ -1810,10 +1808,10 @@ if unreachable end - i32.const 59456 + i32.const 59408 i32.const 0 i32.store - i32.const 61024 + i32.const 60976 i32.const 0 i32.store loop $for-loop|0 @@ -1824,7 +1822,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 59456 + i32.const 59408 i32.add i32.const 0 i32.store offset=4 @@ -1842,7 +1840,7 @@ i32.add i32.const 2 i32.shl - i32.const 59456 + i32.const 59408 i32.add i32.const 0 i32.store offset=96 @@ -1860,14 +1858,14 @@ br $for-loop|0 end end - i32.const 59456 - i32.const 61028 + i32.const 59408 + i32.const 60980 memory.size i64.extend_i32_s i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - i32.const 59456 + i32.const 59408 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1952,7 +1950,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 59452 + i32.const 59404 i32.lt_u if local.get $0 @@ -2048,7 +2046,7 @@ unreachable end local.get $0 - i32.const 59452 + i32.const 59404 i32.lt_u if local.get $0 @@ -2071,7 +2069,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 59452 + i32.const 59404 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -4304,7 +4302,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4317,7 +4315,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4362,8 +4360,8 @@ end unreachable end + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4390,11 +4388,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4476,11 +4474,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4541,11 +4539,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4599,11 +4597,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4640,11 +4638,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4674,11 +4672,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4747,11 +4745,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4865,11 +4863,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4991,11 +4989,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5122,11 +5120,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5244,11 +5242,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5295,11 +5293,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5383,11 +5381,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5539,11 +5537,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5693,11 +5691,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5942,11 +5940,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6182,11 +6180,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6524,11 +6522,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6570,11 +6568,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7394,11 +7392,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7435,11 +7433,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7738,11 +7736,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8036,11 +8034,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8109,11 +8107,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8144,11 +8142,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8182,11 +8180,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8276,11 +8274,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8367,11 +8365,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8403,11 +8401,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8442,11 +8440,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8563,11 +8561,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8730,11 +8728,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9094,11 +9092,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9203,11 +9201,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9250,11 +9248,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9342,11 +9340,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9390,11 +9388,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9507,11 +9505,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9555,11 +9553,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9653,11 +9651,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9721,7 +9719,7 @@ block $folding-inner1 block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -9750,7 +9748,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10046,8 +10044,8 @@ local.get $9 return end + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10079,11 +10077,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10130,11 +10128,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10201,7 +10199,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10302,7 +10300,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10311,7 +10309,7 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store - block $__inlined_func$~lib/string/String#charCodeAt$295 + block $__inlined_func$~lib/string/String#charCodeAt$294 local.get $0 i32.const 20 i32.sub @@ -10326,7 +10324,7 @@ global.set $~lib/memory/__stack_pointer i32.const -1 local.set $0 - br $__inlined_func$~lib/string/String#charCodeAt$295 + br $__inlined_func$~lib/string/String#charCodeAt$294 end local.get $0 i32.load16_u @@ -10356,7 +10354,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10365,7 +10363,7 @@ global.get $~lib/memory/__stack_pointer local.get $4 i32.store - block $__inlined_func$~lib/string/String#codePointAt$296 + block $__inlined_func$~lib/string/String#codePointAt$295 local.get $4 i32.const 20 i32.sub @@ -10382,7 +10380,7 @@ global.set $~lib/memory/__stack_pointer i32.const -1 local.set $0 - br $__inlined_func$~lib/string/String#codePointAt$296 + br $__inlined_func$~lib/string/String#codePointAt$295 end local.get $0 i32.const 2 @@ -10400,7 +10398,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/string/String#codePointAt$296 + br $__inlined_func$~lib/string/String#codePointAt$295 end local.get $4 i32.load16_u offset=4 @@ -10414,7 +10412,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/string/String#codePointAt$296 + br $__inlined_func$~lib/string/String#codePointAt$295 end global.get $~lib/memory/__stack_pointer i32.const 4 @@ -10443,7 +10441,7 @@ memory.size i32.const 16 i32.shl - i32.const 59452 + i32.const 59404 i32.sub i32.const 1 i32.shr_u @@ -10904,7 +10902,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10923,7 +10921,7 @@ global.get $~lib/memory/__stack_pointer i32.const 2176 i32.store - block $__inlined_func$~lib/string/String#startsWith$297 + block $__inlined_func$~lib/string/String#startsWith$296 local.get $4 i32.const 2172 i32.load @@ -10938,7 +10936,7 @@ global.set $~lib/memory/__stack_pointer i32.const 0 local.set $0 - br $__inlined_func$~lib/string/String#startsWith$297 + br $__inlined_func$~lib/string/String#startsWith$296 end global.get $~lib/memory/__stack_pointer local.get $0 @@ -10982,7 +10980,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10999,7 +10997,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -11018,7 +11016,7 @@ global.get $~lib/memory/__stack_pointer i32.const 2208 i32.store - block $__inlined_func$~lib/string/String#endsWith$298 + block $__inlined_func$~lib/string/String#endsWith$297 i32.const 536870910 local.get $4 local.get $4 @@ -11041,7 +11039,7 @@ global.set $~lib/memory/__stack_pointer i32.const 0 local.set $0 - br $__inlined_func$~lib/string/String#endsWith$298 + br $__inlined_func$~lib/string/String#endsWith$297 end global.get $~lib/memory/__stack_pointer local.get $0 @@ -11087,7 +11085,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13257,7 +13255,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13348,7 +13346,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13399,7 +13397,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -24001,16 +23999,44 @@ call $~lib/builtins/abort unreachable end - f64.const 1.2312145673456234e-08 - call $~lib/util/number/dtoa + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 26636 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + f64.const 4294967272 + i32.const 0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $4 + i32.store + local.get $4 + i32.const 23344 + local.get $0 + memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $4 i32.store global.get $~lib/memory/__stack_pointer i32.const 25632 i32.store offset=4 - local.get $0 + local.get $4 i32.const 25632 call $~lib/string/String.__eq i32.eqz @@ -24022,17 +24048,17 @@ call $~lib/builtins/abort unreachable end - f64.const 555555555.5555556 + f64.const 1.2312145673456234e-08 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25696 + i32.const 25680 i32.store offset=4 local.get $0 - i32.const 25696 + i32.const 25680 call $~lib/string/String.__eq i32.eqz if @@ -24043,17 +24069,17 @@ call $~lib/builtins/abort unreachable end - f64.const 0.9999999999999999 + f64.const 555555555.5555556 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25760 + i32.const 25744 i32.store offset=4 local.get $0 - i32.const 25760 + i32.const 25744 call $~lib/string/String.__eq i32.eqz if @@ -24064,17 +24090,17 @@ call $~lib/builtins/abort unreachable end - f64.const 1 + f64.const 0.9999999999999999 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25056 + i32.const 25808 i32.store offset=4 local.get $0 - i32.const 25056 + i32.const 25808 call $~lib/string/String.__eq i32.eqz if @@ -24085,17 +24111,17 @@ call $~lib/builtins/abort unreachable end - f64.const 12.34 + f64.const 1 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25824 + i32.const 25056 i32.store offset=4 local.get $0 - i32.const 25824 + i32.const 25056 call $~lib/string/String.__eq i32.eqz if @@ -24106,17 +24132,17 @@ call $~lib/builtins/abort unreachable end - f64.const 0.3333333333333333 + f64.const 12.34 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25856 + i32.const 25872 i32.store offset=4 local.get $0 - i32.const 25856 + i32.const 25872 call $~lib/string/String.__eq i32.eqz if @@ -24127,17 +24153,17 @@ call $~lib/builtins/abort unreachable end - f64.const 1234e17 + f64.const 0.3333333333333333 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 25920 + i32.const 25904 i32.store offset=4 local.get $0 - i32.const 25920 + i32.const 25904 call $~lib/string/String.__eq i32.eqz if @@ -24148,17 +24174,17 @@ call $~lib/builtins/abort unreachable end - f64.const 1234e18 + f64.const 1234e17 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26000 + i32.const 25968 i32.store offset=4 local.get $0 - i32.const 26000 + i32.const 25968 call $~lib/string/String.__eq i32.eqz if @@ -24169,7 +24195,7 @@ call $~lib/builtins/abort unreachable end - f64.const 2.71828 + f64.const 1234e18 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer @@ -24190,7 +24216,7 @@ call $~lib/builtins/abort unreachable end - f64.const 0.0271828 + f64.const 2.71828 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer @@ -24211,7 +24237,7 @@ call $~lib/builtins/abort unreachable end - f64.const 271.828 + f64.const 0.0271828 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer @@ -24232,7 +24258,7 @@ call $~lib/builtins/abort unreachable end - f64.const 1.1e+128 + f64.const 271.828 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer @@ -24253,7 +24279,7 @@ call $~lib/builtins/abort unreachable end - f64.const 1.1e-64 + f64.const 1.1e+128 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer @@ -24274,7 +24300,7 @@ call $~lib/builtins/abort unreachable end - f64.const 0.000035689 + f64.const 1.1e-64 call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer @@ -24295,119 +24321,51 @@ call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 26684 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - f64.const 4294967272 - i32.const 0 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl + f64.const 0.000035689 + call $~lib/util/number/dtoa local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $4 - i32.store - local.get $4 - i32.const 23344 - local.get $0 - memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - local.get $4 i32.store global.get $~lib/memory/__stack_pointer i32.const 26336 i32.store offset=4 - local.get $4 - i32.const 26336 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1120 - i32.const 796 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $~lib/util/number/dtoa - local.set $0 - global.get $~lib/memory/__stack_pointer local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 26384 - i32.store offset=4 - local.get $0 - i32.const 26384 + i32.const 26336 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 797 + i32.const 793 i32.const 1 call $~lib/builtins/abort unreachable end - call $~lib/util/number/dtoa - local.set $0 global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 26384 - i32.store offset=4 - local.get $0 i32.const 26384 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1120 - i32.const 798 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 26432 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 26464 + i32.const 26416 i32.store offset=12 - i32.const 26432 - i32.const 26464 + i32.const 26384 + i32.const 26416 call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26496 + i32.const 26448 i32.store offset=4 local.get $0 - i32.const 26496 + i32.const 26448 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 825 + i32.const 820 i32.const 1 call $~lib/builtins/abort unreachable @@ -24416,37 +24374,37 @@ i32.const 1712 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 26544 + i32.const 26496 i32.store offset=12 i32.const 1712 - i32.const 26544 + i32.const 26496 call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26544 + i32.const 26496 i32.store offset=4 local.get $0 - i32.const 26544 + i32.const 26496 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 826 + i32.const 821 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26544 + i32.const 26496 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1712 i32.store offset=12 - i32.const 26544 + i32.const 26496 i32.const 1712 call $~lib/string/String#concat local.set $0 @@ -24454,16 +24412,16 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26544 + i32.const 26496 i32.store offset=4 local.get $0 - i32.const 26544 + i32.const 26496 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 827 + i32.const 822 i32.const 1 call $~lib/builtins/abort unreachable @@ -24491,86 +24449,86 @@ if i32.const 0 i32.const 1120 - i32.const 828 + i32.const 823 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26576 + i32.const 26528 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26576 + i32.const 26528 i32.store offset=4 - i32.const 26576 - i32.const 26576 + i32.const 26528 + i32.const 26528 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 836 + i32.const 831 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26576 + i32.const 26528 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26576 + i32.const 26528 i32.store offset=4 - i32.const 26576 - i32.const 26576 + i32.const 26528 + i32.const 26528 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 837 + i32.const 832 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26608 + i32.const 26560 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26608 + i32.const 26560 i32.store offset=4 - i32.const 26608 - i32.const 26608 + i32.const 26560 + i32.const 26560 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 838 + i32.const 833 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26640 + i32.const 26592 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26640 + i32.const 26592 i32.store offset=4 - i32.const 26640 - i32.const 26640 + i32.const 26592 + i32.const 26592 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 839 + i32.const 834 i32.const 1 call $~lib/builtins/abort unreachable end i32.const 0 global.set $std/string/str - i32.const 59452 + i32.const 59404 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -24611,8 +24569,8 @@ global.set $~lib/memory/__stack_pointer return end + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24626,11 +24584,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24674,11 +24632,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24739,11 +24697,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24817,11 +24775,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25120,11 +25078,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25391,11 +25349,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25729,11 +25687,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -26100,11 +26058,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -26173,11 +26131,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26684 + i32.const 26636 i32.lt_s if + i32.const 59424 i32.const 59472 - i32.const 59520 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -26239,47 +26197,4 @@ global.set $~lib/memory/__stack_pointer local.get $2 ) - (func $~lib/util/number/dtoa (result i32) - (local $0 i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 26684 - i32.lt_s - if - i32.const 59472 - i32.const 59520 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - f64.const 4294967296 - i32.const 1 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $1 - i32.store - local.get $1 - i32.const 23344 - local.get $0 - memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - ) ) diff --git a/tests/compiler/std/string.ts b/tests/compiler/std/string.ts index dd93d26805..df5b2d5443 100644 --- a/tests/compiler/std/string.ts +++ b/tests/compiler/std/string.ts @@ -776,6 +776,7 @@ assert(dtoa(1e-323) == "1e-323"); assert(dtoa(-1e-323) == "-1e-323"); assert(dtoa(1e-324) == "0.0"); +assert(dtoa(4294967272) == "4294967272.0"); assert(dtoa(1.23121456734562345678e-8) == "1.2312145673456234e-8"); assert(dtoa(555555555.55555555) == "555555555.5555556"); assert(dtoa(0.9999999999999999) == "0.9999999999999999"); @@ -791,12 +792,6 @@ assert(dtoa(1.1e+128) == "1.1e+128"); assert(dtoa(1.1e-64) == "1.1e-64"); assert(dtoa(0.000035689) == "0.000035689"); -// The following demonstrates behavior that may seem surprising, but is consistent with the -// IEEE 754 standard and behaves the same way in other languages that have 32-bit floating point numbers. -assert(dtoa(4294967272) == "4294967272.0"); // u64 -> f64, no loss of precision -assert(dtoa(4294967272) == "4294967300.0"); // u32 -> f32, loss of precision is expected -assert(dtoa(4294967272) == "4294967300.0"); // default integer literal is 32-bit, so loss of precision is expected - // FIXME: The following are imprecise rounding issues for Grisu algorithm. Need workaround. // Expected: 1.2345e+21 diff --git a/tests/compiler/std/typedarray.debug.wat b/tests/compiler/std/typedarray.debug.wat index 2bc0756aa4..85a15e9912 100644 --- a/tests/compiler/std/typedarray.debug.wat +++ b/tests/compiler/std/typedarray.debug.wat @@ -8268,6 +8268,10 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) + i32.const 0 + drop + i32.const 1 + drop i32.const 4 i32.const 4 i32.eq @@ -8359,6 +8363,10 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq @@ -93990,6 +93998,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 4 i32.const 4 i32.eq @@ -94071,6 +94083,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq diff --git a/tests/compiler/templateliteral.debug.wat b/tests/compiler/templateliteral.debug.wat index 786a425c9b..a15c6f55c4 100644 --- a/tests/compiler/templateliteral.debug.wat +++ b/tests/compiler/templateliteral.debug.wat @@ -6448,6 +6448,10 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 0 + drop + i32.const 1 + drop i32.const 8 i32.const 4 i32.eq From 9e8cba571ebcebaacbec7d93f3f5309543156c58 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Thu, 6 Feb 2025 22:02:18 -0800 Subject: [PATCH 10/10] simplify --- std/assembly/util/number.ts | 30 +++-------------- tests/compiler/issues/2873.debug.wat | 32 ------------------- tests/compiler/resolve-binary.debug.wat | 8 ----- .../compiler/resolve-elementaccess.debug.wat | 8 ----- tests/compiler/resolve-ternary.debug.wat | 8 ----- tests/compiler/std/array.debug.wat | 16 ---------- tests/compiler/std/string.debug.wat | 18 ----------- tests/compiler/std/typedarray.debug.wat | 32 ------------------- tests/compiler/templateliteral.debug.wat | 8 ----- 9 files changed, 4 insertions(+), 156 deletions(-) diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index a05a0fcd09..ebd9d093cd 100644 --- a/std/assembly/util/number.ts +++ b/std/assembly/util/number.ts @@ -742,19 +742,8 @@ function dtoa_core(buffer: usize, value: f64, isSingle: bool): i32 { @lazy @inline const dtoa_buf = memory.data(MAX_DOUBLE_LENGTH << 1); export function dtoa(value: T): String { - if (isInteger()) { - return dtoa_impl(value, false); - } - - if (isFloat()) { - if (sizeof() == 4) { - return dtoa_impl(value, true); - } else { - return dtoa_impl(value, false); - } - } - - ERROR("dtoa: unsupported type"); + const isSingle = isFloat() && sizeof() == 4; + return dtoa_impl(value, isSingle); } // @ts-ignore: decorator @@ -850,19 +839,8 @@ export function itoa_buffered(buffer: usize, value: T): u32 { } export function dtoa_buffered(buffer: usize, value: T): u32 { - if (isInteger()) { - return dtoa_buffered_impl(buffer, value, false); - } - - if (isFloat()) { - if (sizeof() == 4) { - return dtoa_buffered_impl(buffer, value, true); - } else { - return dtoa_buffered_impl(buffer, value, false); - } - } - - ERROR("dtoa_buffered: unsupported type"); + const isSingle = isFloat() && sizeof() == 4; + return dtoa_buffered_impl(buffer, value, isSingle); } // @ts-ignore: decorator diff --git a/tests/compiler/issues/2873.debug.wat b/tests/compiler/issues/2873.debug.wat index 7859b10ece..bcb0349a4e 100644 --- a/tests/compiler/issues/2873.debug.wat +++ b/tests/compiler/issues/2873.debug.wat @@ -3983,14 +3983,6 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) - i32.const 0 - drop - i32.const 1 - drop - i32.const 4 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $buffer local.set $buffer|2 @@ -4086,14 +4078,6 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_buffered_impl|inlined.1 (result i32) local.get $buffer local.set $buffer|2 @@ -5197,14 +5181,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 4 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value f64.promote_f32 @@ -5282,14 +5258,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.1 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/resolve-binary.debug.wat b/tests/compiler/resolve-binary.debug.wat index ab72efd4f3..f911a1e884 100644 --- a/tests/compiler/resolve-binary.debug.wat +++ b/tests/compiler/resolve-binary.debug.wat @@ -7719,14 +7719,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/resolve-elementaccess.debug.wat b/tests/compiler/resolve-elementaccess.debug.wat index fd5460b5d0..ec97507c90 100644 --- a/tests/compiler/resolve-elementaccess.debug.wat +++ b/tests/compiler/resolve-elementaccess.debug.wat @@ -5325,14 +5325,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 4 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value f64.promote_f32 diff --git a/tests/compiler/resolve-ternary.debug.wat b/tests/compiler/resolve-ternary.debug.wat index 753eb19d1b..65d9fa68c2 100644 --- a/tests/compiler/resolve-ternary.debug.wat +++ b/tests/compiler/resolve-ternary.debug.wat @@ -4774,14 +4774,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/std/array.debug.wat b/tests/compiler/std/array.debug.wat index 7182b6b86e..0c7b3bfbca 100644 --- a/tests/compiler/std/array.debug.wat +++ b/tests/compiler/std/array.debug.wat @@ -8199,14 +8199,6 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $buffer local.set $buffer|2 @@ -46901,14 +46893,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/std/string.debug.wat b/tests/compiler/std/string.debug.wat index 55beae9ebb..7970a9b62e 100644 --- a/tests/compiler/std/string.debug.wat +++ b/tests/compiler/std/string.debug.wat @@ -29608,14 +29608,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1 @@ -29692,14 +29684,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 4 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.1 (result i32) local.get $value f64.promote_f32 @@ -29777,8 +29761,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 1 - drop block $~lib/util/number/dtoa_impl|inlined.2 (result i32) local.get $value f64.convert_i32_u diff --git a/tests/compiler/std/typedarray.debug.wat b/tests/compiler/std/typedarray.debug.wat index 85a15e9912..371919deb9 100644 --- a/tests/compiler/std/typedarray.debug.wat +++ b/tests/compiler/std/typedarray.debug.wat @@ -8268,14 +8268,6 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) - i32.const 0 - drop - i32.const 1 - drop - i32.const 4 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $buffer local.set $buffer|2 @@ -8363,14 +8355,6 @@ (local $value|3 f64) (local $isSingle i32) (local $sign i32) - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_buffered_impl|inlined.1 (result i32) local.get $buffer local.set $buffer|2 @@ -93998,14 +93982,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 4 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value f64.promote_f32 @@ -94083,14 +94059,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.1 (result i32) local.get $value local.set $value|1 diff --git a/tests/compiler/templateliteral.debug.wat b/tests/compiler/templateliteral.debug.wat index a15c6f55c4..629dbcd62d 100644 --- a/tests/compiler/templateliteral.debug.wat +++ b/tests/compiler/templateliteral.debug.wat @@ -6448,14 +6448,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 0 - drop - i32.const 1 - drop - i32.const 8 - i32.const 4 - i32.eq - drop block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value local.set $value|1