diff --git a/std/assembly/util/memory.ts b/std/assembly/util/memory.ts index 81469171c6..77981ea783 100644 --- a/std/assembly/util/memory.ts +++ b/std/assembly/util/memory.ts @@ -263,10 +263,30 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st // @ts-ignore: decorator @inline -export function memcmp(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c +export function memcmp(vl: usize, vr: usize, n: usize): i32 { if (vl == vr) return 0; - while (n != 0 && load(vl) == load(vr)) { - n--; vl++; vr++; + if (ASC_SHRINK_LEVEL < 2) { + if ((vl & 7) == (vr & 7)) { + while (vl & 7) { + if (!n) return 0; + let a = load(vl); + let b = load(vr); + if (a != b) return a - b; + n--; vl++; vr++; + } + while (n >= 8) { + if (load(vl) != load(vr)) break; + vl += 8; + vr += 8; + n -= 8; + } + } + } + while (n--) { + let a = load(vl); + let b = load(vr); + if (a != b) return a - b; + vl++; vr++; } - return n ? load(vl) - load(vr) : 0; + return 0; } diff --git a/std/assembly/util/string.ts b/std/assembly/util/string.ts index 3d7fdb807f..dcde4646ed 100644 --- a/std/assembly/util/string.ts +++ b/std/assembly/util/string.ts @@ -49,13 +49,26 @@ const Powers10Lo: f64[] = [ ]; export function compareImpl(str1: string, index1: usize, str2: string, index2: usize, len: usize): i32 { - var result = 0; var ptr1 = changetype(str1) + (index1 << 1); var ptr2 = changetype(str2) + (index2 << 1); - while (len && !(result = load(ptr1) - load(ptr2))) { - --len, ptr1 += 2, ptr2 += 2; + if (ASC_SHRINK_LEVEL < 2) { + if (len >= 4 && !((ptr1 & 7) | (ptr2 & 7))) { + do { + if (load(ptr1) != load(ptr2)) break; + ptr1 += 8; + ptr2 += 8; + len -= 4; + } while (len >= 4); + } } - return result; + while (len--) { + let a = load(ptr1); + let b = load(ptr2); + if (a != b) return a - b; + ptr1 += 2; + ptr2 += 2; + } + return 0; } export function isSpace(c: i32): bool { diff --git a/tests/compiler/builtins.optimized.wat b/tests/compiler/builtins.optimized.wat index cc18c11f31..6d779f3842 100644 --- a/tests/compiler/builtins.optimized.wat +++ b/tests/compiler/builtins.optimized.wat @@ -84,36 +84,83 @@ ) (func $~lib/util/string/compareImpl (; 8 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 9 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/builtins.untouched.wat b/tests/compiler/builtins.untouched.wat index 531613b635..1bad19eee8 100644 --- a/tests/compiler/builtins.untouched.wat +++ b/tests/compiler/builtins.untouched.wat @@ -77,6 +77,7 @@ (global $~lib/builtins/f64.MIN_SAFE_INTEGER f64 (f64.const -9007199254740991)) (global $~lib/builtins/f64.MAX_SAFE_INTEGER f64 (f64.const 9007199254740991)) (global $~lib/builtins/f64.EPSILON f64 (f64.const 2.220446049250313e-16)) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (export "memory" (memory $0)) (export "test" (func $builtins/test)) (start $start) @@ -126,59 +127,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/number.optimized.wat b/tests/compiler/number.optimized.wat index d53876ae0e..3bbcfc0314 100644 --- a/tests/compiler/number.optimized.wat +++ b/tests/compiler/number.optimized.wat @@ -257,36 +257,83 @@ ) (func $~lib/util/string/compareImpl (; 7 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 8 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/number.untouched.wat b/tests/compiler/number.untouched.wat index 826eba3516..8e5511c588 100644 --- a/tests/compiler/number.untouched.wat +++ b/tests/compiler/number.untouched.wat @@ -460,59 +460,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/resolve-binary.optimized.wat b/tests/compiler/resolve-binary.optimized.wat index 62b6c94c0d..2aaa88dace 100644 --- a/tests/compiler/resolve-binary.optimized.wat +++ b/tests/compiler/resolve-binary.optimized.wat @@ -79,36 +79,83 @@ ) (func $~lib/util/string/compareImpl (; 3 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 4 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/resolve-binary.untouched.wat b/tests/compiler/resolve-binary.untouched.wat index b3292d57da..82a2527b16 100644 --- a/tests/compiler/resolve-binary.untouched.wat +++ b/tests/compiler/resolve-binary.untouched.wat @@ -55,11 +55,11 @@ (data (i32.const 2264) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00p\00o\00w\00") (table $0 1 funcref) (elem (i32.const 0) $null) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $resolve-binary/a (mut i32) (i32.const 0)) (global $resolve-binary/f (mut f64) (f64.const 0)) (global $~lib/rt/stub/startOffset (mut i32) (i32.const 0)) (global $~lib/rt/stub/offset (mut i32) (i32.const 0)) - (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (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)) @@ -106,59 +106,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/resolve-elementaccess.optimized.wat b/tests/compiler/resolve-elementaccess.optimized.wat index 07ec87fd69..a9f85723ca 100644 --- a/tests/compiler/resolve-elementaccess.optimized.wat +++ b/tests/compiler/resolve-elementaccess.optimized.wat @@ -1628,36 +1628,83 @@ ) (func $~lib/util/string/compareImpl (; 18 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 19 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/resolve-elementaccess.untouched.wat b/tests/compiler/resolve-elementaccess.untouched.wat index c193750d5e..847a7d46e0 100644 --- a/tests/compiler/resolve-elementaccess.untouched.wat +++ b/tests/compiler/resolve-elementaccess.untouched.wat @@ -3532,59 +3532,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/resolve-function-expression.optimized.wat b/tests/compiler/resolve-function-expression.optimized.wat index 80f2c8139a..e1ef43255a 100644 --- a/tests/compiler/resolve-function-expression.optimized.wat +++ b/tests/compiler/resolve-function-expression.optimized.wat @@ -245,38 +245,81 @@ (func $~lib/util/string/compareImpl (; 10 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) + (local $4 i32) i32.const 128 local.set $2 - loop $continue|0 - local.get $1 - if (result i32) + local.get $0 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $1 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $2 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $1 + i32.const 4 + i32.sub + local.tee $1 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $1 + local.tee $3 i32.const 1 i32.sub local.set $1 - local.get $0 - i32.const 2 - i32.add - local.set $0 + local.get $3 + i32.eqz + br_if $break|1 local.get $2 - i32.const 2 - i32.add - local.set $2 - br $continue|0 + i32.load16_u + local.tee $3 + local.get $0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $4 + local.get $3 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $2 + i32.const 2 + i32.add + local.set $2 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 11 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) diff --git a/tests/compiler/resolve-function-expression.untouched.wat b/tests/compiler/resolve-function-expression.untouched.wat index 975bb7a130..66b4fd0668 100644 --- a/tests/compiler/resolve-function-expression.untouched.wat +++ b/tests/compiler/resolve-function-expression.untouched.wat @@ -435,59 +435,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/resolve-propertyaccess.optimized.wat b/tests/compiler/resolve-propertyaccess.optimized.wat index c491a4b1f9..4eeb7d176d 100644 --- a/tests/compiler/resolve-propertyaccess.optimized.wat +++ b/tests/compiler/resolve-propertyaccess.optimized.wat @@ -237,36 +237,83 @@ ) (func $~lib/util/string/compareImpl (; 7 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 8 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/resolve-propertyaccess.untouched.wat b/tests/compiler/resolve-propertyaccess.untouched.wat index 56b94b0437..1aba116117 100644 --- a/tests/compiler/resolve-propertyaccess.untouched.wat +++ b/tests/compiler/resolve-propertyaccess.untouched.wat @@ -437,59 +437,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/resolve-ternary.optimized.wat b/tests/compiler/resolve-ternary.optimized.wat index c2b41b2c03..910c6c4841 100644 --- a/tests/compiler/resolve-ternary.optimized.wat +++ b/tests/compiler/resolve-ternary.optimized.wat @@ -1913,6 +1913,7 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) local.get $0 call $~lib/rt/pure/__retain drop @@ -1920,43 +1921,91 @@ call $~lib/rt/pure/__retain drop local.get $0 - local.set $3 + local.tee $3 + i32.const 7 + i32.and local.get $1 - local.set $4 - loop $continue|0 - local.get $2 - if (result i32) + local.tee $4 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $3 - i32.load16_u + i64.load local.get $4 - i32.load16_u - i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $4 + i32.const 8 + i32.add + local.set $4 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $5 i32.const 1 i32.sub local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 + local.get $5 + i32.eqz + br_if $break|1 local.get $4 - i32.const 2 - i32.add - local.set $4 - br $continue|0 + i32.load16_u + local.tee $5 + local.get $3 + i32.load16_u + local.tee $6 + i32.ne + if + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $6 + local.get $5 + i32.sub + return + else + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $4 + i32.const 2 + i32.add + local.set $4 + br $continue|1 + end + unreachable end end local.get $0 call $~lib/rt/pure/__release local.get $1 call $~lib/rt/pure/__release - local.get $5 + i32.const 0 ) (func $~lib/string/String.__eq (; 31 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/resolve-ternary.untouched.wat b/tests/compiler/resolve-ternary.untouched.wat index 7e7773a649..835bcaf82f 100644 --- a/tests/compiler/resolve-ternary.untouched.wat +++ b/tests/compiler/resolve-ternary.untouched.wat @@ -3566,59 +3566,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/pure/__retain drop local.get $2 call $~lib/rt/pure/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/pure/__release diff --git a/tests/compiler/resolve-unary.optimized.wat b/tests/compiler/resolve-unary.optimized.wat index d6f4e4048d..02da945fdd 100644 --- a/tests/compiler/resolve-unary.optimized.wat +++ b/tests/compiler/resolve-unary.optimized.wat @@ -245,36 +245,83 @@ ) (func $~lib/util/string/compareImpl (; 7 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 8 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/resolve-unary.untouched.wat b/tests/compiler/resolve-unary.untouched.wat index 189238ada3..88fd3c2c74 100644 --- a/tests/compiler/resolve-unary.untouched.wat +++ b/tests/compiler/resolve-unary.untouched.wat @@ -436,59 +436,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/std/array-access.optimized.wat b/tests/compiler/std/array-access.optimized.wat index 70f5d67550..5c9b4ddb2b 100644 --- a/tests/compiler/std/array-access.optimized.wat +++ b/tests/compiler/std/array-access.optimized.wat @@ -98,37 +98,78 @@ i32.shl local.get $0 i32.add - local.set $1 - loop $continue|0 - local.get $2 - if (result i32) + local.tee $1 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $1 - i32.load16_u + i64.load local.get $3 - i32.load16_u - i32.sub - local.tee $4 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $0 i32.const 1 i32.sub local.set $2 - local.get $1 - i32.const 2 - i32.add - local.set $1 + local.get $0 + i32.eqz + br_if $break|1 local.get $3 - i32.const 2 - i32.add - local.set $3 - br $continue|0 + i32.load16_u + local.tee $0 + local.get $1 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $4 + local.get $0 + i32.sub + return + else + local.get $1 + i32.const 2 + i32.add + local.set $1 + local.get $3 + i32.const 2 + i32.add + local.set $3 + br $continue|1 + end + unreachable end end - local.get $4 + i32.const 0 ) (func $~lib/string/String#startsWith (; 7 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) diff --git a/tests/compiler/std/array-access.untouched.wat b/tests/compiler/std/array-access.untouched.wat index 224fcd7c50..a0b964354f 100644 --- a/tests/compiler/std/array-access.untouched.wat +++ b/tests/compiler/std/array-access.untouched.wat @@ -15,6 +15,7 @@ (data (i32.const 240) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00n\00u\00l\00l\00") (table $0 1 funcref) (elem (i32.const 0) $null) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (export "memory" (memory $0)) (export "i32ArrayArrayElementAccess" (func $std/array-access/i32ArrayArrayElementAccess)) (export "stringArrayPropertyAccess" (func $std/array-access/stringArrayPropertyAccess)) @@ -190,59 +191,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index 17f3638e63..73fb1e6d55 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -6662,6 +6662,7 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) local.get $0 call $~lib/rt/pure/__retain drop @@ -6669,43 +6670,91 @@ call $~lib/rt/pure/__retain drop local.get $0 - local.set $3 + local.tee $3 + i32.const 7 + i32.and local.get $1 - local.set $4 - loop $continue|0 - local.get $2 - if (result i32) + local.tee $4 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $3 - i32.load16_u + i64.load local.get $4 - i32.load16_u - i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $4 + i32.const 8 + i32.add + local.set $4 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $5 i32.const 1 i32.sub local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 + local.get $5 + i32.eqz + br_if $break|1 local.get $4 - i32.const 2 - i32.add - local.set $4 - br $continue|0 + i32.load16_u + local.tee $5 + local.get $3 + i32.load16_u + local.tee $6 + i32.ne + if + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $6 + local.get $5 + i32.sub + return + else + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $4 + i32.const 2 + i32.add + local.set $4 + br $continue|1 + end + unreachable end end local.get $0 call $~lib/rt/pure/__release local.get $1 call $~lib/rt/pure/__release - local.get $5 + i32.const 0 ) (func $~lib/util/sort/COMPARATOR<~lib/string/String | null>~anonymous|0 (; 145 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index 108f78f14d..1ec394728a 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -10562,59 +10562,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/pure/__retain drop local.get $2 call $~lib/rt/pure/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/pure/__release diff --git a/tests/compiler/std/object-literal.optimized.wat b/tests/compiler/std/object-literal.optimized.wat index 3241bbc8f6..c2c9990265 100644 --- a/tests/compiler/std/object-literal.optimized.wat +++ b/tests/compiler/std/object-literal.optimized.wat @@ -110,38 +110,81 @@ (func $~lib/util/string/compareImpl (; 4 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) + (local $4 i32) i32.const 24 local.set $2 - loop $continue|0 - local.get $1 - if (result i32) + local.get $0 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $1 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $2 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $1 + i32.const 4 + i32.sub + local.tee $1 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $1 + local.tee $3 i32.const 1 i32.sub local.set $1 - local.get $0 - i32.const 2 - i32.add - local.set $0 + local.get $3 + i32.eqz + br_if $break|1 local.get $2 - i32.const 2 - i32.add - local.set $2 - br $continue|0 + i32.load16_u + local.tee $3 + local.get $0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $4 + local.get $3 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $2 + i32.const 2 + i32.add + local.set $2 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 5 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) diff --git a/tests/compiler/std/object-literal.untouched.wat b/tests/compiler/std/object-literal.untouched.wat index 7a57917f3f..13ae5e568a 100644 --- a/tests/compiler/std/object-literal.untouched.wat +++ b/tests/compiler/std/object-literal.untouched.wat @@ -13,6 +13,7 @@ (elem (i32.const 0) $null) (global $~lib/rt/stub/startOffset (mut i32) (i32.const 0)) (global $~lib/rt/stub/offset (mut i32) (i32.const 0)) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/heap/__heap_base i32 (i32.const 108)) (export "memory" (memory $0)) (start $start) @@ -142,59 +143,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/std/object.optimized.wat b/tests/compiler/std/object.optimized.wat index babdd25c48..5ab114e677 100644 --- a/tests/compiler/std/object.optimized.wat +++ b/tests/compiler/std/object.optimized.wat @@ -87,36 +87,83 @@ ) (func $~lib/util/string/compareImpl (; 8 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 9 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/std/object.untouched.wat b/tests/compiler/std/object.untouched.wat index 1964b0744b..ab034be979 100644 --- a/tests/compiler/std/object.untouched.wat +++ b/tests/compiler/std/object.untouched.wat @@ -18,6 +18,7 @@ (data (i32.const 128) "\00\00\00\00\01\00\00\00\01\00\00\00\00\00\00\00") (table $0 1 funcref) (elem (i32.const 0) $null) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (export "memory" (memory $0)) (start $start) (func $~lib/number/isNaN (; 1 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) @@ -101,59 +102,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/std/string-encoding.optimized.wat b/tests/compiler/std/string-encoding.optimized.wat index 54ac4558aa..69fb402a54 100644 --- a/tests/compiler/std/string-encoding.optimized.wat +++ b/tests/compiler/std/string-encoding.optimized.wat @@ -2023,6 +2023,7 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) local.get $0 call $~lib/rt/pure/__retain drop @@ -2030,43 +2031,91 @@ call $~lib/rt/pure/__retain drop local.get $0 - local.set $3 + local.tee $3 + i32.const 7 + i32.and local.get $1 - local.set $4 - loop $continue|0 - local.get $2 - if (result i32) + local.tee $4 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $3 - i32.load16_u + i64.load local.get $4 - i32.load16_u - i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $4 + i32.const 8 + i32.add + local.set $4 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $5 i32.const 1 i32.sub local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 + local.get $5 + i32.eqz + br_if $break|1 local.get $4 - i32.const 2 - i32.add - local.set $4 - br $continue|0 + i32.load16_u + local.tee $5 + local.get $3 + i32.load16_u + local.tee $6 + i32.ne + if + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $6 + local.get $5 + i32.sub + return + else + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $4 + i32.const 2 + i32.add + local.set $4 + br $continue|1 + end + unreachable end end local.get $0 call $~lib/rt/pure/__release local.get $1 call $~lib/rt/pure/__release - local.get $5 + i32.const 0 ) (func $~lib/string/String.__eq (; 38 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/std/string-encoding.untouched.wat b/tests/compiler/std/string-encoding.untouched.wat index eb9da63f99..14de432e7c 100644 --- a/tests/compiler/std/string-encoding.untouched.wat +++ b/tests/compiler/std/string-encoding.untouched.wat @@ -3565,59 +3565,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/pure/__retain drop local.get $2 call $~lib/rt/pure/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/pure/__release diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index 62292d3d0d..b6103f3ee9 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -2194,6 +2194,7 @@ (func $~lib/util/string/compareImpl (; 34 ;) (type $FUNCSIG$iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) + (local $6 i32) local.get $0 call $~lib/rt/pure/__retain drop @@ -2205,43 +2206,91 @@ i32.shl local.get $0 i32.add - local.set $1 + local.tee $4 + i32.const 7 + i32.and local.get $2 - local.set $4 - loop $continue|0 - local.get $3 - if (result i32) - local.get $1 - i32.load16_u + local.tee $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $3 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $4 - i32.load16_u - i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $4 + i32.const 8 + i32.add + local.set $4 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $3 + i32.const 4 + i32.sub + local.tee $3 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $3 + local.tee $5 i32.const 1 i32.sub local.set $3 + local.get $5 + i32.eqz + br_if $break|1 local.get $1 - i32.const 2 - i32.add - local.set $1 + i32.load16_u + local.tee $5 local.get $4 - i32.const 2 - i32.add - local.set $4 - br $continue|0 + i32.load16_u + local.tee $6 + i32.ne + if + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $6 + local.get $5 + i32.sub + return + else + local.get $4 + i32.const 2 + i32.add + local.set $4 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end local.get $0 call $~lib/rt/pure/__release local.get $2 call $~lib/rt/pure/__release - local.get $5 + i32.const 0 ) (func $~lib/string/String.__eq (; 35 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index 557e8f3b35..61f0d93f1d 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -3727,59 +3727,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/pure/__retain drop local.get $2 call $~lib/rt/pure/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/pure/__release diff --git a/tests/compiler/std/symbol.optimized.wat b/tests/compiler/std/symbol.optimized.wat index e51df11398..2f7eeb6472 100644 --- a/tests/compiler/std/symbol.optimized.wat +++ b/tests/compiler/std/symbol.optimized.wat @@ -518,36 +518,83 @@ ) (func $~lib/util/string/compareImpl (; 11 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 12 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/std/symbol.untouched.wat b/tests/compiler/std/symbol.untouched.wat index adfcf7687d..4abbbbb62a 100644 --- a/tests/compiler/std/symbol.untouched.wat +++ b/tests/compiler/std/symbol.untouched.wat @@ -691,59 +691,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index a8f757da49..29ffe11fdf 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -23776,6 +23776,7 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) local.get $0 call $~lib/rt/pure/__retain drop @@ -23783,43 +23784,91 @@ call $~lib/rt/pure/__retain drop local.get $0 - local.set $3 + local.tee $3 + i32.const 7 + i32.and local.get $1 - local.set $4 - loop $continue|0 - local.get $2 - if (result i32) + local.tee $4 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $3 - i32.load16_u + i64.load local.get $4 - i32.load16_u - i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $4 + i32.const 8 + i32.add + local.set $4 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $5 i32.const 1 i32.sub local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 + local.get $5 + i32.eqz + br_if $break|1 local.get $4 - i32.const 2 - i32.add - local.set $4 - br $continue|0 + i32.load16_u + local.tee $5 + local.get $3 + i32.load16_u + local.tee $6 + i32.ne + if + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $6 + local.get $5 + i32.sub + return + else + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $4 + i32.const 2 + i32.add + local.set $4 + br $continue|1 + end + unreachable end end local.get $0 call $~lib/rt/pure/__release local.get $1 call $~lib/rt/pure/__release - local.get $5 + i32.const 0 ) (func $~lib/string/String.__eq (; 364 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index d769eac0f5..f70b4b5f1f 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -33079,59 +33079,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/pure/__retain drop local.get $2 call $~lib/rt/pure/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/pure/__release diff --git a/tests/compiler/typeof.optimized.wat b/tests/compiler/typeof.optimized.wat index 89749e1108..c909cc17a2 100644 --- a/tests/compiler/typeof.optimized.wat +++ b/tests/compiler/typeof.optimized.wat @@ -32,36 +32,83 @@ ) (func $~lib/util/string/compareImpl (; 2 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - loop $continue|0 - local.get $2 - if (result i32) + (local $4 i32) + local.get $0 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + i32.const 4 + i32.ge_u + select + if + loop $continue|0 local.get $0 - i32.load16_u + i64.load local.get $1 - i32.load16_u - i32.sub - local.tee $3 - i32.eqz - else - i32.const 0 + i64.load + i64.eq + if + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 4 + i32.ge_u + br_if $continue|0 + end end - if + end + loop $continue|1 + block $break|1 local.get $2 + local.tee $3 i32.const 1 i32.sub local.set $2 + local.get $3 + i32.eqz + br_if $break|1 local.get $0 - i32.const 2 - i32.add - local.set $0 + i32.load16_u + local.tee $3 local.get $1 - i32.const 2 - i32.add - local.set $1 - br $continue|0 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $3 + local.get $4 + i32.sub + return + else + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|1 + end + unreachable end end - local.get $3 + i32.const 0 ) (func $~lib/string/String.__eq (; 3 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) diff --git a/tests/compiler/typeof.untouched.wat b/tests/compiler/typeof.untouched.wat index 5ed505370e..2102990eef 100644 --- a/tests/compiler/typeof.untouched.wat +++ b/tests/compiler/typeof.untouched.wat @@ -18,6 +18,7 @@ (table $0 2 funcref) (elem (i32.const 0) $null $start:typeof~anonymous|0) (global $typeof/SomeNamespace.a i32 (i32.const 1)) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $typeof/b (mut i32) (i32.const 1)) (global $typeof/i (mut i32) (i32.const 1)) (global $typeof/f (mut f32) (f32.const 1)) @@ -51,59 +52,114 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $0 call $~lib/rt/stub/__retain drop local.get $2 call $~lib/rt/stub/__retain drop - i32.const 0 - local.set $5 local.get $0 local.get $1 i32.const 1 i32.shl i32.add - local.set $6 + local.set $5 local.get $2 local.get $3 i32.const 1 i32.shl i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) + local.set $6 + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $break|0 + loop $continue|0 + local.get $5 + i64.load local.get $6 - i32.load16_u - local.get $7 - i32.load16_u + i64.load + i64.ne + if + br $break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 i32.sub - local.tee $5 - i32.eqz - else - i32.const 0 + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + br_if $continue|0 end - i32.eqz - br_if $break|0 + end + end + block $break|1 + loop $continue|1 local.get $4 + local.tee $7 i32.const 1 i32.sub local.set $4 + local.get $7 + i32.eqz + br_if $break|1 + local.get $5 + i32.load16_u + local.set $7 local.get $6 + i32.load16_u + local.set $8 + local.get $7 + local.get $8 + i32.ne + if + local.get $7 + local.get $8 + i32.sub + local.set $9 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $9 + return + end + local.get $5 i32.const 2 i32.add - local.set $6 - local.get $7 + local.set $5 + local.get $6 i32.const 2 i32.add - local.set $7 - br $continue|0 + local.set $6 + br $continue|1 end unreachable end - local.get $5 + i32.const 0 local.set $8 local.get $0 call $~lib/rt/stub/__release