diff --git a/std/assembly/util/number.ts b/std/assembly/util/number.ts index db74792f9a..ebd9d093cd 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, 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 == 0x0010000000000000); + let m = 1 + i32(f == (isSingle ? 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, isSingle: 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 (isSingle) { + let uv = reinterpret(value); + exp = (uv & 0x7F800000) >>> 23; + let sid = uv & 0x007FFFFF; + frc = (u64(exp != 0) << 23) + sid; + 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 = (exp || 1) - (0x3FF + 52); + } - normalizedBoundaries(frc, exp); + normalizedBoundaries(frc, exp, isSingle); 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, isSingle: 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 <= (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; } @@ -731,13 +741,20 @@ 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 { + const isSingle = isFloat() && sizeof() == 4; + return dtoa_impl(value, isSingle); +} + +// @ts-ignore: decorator +@inline +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) << 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; @@ -821,7 +838,14 @@ 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 { + const isSingle = isFloat() && sizeof() == 4; + return dtoa_buffered_impl(buffer, value, isSingle); +} + +// @ts-ignore: decorator +@inline +function dtoa_buffered_impl(buffer: usize, value: f64, isSingle: bool): u32 { if (value == 0) { store(buffer, CharCode._0); store(buffer, CharCode.DOT, 2); @@ -845,5 +869,5 @@ export function dtoa_buffered(buffer: usize, value: f64): u32 { return 8 + u32(sign); } } - return dtoa_core(buffer, value); + return dtoa_core(buffer, value, isSingle); } diff --git a/tests/compiler/issues/2873.debug.wat b/tests/compiler/issues/2873.debug.wat new file mode 100644 index 0000000000..bcb0349a4e --- /dev/null +++ b/tests/compiler/issues/2873.debug.wat @@ -0,0 +1,5323 @@ +(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 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)) + (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 + return + ) + (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) + local.get $this + i32.load offset=16 + ) + (func $~lib/string/String#get:length (param $this i32) (result i32) + local.get $this + i32.const 20 + i32.sub + call $~lib/rt/common/OBJECT#get:rtSize + i32.const 1 + i32.shr_u + return + ) + (func $~lib/util/string/compareImpl (param $str1 i32) (param $index1 i32) (param $str2 i32) (param $index2 i32) (param $len i32) (result i32) + (local $ptr1 i32) + (local $ptr2 i32) + (local $7 i32) + (local $a i32) + (local $b i32) + local.get $str1 + local.get $index1 + i32.const 1 + i32.shl + i32.add + local.set $ptr1 + local.get $str2 + local.get $index2 + i32.const 1 + i32.shl + i32.add + local.set $ptr2 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $len + i32.const 4 + i32.ge_u + if (result i32) + local.get $ptr1 + i32.const 7 + i32.and + local.get $ptr2 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-loop|0 + local.get $ptr1 + i64.load + local.get $ptr2 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $ptr1 + i32.const 8 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 8 + i32.add + local.set $ptr2 + local.get $len + i32.const 4 + i32.sub + local.set $len + local.get $len + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + loop $while-continue|1 + local.get $len + local.tee $7 + i32.const 1 + i32.sub + local.set $len + local.get $7 + if + local.get $ptr1 + i32.load16_u + local.set $a + local.get $ptr2 + i32.load16_u + local.set $b + local.get $a + local.get $b + i32.ne + if + local.get $a + local.get $b + i32.sub + return + end + local.get $ptr1 + i32.const 2 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 2 + i32.add + local.set $ptr2 + br $while-continue|1 + end + end + i32.const 0 + return + ) + (func $~lib/number/F64#toString (param $this f64) (param $radix i32) (result i32) + local.get $this + call $~lib/util/number/dtoa + 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 f32) (result i32) + (local $buffer|2 i32) + (local $value|3 f64) + (local $isSingle i32) + (local $sign i32) + 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 $isSingle + 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 $isSingle + 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 $isSingle i32) + (local $sign i32) + 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 $isSingle + 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 $isSingle + 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/dtoa (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/dtoa (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 + ) +) 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..aba1809221 --- /dev/null +++ b/tests/compiler/issues/2873.release.wat @@ -0,0 +1,3882 @@ +(module + (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))) + (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))) + (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)) + (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) + (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 + 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 + f32.const 1.100000023841858 + call $~lib/util/number/dtoa + local.set $1 + 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 + f64.const 1.1 + call $~lib/util/number/dtoa + local.set $1 + 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 $3 + 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 + 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 $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 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 $3 + global.get $~lib/memory/__stack_pointer + i32.const 3312 + i32.store + i32.const 3324 + i32.load + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 3184 + 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 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$144 + local.get $0 + 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$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) + 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$82 + 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$82 + 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/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 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 + 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 1200 + 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 + 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 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (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 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 $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 $1 + ) +) 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"); diff --git a/tests/compiler/resolve-binary.debug.wat b/tests/compiler/resolve-binary.debug.wat index 2bf97efe4c..f911a1e884 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 $isSingle 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 $isSingle|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 $isSingle|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,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +4937,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 +4994,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 +5086,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 +5151,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 +5164,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 +5231,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 +5260,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/dtoa return ) (func $~lib/math/ipow32 (param $x i32) (param $e i32) (result i32) @@ -7651,10 +7705,12 @@ local.get $14 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 $isSingle 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 +7719,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 $isSingle + 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 $isSingle + 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..ec97507c90 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 $isSingle 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 $isSingle|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 $isSingle|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,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +3625,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 +3682,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 +3774,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 +3839,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 +3852,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 +3919,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 +3948,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/dtoa return ) (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) @@ -5258,10 +5311,12 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (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 $isSingle 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 +5325,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 + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - local.get $value - f64.ne + 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 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 $isSingle + 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..65d9fa68c2 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 $isSingle 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 $isSingle|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 $isSingle|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,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +3864,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 +3921,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 +4013,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 +4078,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 +4091,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 +4158,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 +4187,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/dtoa return ) (func $start:resolve-ternary~anonymous|0 (param $x i32) (result i32) @@ -4706,10 +4760,12 @@ local.get $14 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 $isSingle 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 +4774,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 - local.get $value + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - f64.ne + local.set $value|1 + i32.const 0 + local.set $isSingle + 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 $isSingle + 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..0c7b3bfbca 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 $isSingle 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 $isSingle|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 $isSingle|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,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +7873,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 +7930,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 +8022,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 +8087,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 +8100,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 +8167,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 +8194,90 @@ 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 $isSingle i32) (local $sign i32) - local.get $value - f64.const 0 - f64.eq - if + block $~lib/util/number/dtoa_buffered_impl|inlined.0 (result i32) local.get $buffer - i32.const 48 - i32.store16 - local.get $buffer - i32.const 46 - i32.store16 offset=2 - 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 $isSingle + 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 $isSingle + 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 $isSingle 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,66 @@ 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 + block $~lib/util/number/dtoa_impl|inlined.0 (result i32) local.get $value - f64.ne + local.set $value|1 + i32.const 0 + local.set $isSingle + 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 $isSingle + 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/string.debug.wat b/tests/compiler/std/string.debug.wat index b66caa8920..7970a9b62e 100644 --- a/tests/compiler/std/string.debug.wat +++ b/tests/compiler/std/string.debug.wat @@ -20,10 +20,11 @@ (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) (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 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") @@ -502,48 +505,52 @@ (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\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)) @@ -4924,26 +4931,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 $isSingle 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 $isSingle|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 $isSingle|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 +4970,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 +5010,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +5141,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 +5198,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 +5290,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 +5355,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 +5368,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 +5435,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 +5632,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 58208 - i32.const 58256 + i32.const 58400 + i32.const 58448 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -27042,7 +27103,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 +27126,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 +27149,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 +27172,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 +27196,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 +27219,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 +27243,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 +27266,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 +27290,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 +27312,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 +27335,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,8 +27359,32 @@ 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 23552 + 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 747 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + 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 @@ -27315,13 +27401,13 @@ if i32.const 0 i32.const 96 - i32.const 749 + i32.const 748 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 9060801153433600 - 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 @@ -27338,13 +27424,13 @@ if i32.const 0 i32.const 96 - i32.const 750 + i32.const 749 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 4708356024711512064 - 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 @@ -27358,6 +27444,29 @@ local.get $55 call $~lib/string/String.__eq i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 750 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + 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 23792 + 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 @@ -27366,14 +27475,14 @@ call $~lib/builtins/abort unreachable end - f64.const 9409340012568248320 - 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 i32.store local.get $55 - i32.const 23776 + i32.const 23840 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27389,8 +27498,54 @@ call $~lib/builtins/abort unreachable end + 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 23904 + 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 753 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + 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 23968 + 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 754 + i32.const 1 + call $~lib/builtins/abort + unreachable + end f64.const 5e-324 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27407,19 +27562,19 @@ if i32.const 0 i32.const 96 - i32.const 753 + i32.const 755 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1 - call $~lib/util/number/dtoa + 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 24032 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27430,13 +27585,13 @@ if i32.const 0 i32.const 96 - i32.const 759 + i32.const 757 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 0.1 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27453,19 +27608,19 @@ if i32.const 0 i32.const 96 - i32.const 760 + i32.const 758 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -1 - call $~lib/util/number/dtoa + 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 24064 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27476,19 +27631,19 @@ if i32.const 0 i32.const 96 - i32.const 761 + i32.const 759 i32.const 1 call $~lib/builtins/abort unreachable end f64.const -0.1 - call $~lib/util/number/dtoa + 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 24096 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27499,19 +27654,19 @@ if i32.const 0 i32.const 96 - i32.const 762 + 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23936 + i32.const 24128 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27522,19 +27677,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 23984 + i32.const 24176 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27545,19 +27700,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24032 + i32.const 24224 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27568,19 +27723,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24080 + i32.const 24272 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27591,19 +27746,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24128 + i32.const 24320 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27614,19 +27769,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24176 + i32.const 24368 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27637,13 +27792,13 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27660,19 +27815,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24208 + i32.const 24400 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27683,13 +27838,13 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27706,13 +27861,13 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27729,19 +27884,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24256 + i32.const 24448 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27752,19 +27907,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24288 + i32.const 24480 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27775,19 +27930,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24336 + i32.const 24528 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27798,19 +27953,19 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 24368 + i32.const 24560 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27821,13 +27976,13 @@ if i32.const 0 i32.const 96 - 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 $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27844,19 +27999,19 @@ if i32.const 0 i32.const 96 - i32.const 779 + i32.const 777 i32.const 1 call $~lib/builtins/abort unreachable end - f64.const 4294967272 - 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 i32.store local.get $55 - i32.const 24416 + i32.const 24608 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27867,19 +28022,19 @@ if i32.const 0 i32.const 96 - 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 + 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 24656 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27890,19 +28045,19 @@ if i32.const 0 i32.const 96 - i32.const 782 + i32.const 780 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 555555555.5555556 - call $~lib/util/number/dtoa + 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 24720 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27913,19 +28068,19 @@ if i32.const 0 i32.const 96 - i32.const 784 + i32.const 781 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 0.9999999999999999 - call $~lib/util/number/dtoa + 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 24784 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27936,19 +28091,19 @@ if i32.const 0 i32.const 96 - i32.const 785 + i32.const 782 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1 - call $~lib/util/number/dtoa + 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 24032 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27959,19 +28114,19 @@ if i32.const 0 i32.const 96 - i32.const 786 + i32.const 783 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 12.34 - call $~lib/util/number/dtoa + 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 24848 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -27982,7 +28137,7 @@ if i32.const 0 i32.const 96 - i32.const 787 + i32.const 784 i32.const 1 call $~lib/builtins/abort unreachable @@ -27990,13 +28145,13 @@ f64.const 1 f64.const 3 f64.div - call $~lib/util/number/dtoa + 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 24880 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28007,19 +28162,19 @@ if i32.const 0 i32.const 96 - i32.const 789 + i32.const 785 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1234e17 - call $~lib/util/number/dtoa + 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 24944 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28030,19 +28185,19 @@ if i32.const 0 i32.const 96 - i32.const 790 + i32.const 786 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 1234e18 - call $~lib/util/number/dtoa + 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 25024 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28053,19 +28208,19 @@ if i32.const 0 i32.const 96 - i32.const 791 + i32.const 787 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 2.71828 - call $~lib/util/number/dtoa + 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 25072 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28076,19 +28231,19 @@ if i32.const 0 i32.const 96 - i32.const 792 + i32.const 788 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 0.0271828 - call $~lib/util/number/dtoa + 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 25120 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28099,19 +28254,19 @@ if i32.const 0 i32.const 96 - i32.const 793 + i32.const 789 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 271.828 - call $~lib/util/number/dtoa + 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 25168 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28122,19 +28277,19 @@ if i32.const 0 i32.const 96 - 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 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25024 + i32.const 25216 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28145,19 +28300,19 @@ if i32.const 0 i32.const 96 - 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 + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25072 + i32.const 25264 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28168,19 +28323,19 @@ if i32.const 0 i32.const 96 - i32.const 796 + i32.const 792 i32.const 1 call $~lib/builtins/abort unreachable end f64.const 0.000035689 - call $~lib/util/number/dtoa + call $~lib/util/number/dtoa local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25120 + i32.const 25312 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28191,18 +28346,18 @@ if i32.const 0 i32.const 96 - i32.const 797 + i32.const 793 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25168 + i32.const 25360 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store offset=8 local.get $55 - i32.const 25200 + i32.const 25392 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28214,7 +28369,7 @@ local.get $55 i32.store local.get $55 - i32.const 25232 + i32.const 25424 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28225,7 +28380,7 @@ if i32.const 0 i32.const 96 - i32.const 802 + i32.const 820 i32.const 1 call $~lib/builtins/abort unreachable @@ -28236,7 +28391,7 @@ local.get $55 i32.store offset=8 local.get $55 - i32.const 25280 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28248,7 +28403,7 @@ local.get $55 i32.store local.get $55 - i32.const 25280 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28259,12 +28414,12 @@ if i32.const 0 i32.const 96 - i32.const 803 + i32.const 821 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25280 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28282,7 +28437,7 @@ local.get $55 i32.store local.get $55 - i32.const 25280 + i32.const 25472 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28293,7 +28448,7 @@ if i32.const 0 i32.const 96 - i32.const 804 + i32.const 822 i32.const 1 call $~lib/builtins/abort unreachable @@ -28327,18 +28482,18 @@ if i32.const 0 i32.const 96 - i32.const 805 + i32.const 823 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25312 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25312 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28349,18 +28504,18 @@ if i32.const 0 i32.const 96 - i32.const 816 + i32.const 831 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25312 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25312 + i32.const 25504 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28371,18 +28526,18 @@ if i32.const 0 i32.const 96 - i32.const 817 + i32.const 832 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25344 + i32.const 25536 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25344 + i32.const 25536 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28393,18 +28548,18 @@ if i32.const 0 i32.const 96 - i32.const 818 + i32.const 833 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 25376 + i32.const 25568 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 i32.store local.get $55 - i32.const 25376 + i32.const 25568 local.set $55 global.get $~lib/memory/__stack_pointer local.get $55 @@ -28415,7 +28570,7 @@ if i32.const 0 i32.const 96 - i32.const 819 + i32.const 834 i32.const 1 call $~lib/builtins/abort unreachable @@ -29439,10 +29594,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 $isSingle 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 +29608,220 @@ 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 + block $~lib/util/number/dtoa_impl|inlined.0 (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 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 $isSingle + 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 $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 - f64.ne + 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 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 + 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 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 $isSingle + 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.1 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 $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 - local.get $result - i32.const 22320 - local.get $size - memory.copy - local.get $result - local.set $3 + block $~lib/util/number/dtoa_impl|inlined.2 (result i32) + local.get $value + f64.convert_i32_u + local.set $value|1 + i32.const 0 + local.set $isSingle + local.get $value|1 + f64.const 0 + 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 $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.2 + 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..a18ea8e7a2 100644 --- a/tests/compiler/std/string.release.wat +++ b/tests/compiler/std/string.release.wat @@ -7,18 +7,20 @@ (type $5 (func (param i32))) (type $6 (func (result 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 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") @@ -888,89 +890,97 @@ (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 $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 $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\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\10\00\00\001\00.\001\00e\00+\001\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\0e\00\00\001\00.\001\00e\00-\006\004") + (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\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\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\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\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\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\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) @@ -1139,7 +1149,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$287 local.get $0 i32.load offset=4 i32.const -4 @@ -1151,7 +1161,7 @@ i32.load offset=8 i32.eqz local.get $0 - i32.const 59212 + i32.const 59404 i32.lt_u i32.and i32.eqz @@ -1163,7 +1173,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$284 + br $__inlined_func$~lib/rt/itcms/Object#unlink$287 end local.get $0 i32.load offset=8 @@ -1200,7 +1210,7 @@ i32.const 1 else local.get $1 - i32.const 26416 + i32.const 26608 i32.load i32.gt_u if @@ -1214,7 +1224,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 26420 + i32.const 26612 i32.add i32.load i32.const 32 @@ -1798,10 +1808,10 @@ if unreachable end - i32.const 59216 + i32.const 59408 i32.const 0 i32.store - i32.const 60784 + i32.const 60976 i32.const 0 i32.store loop $for-loop|0 @@ -1812,7 +1822,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 59216 + i32.const 59408 i32.add i32.const 0 i32.store offset=4 @@ -1830,7 +1840,7 @@ i32.add i32.const 2 i32.shl - i32.const 59216 + i32.const 59408 i32.add i32.const 0 i32.store offset=96 @@ -1848,14 +1858,14 @@ br $for-loop|0 end end - i32.const 59216 - i32.const 60788 + i32.const 59408 + i32.const 60980 memory.size i64.extend_i32_s i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - i32.const 59216 + i32.const 59408 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1940,7 +1950,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 59212 + i32.const 59404 i32.lt_u if local.get $0 @@ -2036,7 +2046,7 @@ unreachable end local.get $0 - i32.const 59212 + i32.const 59404 i32.lt_u if local.get $0 @@ -2059,7 +2069,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 59212 + i32.const 59404 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3937,96 +3947,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 +4085,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 +4095,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 +4201,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 +4222,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 +4251,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 +4302,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4269,7 +4315,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4314,8 +4360,8 @@ end unreachable end - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4342,11 +4388,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4428,11 +4474,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4493,11 +4539,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4551,11 +4597,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4592,11 +4638,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4626,11 +4672,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4699,11 +4745,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4817,11 +4863,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4943,11 +4989,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5074,11 +5120,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5196,11 +5242,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5247,11 +5293,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5335,11 +5381,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5491,11 +5537,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5645,11 +5691,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5894,11 +5940,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6134,11 +6180,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6476,11 +6522,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6522,11 +6568,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7346,11 +7392,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7387,11 +7433,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7690,11 +7736,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7988,11 +8034,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8061,11 +8107,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8096,11 +8142,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8134,11 +8180,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8228,11 +8274,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8319,11 +8365,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8355,11 +8401,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8394,11 +8440,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8515,11 +8561,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -8682,11 +8728,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9046,11 +9092,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9155,11 +9201,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9202,11 +9248,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9294,11 +9340,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9342,11 +9388,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9459,11 +9505,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9507,11 +9553,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9605,11 +9651,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -9673,7 +9719,7 @@ block $folding-inner1 block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -9702,7 +9748,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -9998,8 +10044,8 @@ local.get $9 return end - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10031,11 +10077,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10082,11 +10128,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -10153,7 +10199,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10254,7 +10300,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10263,7 +10309,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$294 local.get $0 i32.const 20 i32.sub @@ -10278,7 +10324,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$294 end local.get $0 i32.load16_u @@ -10308,7 +10354,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10317,7 +10363,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$295 local.get $4 i32.const 20 i32.sub @@ -10334,7 +10380,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$295 end local.get $0 i32.const 2 @@ -10352,7 +10398,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$295 end local.get $4 i32.load16_u offset=4 @@ -10366,7 +10412,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$295 end global.get $~lib/memory/__stack_pointer i32.const 4 @@ -10395,7 +10441,7 @@ memory.size i32.const 16 i32.shl - i32.const 59212 + i32.const 59404 i32.sub i32.const 1 i32.shr_u @@ -10856,7 +10902,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10875,7 +10921,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$296 local.get $4 i32.const 2172 i32.load @@ -10890,7 +10936,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$296 end global.get $~lib/memory/__stack_pointer local.get $0 @@ -10934,7 +10980,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10951,7 +10997,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -10970,7 +11016,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$297 i32.const 536870910 local.get $4 local.get $4 @@ -10993,7 +11039,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$297 end global.get $~lib/memory/__stack_pointer local.get $0 @@ -11039,7 +11085,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13209,7 +13255,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13300,7 +13346,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -13351,7 +13397,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -23135,7 +23181,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 +23202,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 +23223,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 +23244,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 +23265,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 +23286,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 +23307,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 +23328,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 +23349,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 +23369,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 +23390,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 +23411,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 +23532,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 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 8320 + i32.store offset=4 + local.get $0 + i32.const 8320 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + 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 + 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 25120 i32.store offset=4 local.get $0 - i32.const 24928 + i32.const 25120 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 762 + 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 +23826,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 +23868,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 +23889,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,350 +23994,378 @@ if i32.const 0 i32.const 1120 - i32.const 779 + i32.const 777 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 26636 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store f64.const 4294967272 - call $~lib/util/number/dtoa + 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 25440 + i32.const 25632 i32.store offset=4 - local.get $0 - i32.const 25440 + local.get $4 + 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 + 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 25680 i32.store offset=4 local.get $0 - i32.const 25488 + i32.const 25680 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 + 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 25744 i32.store offset=4 local.get $0 - i32.const 25552 + i32.const 25744 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 + 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 25808 i32.store offset=4 local.get $0 - i32.const 25616 + i32.const 25808 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 + 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 25056 i32.store offset=4 local.get $0 - i32.const 24864 + i32.const 25056 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 + 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 25872 i32.store offset=4 local.get $0 - i32.const 25680 + i32.const 25872 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 + 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 25904 i32.store offset=4 local.get $0 - i32.const 25712 + i32.const 25904 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 + 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 25968 i32.store offset=4 local.get $0 - i32.const 25776 + i32.const 25968 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 + 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 + 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 + 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 + 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 + 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 + 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 796 + i32.const 792 i32.const 1 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 26336 i32.store offset=4 local.get $0 - i32.const 26144 + 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 global.get $~lib/memory/__stack_pointer - i32.const 26192 + i32.const 26384 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 26224 + i32.const 26416 i32.store offset=12 - i32.const 26192 - i32.const 26224 + 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 26256 + i32.const 26448 i32.store offset=4 local.get $0 - i32.const 26256 + i32.const 26448 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 802 + i32.const 820 i32.const 1 call $~lib/builtins/abort unreachable @@ -24216,37 +24374,37 @@ i32.const 1712 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26496 i32.store offset=12 i32.const 1712 - i32.const 26304 + 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 26304 + i32.const 26496 i32.store offset=4 local.get $0 - i32.const 26304 + i32.const 26496 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 803 + i32.const 821 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26496 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1712 i32.store offset=12 - i32.const 26304 + i32.const 26496 i32.const 1712 call $~lib/string/String#concat local.set $0 @@ -24254,16 +24412,16 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26304 + i32.const 26496 i32.store offset=4 local.get $0 - i32.const 26304 + i32.const 26496 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 804 + i32.const 822 i32.const 1 call $~lib/builtins/abort unreachable @@ -24291,86 +24449,86 @@ if i32.const 0 i32.const 1120 - i32.const 805 + i32.const 823 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26528 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26528 i32.store offset=4 - i32.const 26336 - i32.const 26336 + i32.const 26528 + i32.const 26528 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 816 + i32.const 831 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26528 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26336 + i32.const 26528 i32.store offset=4 - i32.const 26336 - i32.const 26336 + i32.const 26528 + i32.const 26528 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 817 + i32.const 832 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26368 + i32.const 26560 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26368 + i32.const 26560 i32.store offset=4 - i32.const 26368 - i32.const 26368 + i32.const 26560 + i32.const 26560 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 818 + i32.const 833 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 26400 + i32.const 26592 i32.store global.get $~lib/memory/__stack_pointer - i32.const 26400 + i32.const 26592 i32.store offset=4 - i32.const 26400 - i32.const 26400 + i32.const 26592 + i32.const 26592 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 819 + i32.const 834 i32.const 1 call $~lib/builtins/abort unreachable end i32.const 0 global.set $std/string/str - i32.const 59212 + i32.const 59404 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -24411,8 +24569,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24426,11 +24584,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24474,11 +24632,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24539,11 +24697,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24617,11 +24775,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -24809,7 +24967,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 +24988,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 +25078,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25090,7 +25248,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 +25269,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 +25349,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25429,7 +25587,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 +25607,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 +25687,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25794,7 +25952,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 +25972,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 +26050,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 +26058,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 26444 + i32.const 26636 i32.lt_s if - i32.const 59232 - i32.const 59280 + i32.const 59424 + i32.const 59472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -25913,61 +26071,126 @@ 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 - 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 $0 - f64.const 0 - f64.lt - select - return + 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 + 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 - local.get $0 - call $~lib/util/number/dtoa_core - i32.const 1 - i32.shl - local.set $1 global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer local.get $1 - i32.const 2 - call $~lib/rt/itcms/__new - local.tee $2 + ) + (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 26636 + i32.lt_s + if + i32.const 59424 + i32.const 59472 + 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 $2 - i32.const 23344 - local.get $1 - memory.copy + 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.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 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add diff --git a/tests/compiler/std/string.ts b/tests/compiler/std/string.ts index 7b9281c8e4..df5b2d5443 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"); @@ -780,12 +778,10 @@ 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 +792,28 @@ assert(dtoa(1.1e+128) == "1.1e+128"); assert(dtoa(1.1e-64) == "1.1e-64"); assert(dtoa(0.000035689) == "0.000035689"); +// 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 +822,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; } diff --git a/tests/compiler/std/typedarray.debug.wat b/tests/compiler/std/typedarray.debug.wat index 15de61b0fb..371919deb9 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 $isSingle 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 $isSingle|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 $isSingle|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,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +7942,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 +7999,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 +8091,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 +8156,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 +8169,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 +8236,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 +8263,177 @@ 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 $isSingle 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 + 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 $isSingle + 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 $isSingle + 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 $isSingle i32) + (local $sign i32) + 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 $isSingle + 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 $isSingle + 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 +20355,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 +20527,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 +24067,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 +24238,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 +26355,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 +26653,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 +41490,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 +41740,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 +41990,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 +42240,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 +60303,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 +60359,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 +60400,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 +60674,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 +60730,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 +60771,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 +93968,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 $isSingle 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 +93982,143 @@ 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 + 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 $isSingle + 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 $isSingle + 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 $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 - local.get $result - i32.const 8784 - local.get $size - memory.copy - local.get $result - local.set $3 + 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 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 $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 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..629dbcd62d 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 $isSingle 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 $isSingle|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 $isSingle|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,127 @@ 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 $isSingle + local.set $isSingle|7 + local.get $isSingle|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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 + if (result i32) + local.get $exp + else + i32.const 1 + end + 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 $isSingle|7 + local.set $isSingle|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 $isSingle|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 +3981,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 +4038,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 +4130,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 +4195,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 +4208,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 +4275,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 +4304,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/dtoa return ) (func $templateliteral/Ref#set:value (param $this i32) (param $value i32) @@ -6380,10 +6434,12 @@ local.get $14 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 $isSingle 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 +6448,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 $isSingle + 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 $isSingle + 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