diff --git a/tests/compiler/number-warn.json b/tests/compiler/number-warn.json new file mode 100644 index 0000000000..d823d836bf --- /dev/null +++ b/tests/compiler/number-warn.json @@ -0,0 +1,18 @@ +{ + "asc_flags": [ + ], + "stderr": [ + "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", + "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", + "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", + "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", + "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", + "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", + "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", + "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", + "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", + "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", + "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", + "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters." + ] +} diff --git a/tests/compiler/number-warn.ts b/tests/compiler/number-warn.ts new file mode 100644 index 0000000000..4de4bc8205 --- /dev/null +++ b/tests/compiler/number-warn.ts @@ -0,0 +1,20 @@ + +// Should produce warnings + +// always false +(!(1.0 == NaN)); +(!(NaN == F32.NaN)); +(!(F64.NaN == 1.0)); + +// always true +(1.0 != NaN); +(NaN != F32.NaN); +(f64.NaN != 1.0); + +// always true +(+.0 == -.0); +(-.0 != -.0); +(-.0 == +.0); +(f32(+.0) == f32(-.0)); +(f32(-.0) != f32(-.0)); +(f32(-.0) == f32(+.0)); diff --git a/tests/compiler/number.debug.wat b/tests/compiler/number.debug.wat index c2bf156863..4c4c4c7a86 100644 --- a/tests/compiler/number.debug.wat +++ b/tests/compiler/number.debug.wat @@ -1,22 +1,23 @@ (module - (type $i32_i32_=>_none (func (param i32 i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_=>_none (func (param i32))) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $none_=>_none (func)) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $f64_=>_i32 (func (param f64) (result i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) - (type $f32_=>_i32 (func (param f32) (result i32))) - (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $none_=>_i32 (func (result i32))) - (type $i32_i64_i32_=>_none (func (param i32 i64 i32))) - (type $i64_i32_=>_i32 (func (param i64 i32) (result i32))) - (type $i32_i64_i32_i32_=>_none (func (param i32 i64 i32 i32))) - (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) - (type $i32_i64_i32_i64_i32_i64_i32_=>_i32 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) - (type $i32_f64_=>_i32 (func (param i32 f64) (result i32))) - (type $f64_i32_=>_i32 (func (param f64 i32) (result i32))) + (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))) + (type $6 (func (param f64) (result i32))) + (type $7 (func (param f32) (result i32))) + (type $8 (func (param i32 i32 i32 i32))) + (type $9 (func (param i32 i32 i64) (result i32))) + (type $10 (func (result i32))) + (type $11 (func (param i32 i64 i32))) + (type $12 (func (param i64 i32) (result i32))) + (type $13 (func (param i32 i64 i32 i32))) + (type $14 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $15 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $16 (func (param i32 i32 i32) (result i32))) + (type $17 (func (param i32 f64 i32) (result i32))) + (type $18 (func (param f64 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $number/a (mut i32) (i32.const 1)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -51,42 +52,42 @@ (global $~lib/builtins/f64.MAX_SAFE_INTEGER f64 (f64.const 9007199254740991)) (global $~lib/builtins/f64.EPSILON f64 (f64.const 2.220446049250313e-16)) (global $~lib/rt/__rtti_base i32 (i32.const 3632)) - (global $~lib/memory/__data_end i32 (i32.const 3660)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20044)) - (global $~lib/memory/__heap_base i32 (i32.const 20044)) + (global $~lib/memory/__data_end i32 (i32.const 3652)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 36420)) + (global $~lib/memory/__heap_base i32 (i32.const 36420)) (memory $0 1) - (data (i32.const 12) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006\00\00\00\00\00\00\00\00\00") - (data (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 204) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\000\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 236) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") - (data (i32.const 300) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 368) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 400) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 428) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") - (data (i32.const 492) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 544) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 636) "0\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00") - (data (i32.const 1036) "\1c\04\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2092) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z\00\00\00\00\00") - (data (i32.const 2188) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\001\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2220) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00n\00u\00m\00b\00e\00r\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2268) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\000\00.\000\00\00\00\00\00\00\00") - (data (i32.const 2300) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00N\00a\00N\00\00\00\00\00\00\00") - (data (i32.const 2332) ",\00\00\00\00\00\00\00\00\00\00\00\01\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 (i32.const 2380) ",\00\00\00\00\00\00\00\00\00\00\00\01\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 (i32.const 2432) "\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 (i32.const 2488) "\88\02\1c\08\a0\d5\8f\fav\bf>\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\0dXf\ab\a3&\f1\c3\de\93\f8\e2\f3\b8\80\ff\aa\a8\ad\b5\b5\8bJ|l\05_b\87S0\c14`\ff\bc\c9U&\ba\91\8c\85N\96\bd~)p$w\f9\df\8f\b8\e5\b8\9f\bd\df\a6\94}t\88\cf_\a9\f8\cf\9b\a8\8f\93pD\b9k\15\0f\bf\f8\f0\08\8a\b611eU%\b0\cd\ac\7f{\d0\c6\e2?\99\06;+*\c4\10\\\e4\d3\92si\99$$\aa\0e\ca\00\83\f2\b5\87\fd\eb\1a\11\92d\08\e5\bc\cc\88Po\t\cc\bc\8c,e\19\e2X\17\b7\d1\00\00\00\00\00\00@\9c\00\00\00\00\10\a5\d4\e8\00\00b\ac\c5\ebx\ad\84\t\94\f8x9?\81\b3\15\07\c9{\ce\97\c0p\\\ea{\ce2~\8fh\80\e9\ab\a48\d2\d5E\"\9a\17&\'O\9f\'\fb\c4\d41\a2c\ed\a8\ad\c8\8c8e\de\b0\dbe\ab\1a\8e\08\c7\83\9a\1dqB\f9\1d]\c4X\e7\1b\a6,iM\92\ea\8dp\1ad\ee\01\daJw\ef\9a\99\a3m\a2\85k}\b4{x\t\f2w\18\ddy\a1\e4T\b4\c2\c5\9b[\92\86[\86=]\96\c8\c5S5\c8\b3\a0\97\fa\\\b4*\95\e3_\a0\99\bd\9fF\de%\8c9\db4\c2\9b\a5\\\9f\98\a3r\9a\c6\f6\ce\be\e9TS\bf\dc\b7\e2A\"\f2\17\f3\fc\88\a5x\\\d3\9b\ce \cc\dfS!{\f3Z\16\98:0\1f\97\dc\b5\a0\e2\96\b3\e3\\S\d1\d9\a8\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\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|inlined.0 (result i32) + local.get $base + local.set $value + local.get $value + i32.popcnt + i32.const 1 + i32.eq + br $~lib/util/number/isPowerOf2|inlined.0 + end if i32.const 63 local.get $num @@ -2445,8 +2574,6 @@ local.get $num local.get $b i64.ge_u - local.set $var$2 - local.get $var$2 if local.get $num local.get $b @@ -2467,8 +2594,6 @@ local.get $num i64.const 1 i64.ge_u - local.set $var$2 - local.get $var$2 if local.get $num local.get $b64 @@ -2484,10 +2609,12 @@ local.get $e i32.const 1 i32.sub + return ) (func $~lib/util/number/utoa64_any_core (param $buffer i32) (param $num i64) (param $offset i32) (param $radix i32) (local $base i64) - (local $var$5 i64) + (local $shift i64) + (local $mask i64) (local $q i64) local.get $radix i64.extend_i32_s @@ -2505,11 +2632,11 @@ i32.const 7 i32.and i64.extend_i32_s - local.set $var$5 + local.set $shift local.get $base i64.const 1 i64.sub - local.set $q + local.set $mask loop $do-loop|0 local.get $offset i32.const 1 @@ -2522,16 +2649,16 @@ i32.add i32.const 2112 local.get $num - local.get $q + local.get $mask i64.and i32.wrap_i64 i32.const 1 i32.shl i32.add - i32.load16_u $0 - i32.store16 $0 + i32.load16_u + i32.store16 local.get $num - local.get $var$5 + local.get $shift i64.shr_u local.set $num local.get $num @@ -2564,8 +2691,8 @@ i32.const 1 i32.shl i32.add - i32.load16_u $0 - i32.store16 $0 + i32.load16_u + i32.store16 local.get $q local.set $num local.get $num @@ -2579,19 +2706,25 @@ local.get $this local.get $radix call $~lib/util/number/itoa32 + 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 - i32.load $0 offset=16 + 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 $var$7 i32) + (local $7 i32) (local $a i32) (local $b i32) local.get $str1 @@ -2629,9 +2762,9 @@ block $do-break|0 loop $do-loop|0 local.get $ptr1 - i64.load $0 + i64.load local.get $ptr2 - i64.load $0 + i64.load i64.ne if br $do-break|0 @@ -2657,19 +2790,17 @@ end loop $while-continue|1 local.get $len - local.tee $var$7 + local.tee $7 i32.const 1 i32.sub local.set $len - local.get $var$7 - local.set $var$7 - local.get $var$7 + local.get $7 if local.get $ptr1 - i32.load16_u $0 + i32.load16_u local.set $a local.get $ptr2 - i32.load16_u $0 + i32.load16_u local.set $b local.get $a local.get $b @@ -2692,48 +2823,7 @@ end end i32.const 0 - ) - (func $~lib/string/String.__eq (param $left i32) (param $right i32) (result i32) - (local $leftLength i32) - local.get $left - local.get $right - i32.eq - if - i32.const 1 - 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 - return - end - local.get $left - call $~lib/string/String#get:length - local.set $leftLength - local.get $leftLength - local.get $right - call $~lib/string/String#get:length - i32.ne - if - i32.const 0 - return - end - local.get $left - i32.const 0 - local.get $right - i32.const 0 - local.get $leftLength - call $~lib/util/string/compareImpl - i32.eqz + return ) (func $~lib/util/number/genDigits (param $buffer i32) (param $w_frc i64) (param $w_exp i32) (param $mp_frc i64) (param $mp_exp i32) (param $delta i64) (param $sign i32) (result i32) (local $one_exp i32) @@ -2744,19 +2834,28 @@ (local $p2 i64) (local $kappa i32) (local $len i32) - (local $var$15 i32) (local $d i32) - (local $var$17 i32) + (local $16 i32) + (local $17 i32) (local $tmp i64) - (local $var$19 i64) - (local $var$20 i64) - (local $var$21 i64) - (local $d_0 i64) - (local $var$23 i32) - (local $var$24 i32) - (local $var$25 i32) - (local $var$26 i32) - (local $var$27 i64) + (local $buffer|19 i32) + (local $len|20 i32) + (local $delta|21 i64) + (local $rest i64) + (local $ten_kappa i64) + (local $wp_w i64) + (local $lastp i32) + (local $digit i32) + (local $d|27 i64) + (local $28 i32) + (local $buffer|29 i32) + (local $len|30 i32) + (local $delta|31 i64) + (local $rest|32 i64) + (local $ten_kappa|33 i64) + (local $wp_w|34 i64) + (local $lastp|35 i32) + (local $digit|36 i32) i32.const 0 local.get $mp_exp i32.sub @@ -2793,8 +2892,6 @@ local.get $kappa i32.const 0 i32.gt_s - local.set $var$15 - local.get $var$15 if block $break|1 block $case10|1 @@ -2809,44 +2906,44 @@ block $case1|1 block $case0|1 local.get $kappa - local.set $var$17 - local.get $var$17 + local.set $16 + local.get $16 i32.const 10 i32.eq br_if $case0|1 - local.get $var$17 + local.get $16 i32.const 9 i32.eq br_if $case1|1 - local.get $var$17 + local.get $16 i32.const 8 i32.eq br_if $case2|1 - local.get $var$17 + local.get $16 i32.const 7 i32.eq br_if $case3|1 - local.get $var$17 + local.get $16 i32.const 6 i32.eq br_if $case4|1 - local.get $var$17 + local.get $16 i32.const 5 i32.eq br_if $case5|1 - local.get $var$17 + local.get $16 i32.const 4 i32.eq br_if $case6|1 - local.get $var$17 + local.get $16 i32.const 3 i32.eq br_if $case7|1 - local.get $var$17 + local.get $16 i32.const 2 i32.eq br_if $case8|1 - local.get $var$17 + local.get $16 i32.const 1 i32.eq br_if $case9|1 @@ -2958,11 +3055,11 @@ if local.get $buffer local.get $len - local.tee $var$17 + local.tee $17 i32.const 1 i32.add local.set $len - local.get $var$17 + local.get $17 i32.const 1 i32.shl i32.add @@ -2971,7 +3068,7 @@ i32.const 65535 i32.and i32.add - i32.store16 $0 + i32.store16 end local.get $kappa i32.const 1 @@ -2994,88 +3091,86 @@ i32.add global.set $~lib/util/number/_K local.get $buffer - local.set $var$23 + local.set $buffer|19 local.get $len - local.set $var$17 + local.set $len|20 local.get $delta - local.set $d_0 + local.set $delta|21 local.get $tmp - local.set $var$21 + local.set $rest i32.const 3360 local.get $kappa i32.const 2 i32.shl i32.add - i64.load32_u $0 + i64.load32_u local.get $one_exp i64.extend_i32_s i64.shl - local.set $var$20 + local.set $ten_kappa local.get $wp_w_frc - local.set $var$19 - local.get $var$23 - local.get $var$17 + local.set $wp_w + local.get $buffer|19 + local.get $len|20 i32.const 1 i32.sub i32.const 1 i32.shl i32.add - local.set $var$24 - local.get $var$24 - i32.load16_u $0 - local.set $var$25 + local.set $lastp + local.get $lastp + i32.load16_u + local.set $digit loop $while-continue|3 - local.get $var$21 - local.get $var$19 + local.get $rest + local.get $wp_w i64.lt_u if (result i32) - local.get $d_0 - local.get $var$21 + local.get $delta|21 + local.get $rest i64.sub - local.get $var$20 + local.get $ten_kappa i64.ge_u else i32.const 0 end if (result i32) - local.get $var$21 - local.get $var$20 + local.get $rest + local.get $ten_kappa i64.add - local.get $var$19 + local.get $wp_w i64.lt_u if (result i32) i32.const 1 else - local.get $var$19 - local.get $var$21 + local.get $wp_w + local.get $rest i64.sub - local.get $var$21 - local.get $var$20 + local.get $rest + local.get $ten_kappa i64.add - local.get $var$19 + local.get $wp_w i64.sub i64.gt_u end else i32.const 0 end - local.set $var$26 - local.get $var$26 if - local.get $var$25 + local.get $digit i32.const 1 i32.sub - local.set $var$25 - local.get $var$21 - local.get $var$20 + local.set $digit + local.get $rest + local.get $ten_kappa i64.add - local.set $var$21 + local.set $rest br $while-continue|3 end end - local.get $var$24 - local.get $var$25 - i32.store16 $0 + local.get $lastp + local.get $digit + i32.store16 local.get $len return end @@ -3084,8 +3179,6 @@ end loop $while-continue|4 i32.const 1 - local.set $var$15 - local.get $var$15 if local.get $p2 i64.const 10 @@ -3099,8 +3192,8 @@ local.get $one_exp i64.extend_i32_s i64.shr_u - local.set $d_0 - local.get $d_0 + local.set $d|27 + local.get $d|27 local.get $len i64.extend_i32_s i64.or @@ -3109,21 +3202,21 @@ if local.get $buffer local.get $len - local.tee $var$25 + local.tee $28 i32.const 1 i32.add local.set $len - local.get $var$25 + local.get $28 i32.const 1 i32.shl i32.add i32.const 48 - local.get $d_0 + local.get $d|27 i32.wrap_i64 i32.const 65535 i32.and i32.add - i32.store16 $0 + i32.store16 end local.get $p2 local.get $mask @@ -3149,84 +3242,82 @@ i32.const 2 i32.shl i32.add - i64.load32_u $0 + i64.load32_u i64.mul local.set $wp_w_frc local.get $buffer - local.set $var$17 + local.set $buffer|29 local.get $len - local.set $var$26 + local.set $len|30 local.get $delta - local.set $var$27 + local.set $delta|31 local.get $p2 - local.set $var$21 + local.set $rest|32 local.get $one_frc - local.set $var$20 + local.set $ten_kappa|33 local.get $wp_w_frc - local.set $var$19 - local.get $var$17 - local.get $var$26 + local.set $wp_w|34 + local.get $buffer|29 + local.get $len|30 i32.const 1 i32.sub i32.const 1 i32.shl i32.add - local.set $var$25 - local.get $var$25 - i32.load16_u $0 - local.set $var$24 + local.set $lastp|35 + local.get $lastp|35 + i32.load16_u + local.set $digit|36 loop $while-continue|6 - local.get $var$21 - local.get $var$19 + local.get $rest|32 + local.get $wp_w|34 i64.lt_u if (result i32) - local.get $var$27 - local.get $var$21 + local.get $delta|31 + local.get $rest|32 i64.sub - local.get $var$20 + local.get $ten_kappa|33 i64.ge_u else i32.const 0 end if (result i32) - local.get $var$21 - local.get $var$20 + local.get $rest|32 + local.get $ten_kappa|33 i64.add - local.get $var$19 + local.get $wp_w|34 i64.lt_u if (result i32) i32.const 1 else - local.get $var$19 - local.get $var$21 + local.get $wp_w|34 + local.get $rest|32 i64.sub - local.get $var$21 - local.get $var$20 + local.get $rest|32 + local.get $ten_kappa|33 i64.add - local.get $var$19 + local.get $wp_w|34 i64.sub i64.gt_u end else i32.const 0 end - local.set $var$23 - local.get $var$23 if - local.get $var$24 + local.get $digit|36 i32.const 1 i32.sub - local.set $var$24 - local.get $var$21 - local.get $var$20 + local.set $digit|36 + local.get $rest|32 + local.get $ten_kappa|33 i64.add - local.set $var$21 + local.set $rest|32 br $while-continue|6 end end - local.get $var$25 - local.get $var$24 - i32.store16 $0 + local.get $lastp|35 + local.get $digit|36 + i32.store16 local.get $len return end @@ -3237,14 +3328,25 @@ ) (func $~lib/util/number/prettify (param $buffer i32) (param $length i32) (param $k i32) (result i32) (local $kk i32) - (local $var$4 i32) - (local $var$5 i32) - (local $var$6 i32) - (local $var$7 i32) - (local $var$8 i32) - (local $var$9 i32) - (local $var$10 i32) - (local $var$11 i32) + (local $i i32) + (local $ptr i32) + (local $offset i32) + (local $i|7 i32) + (local $buffer|8 i32) + (local $k|9 i32) + (local $sign i32) + (local $decimals i32) + (local $buffer|12 i32) + (local $num i32) + (local $offset|14 i32) + (local $len i32) + (local $buffer|16 i32) + (local $k|17 i32) + (local $sign|18 i32) + (local $decimals|19 i32) + (local $buffer|20 i32) + (local $num|21 i32) + (local $offset|22 i32) local.get $k i32.eqz if @@ -3258,7 +3360,7 @@ i32.const 16 i32.shl i32.or - i32.store $0 + i32.store local.get $length i32.const 2 i32.add @@ -3280,25 +3382,23 @@ end if local.get $length - local.set $var$4 + local.set $i loop $for-loop|0 - local.get $var$4 + local.get $i local.get $kk i32.lt_s - local.set $var$5 - local.get $var$5 if local.get $buffer - local.get $var$4 + local.get $i i32.const 1 i32.shl i32.add i32.const 48 - i32.store16 $0 - local.get $var$4 + i32.store16 + local.get $i i32.const 1 i32.add - local.set $var$4 + local.set $i br $for-loop|0 end end @@ -3312,7 +3412,7 @@ i32.const 16 i32.shl i32.or - i32.store $0 + i32.store local.get $kk i32.const 2 i32.add @@ -3334,24 +3434,24 @@ i32.const 1 i32.shl i32.add - local.set $var$4 - local.get $var$4 + local.set $ptr + local.get $ptr i32.const 2 i32.add - local.get $var$4 + local.get $ptr i32.const 0 local.get $k i32.sub i32.const 1 i32.shl - memory.copy $0 $0 + memory.copy local.get $buffer local.get $kk i32.const 1 i32.shl i32.add i32.const 46 - i32.store16 $0 + i32.store16 local.get $length i32.const 1 i32.add @@ -3371,9 +3471,9 @@ i32.const 2 local.get $kk i32.sub - local.set $var$4 + local.set $offset local.get $buffer - local.get $var$4 + local.get $offset i32.const 1 i32.shl i32.add @@ -3381,39 +3481,37 @@ local.get $length i32.const 1 i32.shl - memory.copy $0 $0 + memory.copy local.get $buffer i32.const 48 i32.const 46 i32.const 16 i32.shl i32.or - i32.store $0 + i32.store i32.const 2 - local.set $var$5 + local.set $i|7 loop $for-loop|1 - local.get $var$5 - local.get $var$4 + local.get $i|7 + local.get $offset i32.lt_s - local.set $var$6 - local.get $var$6 if local.get $buffer - local.get $var$5 + local.get $i|7 i32.const 1 i32.shl i32.add i32.const 48 - i32.store16 $0 - local.get $var$5 + i32.store16 + local.get $i|7 i32.const 1 i32.add - local.set $var$5 + local.set $i|7 br $for-loop|1 end end local.get $length - local.get $var$4 + local.get $offset i32.add return else @@ -3423,52 +3521,55 @@ if local.get $buffer i32.const 101 - i32.store16 $0 offset=2 - local.get $buffer - i32.const 4 - i32.add - local.set $var$5 - local.get $kk - i32.const 1 - i32.sub - local.set $var$6 - local.get $var$6 - i32.const 0 - i32.lt_s - local.set $var$4 - local.get $var$4 - if - i32.const 0 - local.get $var$6 + i32.store16 offset=2 + block $~lib/util/number/genExponent|inlined.0 (result i32) + local.get $buffer + i32.const 4 + i32.add + local.set $buffer|8 + local.get $kk + i32.const 1 i32.sub - local.set $var$6 + local.set $k|9 + local.get $k|9 + i32.const 0 + i32.lt_s + local.set $sign + local.get $sign + if + i32.const 0 + local.get $k|9 + i32.sub + local.set $k|9 + end + local.get $k|9 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.set $decimals + local.get $buffer|8 + local.set $buffer|12 + local.get $k|9 + local.set $num + local.get $decimals + local.set $offset|14 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $buffer|12 + local.get $num + local.get $offset|14 + call $~lib/util/number/utoa32_dec_lut + local.get $buffer|8 + i32.const 45 + i32.const 43 + local.get $sign + select + i32.store16 + local.get $decimals + br $~lib/util/number/genExponent|inlined.0 end - local.get $var$6 - call $~lib/util/number/decimalCount32 - i32.const 1 - i32.add - local.set $var$7 - local.get $var$5 - local.set $var$10 - local.get $var$6 - local.set $var$9 - local.get $var$7 - local.set $var$8 - i32.const 0 - i32.const 1 - i32.ge_s - drop - local.get $var$10 - local.get $var$9 - local.get $var$8 - call $~lib/util/number/utoa32_dec_lut - local.get $var$5 - i32.const 45 - i32.const 43 - local.get $var$4 - select - i32.store16 $0 - local.get $var$7 local.set $length local.get $length i32.const 2 @@ -3478,73 +3579,76 @@ local.get $length i32.const 1 i32.shl - local.set $var$7 + local.set $len local.get $buffer i32.const 4 i32.add local.get $buffer i32.const 2 i32.add - local.get $var$7 + local.get $len i32.const 2 i32.sub - memory.copy $0 $0 + memory.copy local.get $buffer i32.const 46 - i32.store16 $0 offset=2 + i32.store16 offset=2 local.get $buffer - local.get $var$7 + local.get $len i32.add i32.const 101 - i32.store16 $0 offset=2 + i32.store16 offset=2 local.get $length - local.get $buffer - local.get $var$7 - i32.add - i32.const 4 - i32.add - local.set $var$9 - local.get $kk - i32.const 1 - i32.sub - local.set $var$8 - local.get $var$8 - i32.const 0 - i32.lt_s - local.set $var$4 - local.get $var$4 - if - i32.const 0 - local.get $var$8 + block $~lib/util/number/genExponent|inlined.1 (result i32) + local.get $buffer + local.get $len + i32.add + i32.const 4 + i32.add + local.set $buffer|16 + local.get $kk + i32.const 1 i32.sub - local.set $var$8 + local.set $k|17 + local.get $k|17 + i32.const 0 + i32.lt_s + local.set $sign|18 + local.get $sign|18 + if + i32.const 0 + local.get $k|17 + i32.sub + local.set $k|17 + end + local.get $k|17 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.set $decimals|19 + local.get $buffer|16 + local.set $buffer|20 + local.get $k|17 + local.set $num|21 + local.get $decimals|19 + local.set $offset|22 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $buffer|20 + local.get $num|21 + local.get $offset|22 + call $~lib/util/number/utoa32_dec_lut + local.get $buffer|16 + i32.const 45 + i32.const 43 + local.get $sign|18 + select + i32.store16 + local.get $decimals|19 + br $~lib/util/number/genExponent|inlined.1 end - local.get $var$8 - call $~lib/util/number/decimalCount32 - i32.const 1 - i32.add - local.set $var$5 - local.get $var$9 - local.set $var$11 - local.get $var$8 - local.set $var$6 - local.get $var$5 - local.set $var$10 - i32.const 0 - i32.const 1 - i32.ge_s - drop - local.get $var$11 - local.get $var$6 - local.get $var$10 - call $~lib/util/number/utoa32_dec_lut - local.get $var$9 - i32.const 45 - i32.const 43 - local.get $var$4 - select - i32.store16 $0 - local.get $var$5 i32.add local.set $length local.get $length @@ -3560,33 +3664,69 @@ 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 $var$3 i32) - (local $var$4 i32) - (local $var$5 f64) - (local $var$6 i64) - (local $var$7 i32) - (local $var$8 i64) - (local $var$9 i64) - (local $var$10 i32) - (local $var$11 i64) - (local $var$12 i64) - (local $var$13 i32) - (local $var$14 i32) - (local $var$15 i32) - (local $var$16 f64) - (local $var$17 i64) - (local $var$18 i64) - (local $var$19 i64) - (local $var$20 i64) - (local $var$21 i64) - (local $var$22 i64) - (local $var$23 i64) - (local $var$24 i64) - (local $var$25 i64) - (local $var$26 i32) - (local $var$27 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 $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|25 i32) + (local $frc_pow i64) + (local $exp_pow i32) + (local $u i64) + (local $v i64) + (local $u0 i64) + (local $v0 i64) + (local $u1 i64) + (local $v1 i64) + (local $l i64) + (local $t i64) + (local $w i64) + (local $w_frc i64) + (local $e1 i32) + (local $e2 i32) + (local $w_exp i32) + (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|51 i32) + (local $e2|52 i32) + (local $wp_exp i32) + (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) local.get $value f64.const 0 @@ -3599,377 +3739,445 @@ local.set $value local.get $buffer i32.const 45 - i32.store16 $0 + i32.store16 + end + block $~lib/util/number/grisu2|inlined.0 (result i32) + local.get $value + local.set $value|4 + local.get $buffer + local.set $buffer|5 + local.get $sign + 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|17 + local.get $e + i32.const 1 + i32.sub + local.set $exp|18 + local.get $frc|17 + i64.clz + i32.wrap_i64 + local.set $off + local.get $frc|17 + local.get $off + i64.extend_i32_s + i64.shl + local.set $frc|17 + local.get $exp|18 + local.get $off + i32.sub + local.set $exp|18 + i32.const 1 + local.get $f + 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|17 + global.set $~lib/util/number/_frc_plus + local.get $f + local.get $m + i64.extend_i32_s + i64.shl + i64.const 1 + i64.sub + local.get $e + local.get $m + i32.sub + local.get $exp|18 + i32.sub + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_minus + local.get $exp|18 + global.set $~lib/util/number/_exp + global.get $~lib/util/number/_exp + local.set $minExp + i32.const -61 + local.get $minExp + i32.sub + f64.convert_i32_s + f64.const 0.30102999566398114 + f64.mul + f64.const 347 + f64.add + local.set $dk + local.get $dk + i32.trunc_sat_f64_s + local.set $k + local.get $k + local.get $k + f64.convert_i32_s + local.get $dk + f64.ne + i32.add + local.set $k + local.get $k + i32.const 3 + i32.shr_s + i32.const 1 + i32.add + local.set $index + i32.const 348 + local.get $index + i32.const 3 + i32.shl + i32.sub + global.set $~lib/util/number/_K + i32.const 2488 + local.get $index + i32.const 3 + i32.shl + i32.add + i64.load + global.set $~lib/util/number/_frc_pow + i32.const 3184 + local.get $index + i32.const 1 + i32.shl + i32.add + i32.load16_s + global.set $~lib/util/number/_exp_pow + local.get $frc + i64.clz + i32.wrap_i64 + local.set $off|25 + local.get $frc + local.get $off|25 + i64.extend_i32_s + i64.shl + local.set $frc + local.get $exp + local.get $off|25 + i32.sub + local.set $exp + global.get $~lib/util/number/_frc_pow + local.set $frc_pow + global.get $~lib/util/number/_exp_pow + local.set $exp_pow + block $~lib/util/number/umul64f|inlined.0 (result i64) + local.get $frc + local.set $u + local.get $frc_pow + local.set $v + local.get $u + i64.const 4294967295 + i64.and + local.set $u0 + local.get $v + i64.const 4294967295 + i64.and + local.set $v0 + local.get $u + i64.const 32 + i64.shr_u + local.set $u1 + local.get $v + i64.const 32 + i64.shr_u + local.set $v1 + local.get $u0 + local.get $v0 + i64.mul + local.set $l + local.get $u1 + local.get $v0 + i64.mul + local.get $l + i64.const 32 + i64.shr_u + i64.add + local.set $t + local.get $u0 + local.get $v1 + i64.mul + local.get $t + i64.const 4294967295 + i64.and + i64.add + local.set $w + local.get $w + i64.const 2147483647 + i64.add + local.set $w + local.get $t + i64.const 32 + i64.shr_u + local.set $t + local.get $w + i64.const 32 + i64.shr_u + local.set $w + local.get $u1 + local.get $v1 + i64.mul + local.get $t + i64.add + local.get $w + i64.add + br $~lib/util/number/umul64f|inlined.0 + end + local.set $w_frc + block $~lib/util/number/umul64e|inlined.0 (result i32) + local.get $exp + local.set $e1 + local.get $exp_pow + local.set $e2 + local.get $e1 + local.get $e2 + i32.add + i32.const 64 + i32.add + br $~lib/util/number/umul64e|inlined.0 + end + local.set $w_exp + block $~lib/util/number/umul64f|inlined.1 (result i64) + global.get $~lib/util/number/_frc_plus + local.set $u|41 + local.get $frc_pow + local.set $v|42 + local.get $u|41 + i64.const 4294967295 + i64.and + local.set $u0|43 + local.get $v|42 + i64.const 4294967295 + i64.and + local.set $v0|44 + local.get $u|41 + i64.const 32 + i64.shr_u + local.set $u1|45 + local.get $v|42 + i64.const 32 + i64.shr_u + local.set $v1|46 + local.get $u0|43 + local.get $v0|44 + i64.mul + local.set $l|47 + local.get $u1|45 + local.get $v0|44 + i64.mul + local.get $l|47 + i64.const 32 + i64.shr_u + i64.add + local.set $t|48 + local.get $u0|43 + local.get $v1|46 + i64.mul + local.get $t|48 + i64.const 4294967295 + i64.and + i64.add + local.set $w|49 + local.get $w|49 + i64.const 2147483647 + i64.add + local.set $w|49 + local.get $t|48 + i64.const 32 + i64.shr_u + local.set $t|48 + local.get $w|49 + i64.const 32 + i64.shr_u + local.set $w|49 + local.get $u1|45 + local.get $v1|46 + i64.mul + local.get $t|48 + i64.add + local.get $w|49 + i64.add + br $~lib/util/number/umul64f|inlined.1 + end + i64.const 1 + i64.sub + local.set $wp_frc + block $~lib/util/number/umul64e|inlined.1 (result i32) + global.get $~lib/util/number/_exp + local.set $e1|51 + local.get $exp_pow + local.set $e2|52 + local.get $e1|51 + local.get $e2|52 + i32.add + i32.const 64 + i32.add + br $~lib/util/number/umul64e|inlined.1 + end + local.set $wp_exp + block $~lib/util/number/umul64f|inlined.2 (result i64) + global.get $~lib/util/number/_frc_minus + local.set $u|54 + local.get $frc_pow + local.set $v|55 + local.get $u|54 + i64.const 4294967295 + i64.and + local.set $u0|56 + local.get $v|55 + i64.const 4294967295 + i64.and + local.set $v0|57 + local.get $u|54 + i64.const 32 + i64.shr_u + local.set $u1|58 + local.get $v|55 + i64.const 32 + i64.shr_u + local.set $v1|59 + local.get $u0|56 + local.get $v0|57 + i64.mul + local.set $l|60 + local.get $u1|58 + local.get $v0|57 + i64.mul + local.get $l|60 + i64.const 32 + i64.shr_u + i64.add + local.set $t|61 + local.get $u0|56 + local.get $v1|59 + i64.mul + local.get $t|61 + i64.const 4294967295 + i64.and + i64.add + local.set $w|62 + local.get $w|62 + i64.const 2147483647 + i64.add + local.set $w|62 + local.get $t|61 + i64.const 32 + i64.shr_u + local.set $t|61 + local.get $w|62 + i64.const 32 + i64.shr_u + local.set $w|62 + local.get $u1|58 + local.get $v1|59 + i64.mul + local.get $t|61 + i64.add + local.get $w|62 + i64.add + br $~lib/util/number/umul64f|inlined.2 + end + i64.const 1 + i64.add + local.set $wm_frc + local.get $wp_frc + local.get $wm_frc + i64.sub + local.set $delta + 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|6 + call $~lib/util/number/genDigits + br $~lib/util/number/grisu2|inlined.0 end - local.get $value - local.set $var$5 - local.get $buffer - local.set $var$4 - local.get $sign - local.set $var$3 - local.get $var$5 - i64.reinterpret_f64 - local.set $var$6 - local.get $var$6 - i64.const 9218868437227405312 - i64.and - i64.const 52 - i64.shr_u - i32.wrap_i64 - local.set $var$7 - local.get $var$6 - i64.const 4503599627370495 - i64.and - local.set $var$8 - local.get $var$7 - i32.const 0 - i32.ne - i64.extend_i32_u - i64.const 52 - i64.shl - local.get $var$8 - i64.add - local.set $var$9 - local.get $var$7 - i32.const 1 - local.get $var$7 - select - i32.const 1023 - i32.const 52 - i32.add - i32.sub - local.set $var$7 - local.get $var$9 - local.set $var$11 - local.get $var$7 - local.set $var$10 - local.get $var$11 - i64.const 1 - i64.shl - i64.const 1 - i64.add - local.set $var$12 - local.get $var$10 - i32.const 1 - i32.sub - local.set $var$13 - local.get $var$12 - i64.clz - i32.wrap_i64 - local.set $var$14 - local.get $var$12 - local.get $var$14 - i64.extend_i32_s - i64.shl - local.set $var$12 - local.get $var$13 - local.get $var$14 - i32.sub - local.set $var$13 - i32.const 1 - local.get $var$11 - i64.const 4503599627370496 - i64.eq - i32.add - local.set $var$15 - local.get $var$12 - global.set $~lib/util/number/_frc_plus - local.get $var$11 - local.get $var$15 - i64.extend_i32_s - i64.shl - i64.const 1 - i64.sub - local.get $var$10 - local.get $var$15 - i32.sub - local.get $var$13 - i32.sub - i64.extend_i32_s - i64.shl - global.set $~lib/util/number/_frc_minus - local.get $var$13 - global.set $~lib/util/number/_exp - global.get $~lib/util/number/_exp - local.set $var$10 - i32.const -61 - local.get $var$10 - i32.sub - f64.convert_i32_s - f64.const 0.30102999566398114 - f64.mul - f64.const 347 - f64.add - local.set $var$16 - local.get $var$16 - i32.trunc_sat_f64_s - local.set $var$15 - local.get $var$15 - local.get $var$15 - f64.convert_i32_s - local.get $var$16 - f64.ne - i32.add - local.set $var$15 - local.get $var$15 - i32.const 3 - i32.shr_s - i32.const 1 - i32.add - local.set $var$14 - i32.const 348 - local.get $var$14 - i32.const 3 - i32.shl - i32.sub - global.set $~lib/util/number/_K - i32.const 2488 - local.get $var$14 - i32.const 3 - i32.shl - i32.add - i64.load $0 - global.set $~lib/util/number/_frc_pow - i32.const 3184 - local.get $var$14 - i32.const 1 - i32.shl - i32.add - i32.load16_s $0 - global.set $~lib/util/number/_exp_pow - local.get $var$9 - i64.clz - i32.wrap_i64 - local.set $var$14 - local.get $var$9 - local.get $var$14 - i64.extend_i32_s - i64.shl - local.set $var$9 - local.get $var$7 - local.get $var$14 - i32.sub - local.set $var$7 - global.get $~lib/util/number/_frc_pow - local.set $var$12 - global.get $~lib/util/number/_exp_pow - local.set $var$15 - local.get $var$9 - local.set $var$17 - local.get $var$12 - local.set $var$11 - local.get $var$17 - i64.const 4294967295 - i64.and - local.set $var$18 - local.get $var$11 - i64.const 4294967295 - i64.and - local.set $var$19 - local.get $var$17 - i64.const 32 - i64.shr_u - local.set $var$20 - local.get $var$11 - i64.const 32 - i64.shr_u - local.set $var$21 - local.get $var$18 - local.get $var$19 - i64.mul - local.set $var$22 - local.get $var$20 - local.get $var$19 - i64.mul - local.get $var$22 - i64.const 32 - i64.shr_u - i64.add - local.set $var$23 - local.get $var$18 - local.get $var$21 - i64.mul - local.get $var$23 - i64.const 4294967295 - i64.and - i64.add - local.set $var$24 - local.get $var$24 - i64.const 2147483647 - i64.add - local.set $var$24 - local.get $var$23 - i64.const 32 - i64.shr_u - local.set $var$23 - local.get $var$24 - i64.const 32 - i64.shr_u - local.set $var$24 - local.get $var$20 - local.get $var$21 - i64.mul - local.get $var$23 - i64.add - local.get $var$24 - i64.add - local.set $var$24 - local.get $var$7 - local.set $var$10 - local.get $var$15 - local.set $var$13 - local.get $var$10 - local.get $var$13 - i32.add - i32.const 64 - i32.add - local.set $var$10 - global.get $~lib/util/number/_frc_plus - local.set $var$17 - local.get $var$12 - local.set $var$11 - local.get $var$17 - i64.const 4294967295 - i64.and - local.set $var$23 - local.get $var$11 - i64.const 4294967295 - i64.and - local.set $var$22 - local.get $var$17 - i64.const 32 - i64.shr_u - local.set $var$21 - local.get $var$11 - i64.const 32 - i64.shr_u - local.set $var$20 - local.get $var$23 - local.get $var$22 - i64.mul - local.set $var$19 - local.get $var$21 - local.get $var$22 - i64.mul - local.get $var$19 - i64.const 32 - i64.shr_u - i64.add - local.set $var$18 - local.get $var$23 - local.get $var$20 - i64.mul - local.get $var$18 - i64.const 4294967295 - i64.and - i64.add - local.set $var$25 - local.get $var$25 - i64.const 2147483647 - i64.add - local.set $var$25 - local.get $var$18 - i64.const 32 - i64.shr_u - local.set $var$18 - local.get $var$25 - i64.const 32 - i64.shr_u - local.set $var$25 - local.get $var$21 - local.get $var$20 - i64.mul - local.get $var$18 - i64.add - local.get $var$25 - i64.add - i64.const 1 - i64.sub - local.set $var$25 - global.get $~lib/util/number/_exp - local.set $var$26 - local.get $var$15 - local.set $var$13 - local.get $var$26 - local.get $var$13 - i32.add - i32.const 64 - i32.add - local.set $var$26 - global.get $~lib/util/number/_frc_minus - local.set $var$17 - local.get $var$12 - local.set $var$11 - local.get $var$17 - i64.const 4294967295 - i64.and - local.set $var$18 - local.get $var$11 - i64.const 4294967295 - i64.and - local.set $var$19 - local.get $var$17 - i64.const 32 - i64.shr_u - local.set $var$20 - local.get $var$11 - i64.const 32 - i64.shr_u - local.set $var$21 - local.get $var$18 - local.get $var$19 - i64.mul - local.set $var$22 - local.get $var$20 - local.get $var$19 - i64.mul - local.get $var$22 - i64.const 32 - i64.shr_u - i64.add - local.set $var$23 - local.get $var$18 - local.get $var$21 - i64.mul - local.get $var$23 - i64.const 4294967295 - i64.and - i64.add - local.set $var$27 - local.get $var$27 - i64.const 2147483647 - i64.add - local.set $var$27 - local.get $var$23 - i64.const 32 - i64.shr_u - local.set $var$23 - local.get $var$27 - i64.const 32 - i64.shr_u - local.set $var$27 - local.get $var$20 - local.get $var$21 - i64.mul - local.get $var$23 - i64.add - local.get $var$27 - i64.add - i64.const 1 - i64.add - local.set $var$27 - local.get $var$25 - local.get $var$27 - i64.sub - local.set $var$23 - local.get $var$4 - local.get $var$24 - local.get $var$10 - local.get $var$25 - local.get $var$26 - local.get $var$23 - local.get $var$3 - call $~lib/util/number/genDigits local.set $len local.get $buffer local.get $sign @@ -3985,10 +4193,12 @@ local.get $len local.get $sign i32.add + return ) (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/number/Bool#toString (param $this i32) (param $radix i32) (result i32) local.get $this @@ -3997,6 +4207,7 @@ else i32.const 3616 end + return ) (func $~lib/number/F32.isSafeInteger (param $value f32) (result i32) local.get $value @@ -4011,6 +4222,7 @@ else i32.const 0 end + return ) (func $~lib/number/F32.isInteger (param $value f32) (result i32) local.get $value @@ -4026,6 +4238,7 @@ else i32.const 0 end + return ) (func $~lib/number/F64.isSafeInteger (param $value f64) (result i32) local.get $value @@ -4040,6 +4253,7 @@ else i32.const 0 end + return ) (func $~lib/number/F64.isInteger (param $value f64) (result i32) local.get $value @@ -4055,6 +4269,7 @@ else i32.const 0 end + return ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) @@ -4074,24 +4289,28 @@ (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) (local $2 i32) local.get $0 - i32.load $0 - local.tee $2 - if - local.get $2 - local.get $1 - call $~lib/rt/itcms/__visit - end + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $~lib/object/Object~visit (param $0 i32) (param $1 i32) ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid block $~lib/arraybuffer/ArrayBufferView block $~lib/string/String block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + 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 $invalid + end + return end return end @@ -4112,28 +4331,125 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 20064 - i32.const 20112 + i32.const 36448 + i32.const 36496 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 $start:number (local $0 i32) - (local $1 f32) - (local $2 f64) - (local $3 i32) + (local $1 i32) + (local $2 f32) + (local $3 f64) + (local $4 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store $0 - memory.size $0 + i32.const 0 + i32.store + memory.size i32.const 16 i32.shl global.get $~lib/memory/__heap_base @@ -4153,17 +4469,12 @@ global.get $number/a i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 2208 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4177,17 +4488,12 @@ f64.const 2 i32.const 0 call $~lib/number/F64#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3424 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4201,17 +4507,12 @@ i32.const 3 i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3456 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4225,17 +4526,12 @@ i32.const -5 i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3488 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4249,17 +4545,12 @@ i32.const 4 i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3520 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4277,17 +4568,12 @@ global.get $number/a i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3552 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4305,17 +4591,12 @@ global.get $number/a i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 2208 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4330,17 +4611,12 @@ i32.eqz i32.const 0 call $~lib/number/Bool#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3584 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4355,17 +4631,12 @@ i32.eqz i32.const 0 call $~lib/number/Bool#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3616 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4384,17 +4655,12 @@ local.get $0 i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 2208 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4406,24 +4672,19 @@ unreachable end global.get $number/a - local.tee $0 + local.tee $1 i32.const 1 i32.sub global.set $number/a - local.get $0 + local.get $1 i32.const 10 call $~lib/number/I32#toString - local.set $3 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 - local.get $3 + local.get $4 + i32.store + local.get $4 i32.const 3552 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store $0 offset=4 - local.get $3 call $~lib/string/String.__eq i32.eqz if @@ -4435,8 +4696,8 @@ unreachable end global.get $~lib/number/F32.NaN - local.tee $1 - local.get $1 + local.tee $2 + local.get $2 f32.ne drop global.get $~lib/builtins/f32.MIN_SAFE_INTEGER @@ -4704,8 +4965,8 @@ unreachable end global.get $~lib/number/F64.NaN - local.tee $2 - local.get $2 + local.tee $3 + local.get $3 f64.ne drop global.get $~lib/builtins/f64.MIN_SAFE_INTEGER @@ -4973,47 +5234,77 @@ unreachable end f64.const 1 - global.get $~lib/builtins/f32.NaN - f64.promote_f32 + f64.const nan:0x8000000000000 f64.eq i32.eqz drop + f64.const nan:0x8000000000000 global.get $~lib/number/F32.NaN - f32.const nan:0x400000 - f32.eq + f64.promote_f32 + f64.eq i32.eqz drop - f64.const nan:0x8000000000000 + global.get $~lib/number/F64.NaN f64.const 1 f64.eq i32.eqz drop f64.const 1 - global.get $~lib/builtins/f32.NaN - f64.promote_f32 + f64.const nan:0x8000000000000 f64.ne drop + f64.const nan:0x8000000000000 global.get $~lib/number/F32.NaN - f32.const nan:0x400000 - f32.ne + f64.promote_f32 + f64.ne drop - f64.const nan:0x8000000000000 + global.get $~lib/builtins/f64.NaN f64.const 1 f64.ne drop + f64.const 0 + f64.const -0 + f64.eq + drop + f64.const -0 + f64.const -0 + f64.eq + drop + f64.const -0 + f64.const 0 + f64.eq + drop + f32.const 0 + f32.const -0 + f32.eq + drop + f32.const -0 + f32.const -0 + f32.eq + drop + f32.const -0 + f32.const 0 + f32.eq + drop global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/util/number/itoa32 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) + (func $~lib/util/number/itoa32 (param $value i32) (param $radix i32) (result i32) + (local $sign i32) + (local $out i32) + (local $decimals i32) + (local $buffer i32) + (local $num i32) + (local $offset i32) + (local $decimals|8 i32) + (local $buffer|9 i32) + (local $num|10 i32) + (local $offset|11 i32) + (local $val32 i32) + (local $decimals|13 i32) + (local $14 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -5021,14 +5312,14 @@ call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.store $0 - local.get $1 + i32.store + local.get $radix i32.const 2 i32.lt_s if (result i32) i32.const 1 else - local.get $1 + local.get $radix i32.const 36 i32.gt_s end @@ -5040,151 +5331,154 @@ call $~lib/builtins/abort unreachable end - local.get $0 + local.get $value i32.eqz if i32.const 224 - local.set $8 + local.set $14 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $8 + local.get $14 return end - local.get $0 + local.get $value i32.const 31 i32.shr_u i32.const 1 i32.shl - local.set $2 - local.get $2 + local.set $sign + local.get $sign if i32.const 0 - local.get $0 + local.get $value i32.sub - local.set $0 + local.set $value end - local.get $1 + local.get $radix i32.const 10 i32.eq if - local.get $0 + local.get $value call $~lib/util/number/decimalCount32 - local.set $4 + local.set $decimals global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $decimals i32.const 1 i32.shl - local.get $2 + local.get $sign i32.add - i32.const 1 + i32.const 2 call $~lib/rt/itcms/__new - local.tee $3 - i32.store $0 - local.get $3 - local.get $2 + local.tee $out + i32.store + local.get $out + local.get $sign i32.add - local.set $7 - local.get $0 - local.set $6 - local.get $4 - local.set $5 + local.set $buffer + local.get $value + local.set $num + local.get $decimals + local.set $offset i32.const 0 i32.const 1 i32.ge_s drop - local.get $7 - local.get $6 - local.get $5 + local.get $buffer + local.get $num + local.get $offset call $~lib/util/number/utoa32_dec_lut else - local.get $1 + local.get $radix i32.const 16 i32.eq if i32.const 31 - local.get $0 + local.get $value i32.clz i32.sub i32.const 2 i32.shr_s i32.const 1 i32.add - local.set $4 + local.set $decimals|8 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $decimals|8 i32.const 1 i32.shl - local.get $2 + local.get $sign i32.add - i32.const 1 + i32.const 2 call $~lib/rt/itcms/__new - local.tee $3 - i32.store $0 - local.get $3 - local.get $2 + local.tee $out + i32.store + local.get $out + local.get $sign i32.add - local.set $7 - local.get $0 - local.set $6 - local.get $4 - local.set $5 + local.set $buffer|9 + local.get $value + local.set $num|10 + local.get $decimals|8 + local.set $offset|11 i32.const 0 i32.const 1 i32.ge_s drop - local.get $7 - local.get $6 + local.get $buffer|9 + local.get $num|10 i64.extend_i32_u - local.get $5 + local.get $offset|11 call $~lib/util/number/utoa_hex_lut else - local.get $0 - local.set $4 - local.get $4 + local.get $value + local.set $val32 + local.get $val32 i64.extend_i32_u - local.get $1 + local.get $radix call $~lib/util/number/ulog_base - local.set $7 + local.set $decimals|13 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $decimals|13 i32.const 1 i32.shl - local.get $2 + local.get $sign i32.add - i32.const 1 + i32.const 2 call $~lib/rt/itcms/__new - local.tee $3 - i32.store $0 - local.get $3 - local.get $2 + local.tee $out + i32.store + local.get $out + local.get $sign i32.add - local.get $4 + local.get $val32 i64.extend_i32_u - local.get $7 - local.get $1 + local.get $decimals|13 + local.get $radix call $~lib/util/number/utoa64_any_core end end - local.get $2 + local.get $sign if - local.get $3 + local.get $out i32.const 45 - i32.store16 $0 + i32.store16 end - local.get $3 - local.set $8 + local.get $out + local.set $14 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $8 + local.get $14 + return ) - (func $~lib/util/number/dtoa (param $0 f64) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 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 $5 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -5192,76 +5486,67 @@ call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.store $0 - local.get $0 - f64.const 0 - f64.eq - if - i32.const 2288 - 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 $0 - local.get $0 - f64.sub - f64.const 0 - f64.eq - i32.eqz - if - local.get $0 - local.get $0 - f64.ne + i32.store + 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 2320 - 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 2288 + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 2352 - i32.const 2400 - local.get $0 + 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 2320 + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 2352 + i32.const 2400 + local.get $value|1 + f64.const 0 + f64.lt + select + br $~lib/util/number/dtoa_impl|inlined.0 + end + i32.const 2432 + 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 2432 + local.get $size + memory.copy + local.get $result + br $~lib/util/number/dtoa_impl|inlined.0 end - i32.const 2432 - 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 1 - call $~lib/rt/itcms/__new - local.tee $2 - i32.store $0 - local.get $2 - i32.const 2432 - local.get $1 - memory.copy $0 $0 - local.get $2 - 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/number.json b/tests/compiler/number.json index d823d836bf..1bdd02b1be 100644 --- a/tests/compiler/number.json +++ b/tests/compiler/number.json @@ -1,18 +1,4 @@ { "asc_flags": [ - ], - "stderr": [ - "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", - "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", - "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", - "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", - "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", - "AS907: 'NaN' does not compare equal to any other value including itself. Use isNaN(x) instead.", - "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", - "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", - "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", - "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", - "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters.", - "AS908: Comparison with -0.0 is sign insensitive. Use Object.is(x, -0.0) if the sign matters." ] } diff --git a/tests/compiler/number.release.wat b/tests/compiler/number.release.wat index e609564afd..200a4f5ee8 100644 --- a/tests/compiler/number.release.wat +++ b/tests/compiler/number.release.wat @@ -1,13 +1,14 @@ (module - (type $none_=>_none (func)) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_i32_=>_none (func (param i32 i32))) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $none_=>_i32 (func (result i32))) - (type $i64_i64_i32_i64_=>_i32 (func (param i64 i64 i32 i64) (result i32))) + (type $0 (func)) + (type $1 (func (param i32 i32) (result i32))) + (type $2 (func (param i32))) + (type $3 (func (param i32 i32))) + (type $4 (func (param i32) (result i32))) + (type $5 (func (param i32 i32 i32 i32))) + (type $6 (func (param i32 i32 i64))) + (type $7 (func (result i32))) + (type $8 (func (param i32 i32 i32))) + (type $9 (func (param i64 i64 i32 i64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $number/a (mut i32) (i32.const 1)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -23,75 +24,75 @@ (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 21068)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 37444)) (memory $0 1) - (data (i32.const 1036) "|") - (data (i32.const 1048) "\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006") - (data (i32.const 1164) "<") - (data (i32.const 1176) "\01\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s") - (data (i32.const 1228) "\1c") - (data (i32.const 1240) "\01\00\00\00\02\00\00\000") - (data (i32.const 1260) "<") - (data (i32.const 1272) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") - (data (i32.const 1324) "<") - (data (i32.const 1336) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") - (data (i32.const 1452) "<") - (data (i32.const 1464) "\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") - (data (i32.const 1516) ",") - (data (i32.const 1528) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") - (data (i32.const 1596) "<") - (data (i32.const 1608) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1660) "0\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") - (data (i32.const 2060) "\1c\04") - (data (i32.const 2072) "\01\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f") - (data (i32.const 3116) "\\") - (data (i32.const 3128) "\01\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z") - (data (i32.const 3212) "\1c") - (data (i32.const 3224) "\01\00\00\00\02\00\00\001") - (data (i32.const 3244) ",") - (data (i32.const 3256) "\01\00\00\00\12\00\00\00n\00u\00m\00b\00e\00r\00.\00t\00s") - (data (i32.const 3292) "\1c") - (data (i32.const 3304) "\01\00\00\00\06\00\00\000\00.\000") - (data (i32.const 3324) "\1c") - (data (i32.const 3336) "\01\00\00\00\06\00\00\00N\00a\00N") - (data (i32.const 3356) ",") - (data (i32.const 3368) "\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 3404) ",") - (data (i32.const 3416) "\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 3512) "\88\02\1c\08\a0\d5\8f\fav\bf>\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\0dXf\ab\a3&\f1\c3\de\93\f8\e2\f3\b8\80\ff\aa\a8\ad\b5\b5\8bJ|l\05_b\87S0\c14`\ff\bc\c9U&\ba\91\8c\85N\96\bd~)p$w\f9\df\8f\b8\e5\b8\9f\bd\df\a6\94}t\88\cf_\a9\f8\cf\9b\a8\8f\93pD\b9k\15\0f\bf\f8\f0\08\8a\b611eU%\b0\cd\ac\7f{\d0\c6\e2?\99\06;+*\c4\10\\\e4\d3\92si\99$$\aa\0e\ca\00\83\f2\b5\87\fd\eb\1a\11\92d\08\e5\bc\cc\88Po\t\cc\bc\8c,e\19\e2X\17\b7\d1\00\00\00\00\00\00@\9c\00\00\00\00\10\a5\d4\e8\00\00b\ac\c5\ebx\ad\84\t\94\f8x9?\81\b3\15\07\c9{\ce\97\c0p\\\ea{\ce2~\8fh\80\e9\ab\a48\d2\d5E\"\9a\17&\'O\9f\'\fb\c4\d41\a2c\ed\a8\ad\c8\8c8e\de\b0\dbe\ab\1a\8e\08\c7\83\9a\1dqB\f9\1d]\c4X\e7\1b\a6,iM\92\ea\8dp\1ad\ee\01\daJw\ef\9a\99\a3m\a2\85k}\b4{x\t\f2w\18\ddy\a1\e4T\b4\c2\c5\9b[\92\86[\86=]\96\c8\c5S5\c8\b3\a0\97\fa\\\b4*\95\e3_\a0\99\bd\9fF\de%\8c9\db4\c2\9b\a5\\\9f\98\a3r\9a\c6\f6\ce\be\e9TS\bf\dc\b7\e2A\"\f2\17\f3\fc\88\a5x\\\d3\9b\ce \cc\dfS!{\f3Z\16\98:0\1f\97\dc\b5\a0\e2\96\b3\e3\\S\d1\d9\a8\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\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