From 827bb4afe8564946f47c69acc3e95ac2c46b50c4 Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Sun, 14 Jan 2018 02:41:13 +0100 Subject: [PATCH] Use move_memory in std Array#unshift --- std/assembly/array.ts | 23 +- .../compiler/std/array.optimized-inlined.wast | 3167 ----------------- tests/compiler/std/array.optimized.wast | 120 +- tests/compiler/std/array.wast | 147 +- 4 files changed, 167 insertions(+), 3290 deletions(-) delete mode 100644 tests/compiler/std/array.optimized-inlined.wast diff --git a/std/assembly/array.ts b/std/assembly/array.ts index 166b74e4..e3c0243b 100644 --- a/std/assembly/array.ts +++ b/std/assembly/array.ts @@ -71,16 +71,19 @@ export class Array { unshift(element: T): i32 { var oldCapacity = this.__capacity; - if (this.length >= oldCapacity) - this.__grow(max(this.length + 1, oldCapacity * 2)); - - // FIXME: this is inefficient because of two copies, one in __grow and one here - // move_memory(this.__memory + sizeof(), this.__memory, oldCapacity * sizeof()); - - if (oldCapacity) - for (var index: usize = oldCapacity; index > 0; --index) - store(this.__memory + index * sizeof(), load(this.__memory + (index - 1) * sizeof())); - + if (this.length >= oldCapacity) { + // inlined `this.__grow(max(this.length + 1, oldCapacity * 2))` (avoids moving twice) + var newCapacity = max(this.length + 1, oldCapacity * 2); + assert(newCapacity > this.__capacity); + var newMemory = allocate_memory(newCapacity * sizeof()); + if (this.__memory) { + move_memory(newMemory + sizeof(), this.__memory, oldCapacity * sizeof()); + free_memory(this.__memory); + } + this.__memory = newMemory; + this.__capacity = newCapacity; + } else + move_memory(this.__memory + sizeof(), this.__memory, oldCapacity * sizeof()); store(this.__memory, element); return ++this.length; } diff --git a/tests/compiler/std/array.optimized-inlined.wast b/tests/compiler/std/array.optimized-inlined.wast deleted file mode 100644 index dbfbab36..00000000 --- a/tests/compiler/std/array.optimized-inlined.wast +++ /dev/null @@ -1,3167 +0,0 @@ -(module - (type $ii (func (param i32) (result i32))) - (type $iiiv (func (param i32 i32 i32))) - (type $iv (func (param i32))) - (type $iiv (func (param i32 i32))) - (type $iii (func (param i32 i32) (result i32))) - (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) - (global $std/array/arr (mut i32) (i32.const 0)) - (global $std/array/i (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 4)) - (memory $0 1) - (export "memory" (memory $0)) - (start $start) - (func $std:heap/allocate_memory (; 0 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (if - (i32.eqz - (get_local $0) - ) - (return - (i32.const 0) - ) - ) - (set_local $1 - (current_memory) - ) - (if - (i32.gt_u - (i32.add - (get_global $std:heap/HEAP_OFFSET) - (get_local $0) - ) - (i32.shl - (get_local $1) - (i32.const 16) - ) - ) - (if - (i32.lt_s - (grow_memory - (select - (tee_local $2 - (i32.trunc_s/f64 - (f64.ceil - (f64.div - (f64.convert_u/i32 - (get_local $0) - ) - (f64.const 65536) - ) - ) - ) - ) - (tee_local $1 - (i32.sub - (i32.mul - (get_local $1) - (i32.const 2) - ) - (get_local $1) - ) - ) - (i32.gt_s - (get_local $2) - (get_local $1) - ) - ) - ) - (i32.const 0) - ) - (unreachable) - ) - ) - (set_local $1 - (get_global $std:heap/HEAP_OFFSET) - ) - (if - (block (result i32) - (set_global $std:heap/HEAP_OFFSET - (i32.add - (get_global $std:heap/HEAP_OFFSET) - (get_local $0) - ) - ) - (i32.and - (get_global $std:heap/HEAP_OFFSET) - (i32.const 7) - ) - ) - (set_global $std:heap/HEAP_OFFSET - (i32.add - (i32.or - (get_global $std:heap/HEAP_OFFSET) - (i32.const 7) - ) - (i32.const 1) - ) - ) - ) - (get_local $1) - ) - (func $std:heap/copy_memory (; 1 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) - (loop $continue|0 - (if - (if (result i32) - (get_local $2) - (i32.rem_u - (get_local $1) - (i32.const 4) - ) - (get_local $2) - ) - (block - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (br $continue|0) - ) - ) - ) - (if - (i32.eqz - (i32.rem_u - (get_local $0) - (i32.const 4) - ) - ) - (block - (loop $continue|1 - (if - (i32.ge_u - (get_local $2) - (i32.const 16) - ) - (block - (i32.store - (get_local $0) - (i32.load - (get_local $1) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (i32.load - (i32.add - (get_local $1) - (i32.const 4) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (i32.load - (i32.add - (get_local $1) - (i32.const 8) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 12) - ) - (i32.load - (i32.add - (get_local $1) - (i32.const 12) - ) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 16) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 16) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 16) - ) - ) - (br $continue|1) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 8) - ) - (block - (i32.store - (get_local $0) - (i32.load - (get_local $1) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (i32.load - (i32.add - (get_local $1) - (i32.const 4) - ) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 8) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 8) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 4) - ) - (block - (i32.store - (get_local $0) - (i32.load - (get_local $1) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 4) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 4) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 2) - ) - (block - (i32.store16 - (get_local $0) - (i32.load16_u - (get_local $1) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 2) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 2) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 1) - ) - (block - (set_local $3 - (get_local $0) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $3 - (get_local $1) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - ) - ) - (return) - ) - ) - (if - (i32.ge_u - (get_local $2) - (i32.const 32) - ) - (block $break|2 - (block $case2|2 - (block $case1|2 - (block $case0|2 - (block $tablify|0 - (br_table $case0|2 $case1|2 $case2|2 $tablify|0 - (i32.sub - (i32.rem_u - (get_local $0) - (i32.const 4) - ) - (i32.const 1) - ) - ) - ) - (br $break|2) - ) - (set_local $4 - (i32.load - (get_local $1) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 3) - ) - ) - (loop $continue|3 - (if - (i32.ge_u - (get_local $2) - (i32.const 17) - ) - (block - (i32.store - (get_local $0) - (i32.or - (i32.shr_u - (get_local $4) - (i32.const 24) - ) - (i32.shl - (tee_local $3 - (i32.load - (i32.add - (get_local $1) - (i32.const 1) - ) - ) - ) - (i32.const 8) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (i32.or - (i32.shr_u - (get_local $3) - (i32.const 24) - ) - (i32.shl - (tee_local $4 - (i32.load - (i32.add - (get_local $1) - (i32.const 5) - ) - ) - ) - (i32.const 8) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (i32.or - (i32.shr_u - (get_local $4) - (i32.const 24) - ) - (i32.shl - (tee_local $3 - (i32.load - (i32.add - (get_local $1) - (i32.const 9) - ) - ) - ) - (i32.const 8) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 12) - ) - (i32.or - (i32.shr_u - (get_local $3) - (i32.const 24) - ) - (i32.shl - (tee_local $4 - (i32.load - (i32.add - (get_local $1) - (i32.const 13) - ) - ) - ) - (i32.const 8) - ) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 16) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 16) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 16) - ) - ) - (br $continue|3) - ) - ) - ) - (br $break|2) - ) - (set_local $4 - (i32.load - (get_local $1) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 2) - ) - ) - (loop $continue|4 - (if - (i32.ge_u - (get_local $2) - (i32.const 18) - ) - (block - (i32.store - (get_local $0) - (i32.or - (i32.shr_u - (get_local $4) - (i32.const 16) - ) - (i32.shl - (tee_local $3 - (i32.load - (i32.add - (get_local $1) - (i32.const 2) - ) - ) - ) - (i32.const 16) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (i32.or - (i32.shr_u - (get_local $3) - (i32.const 16) - ) - (i32.shl - (tee_local $4 - (i32.load - (i32.add - (get_local $1) - (i32.const 6) - ) - ) - ) - (i32.const 16) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (i32.or - (i32.shr_u - (get_local $4) - (i32.const 16) - ) - (i32.shl - (tee_local $3 - (i32.load - (i32.add - (get_local $1) - (i32.const 10) - ) - ) - ) - (i32.const 16) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 12) - ) - (i32.or - (i32.shr_u - (get_local $3) - (i32.const 16) - ) - (i32.shl - (tee_local $4 - (i32.load - (i32.add - (get_local $1) - (i32.const 14) - ) - ) - ) - (i32.const 16) - ) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 16) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 16) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 16) - ) - ) - (br $continue|4) - ) - ) - ) - (br $break|2) - ) - (set_local $4 - (i32.load - (get_local $1) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|5 - (if - (i32.ge_u - (get_local $2) - (i32.const 19) - ) - (block - (i32.store - (get_local $0) - (i32.or - (i32.shr_u - (get_local $4) - (i32.const 8) - ) - (i32.shl - (tee_local $3 - (i32.load - (i32.add - (get_local $1) - (i32.const 3) - ) - ) - ) - (i32.const 24) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (i32.or - (i32.shr_u - (get_local $3) - (i32.const 8) - ) - (i32.shl - (tee_local $4 - (i32.load - (i32.add - (get_local $1) - (i32.const 7) - ) - ) - ) - (i32.const 24) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (i32.or - (i32.shr_u - (get_local $4) - (i32.const 8) - ) - (i32.shl - (tee_local $3 - (i32.load - (i32.add - (get_local $1) - (i32.const 11) - ) - ) - ) - (i32.const 24) - ) - ) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 12) - ) - (i32.or - (i32.shr_u - (get_local $3) - (i32.const 8) - ) - (i32.shl - (tee_local $4 - (i32.load - (i32.add - (get_local $1) - (i32.const 15) - ) - ) - ) - (i32.const 24) - ) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 16) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 16) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 16) - ) - ) - (br $continue|5) - ) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 16) - ) - (block - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 8) - ) - (block - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 4) - ) - (block - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 2) - ) - (block - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - ) - ) - (if - (i32.and - (get_local $2) - (i32.const 1) - ) - (block - (set_local $3 - (get_local $0) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $3 - (get_local $1) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - ) - ) - ) - (func $std:heap/move_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (if - (i32.eq - (get_local $0) - (get_local $1) - ) - (return) - ) - (if - (i32.and - (if (result i32) - (tee_local $3 - (i32.le_u - (i32.add - (get_local $1) - (get_local $2) - ) - (get_local $0) - ) - ) - (get_local $3) - (i32.le_u - (i32.add - (get_local $0) - (get_local $2) - ) - (get_local $1) - ) - ) - (i32.const 1) - ) - (block - (call $std:heap/copy_memory - (get_local $0) - (get_local $1) - (get_local $2) - ) - (return) - ) - ) - (if - (i32.lt_u - (get_local $0) - (get_local $1) - ) - (block - (if - (i32.eq - (i32.rem_u - (get_local $1) - (i32.const 8) - ) - (i32.rem_u - (get_local $0) - (i32.const 8) - ) - ) - (block - (loop $continue|0 - (if - (i32.rem_u - (get_local $0) - (i32.const 8) - ) - (block - (if - (i32.eqz - (get_local $2) - ) - (return) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (br $continue|0) - ) - ) - ) - (loop $continue|1 - (if - (i32.ge_u - (get_local $2) - (i32.const 8) - ) - (block - (i64.store - (get_local $0) - (i64.load - (get_local $1) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 8) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 8) - ) - ) - (set_local $1 - (i32.add - (get_local $1) - (i32.const 8) - ) - ) - (br $continue|1) - ) - ) - ) - ) - ) - (loop $continue|2 - (if - (get_local $2) - (block - (set_local $0 - (i32.add - (tee_local $3 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.store8 - (get_local $3) - (block (result i32) - (set_local $1 - (i32.add - (tee_local $3 - (get_local $1) - ) - (i32.const 1) - ) - ) - (i32.load8_u - (get_local $3) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (br $continue|2) - ) - ) - ) - ) - (block - (if - (i32.eq - (i32.rem_u - (get_local $1) - (i32.const 8) - ) - (i32.rem_u - (get_local $0) - (i32.const 8) - ) - ) - (block - (loop $continue|3 - (if - (i32.rem_u - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 8) - ) - (block - (if - (i32.eqz - (get_local $2) - ) - (return) - ) - (i32.store8 - (i32.add - (get_local $0) - (tee_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - ) - (i32.load8_u - (i32.add - (get_local $1) - (get_local $2) - ) - ) - ) - (br $continue|3) - ) - ) - ) - (loop $continue|4 - (if - (i32.ge_u - (get_local $2) - (i32.const 8) - ) - (block - (i64.store - (i32.add - (get_local $0) - (tee_local $2 - (i32.sub - (get_local $2) - (i32.const 8) - ) - ) - ) - (i64.load - (i32.add - (get_local $1) - (get_local $2) - ) - ) - ) - (br $continue|4) - ) - ) - ) - ) - ) - (loop $continue|5 - (if - (get_local $2) - (block - (i32.store8 - (i32.add - (get_local $0) - (tee_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - ) - (i32.load8_u - (i32.add - (get_local $1) - (get_local $2) - ) - ) - ) - (br $continue|5) - ) - ) - ) - ) - ) - ) - (func $std:array/Array#__grow (; 3 ;) (type $iiv) (param $0 i32) (param $1 i32) - (local $2 i32) - (local $3 i32) - (if - (i32.le_s - (get_local $1) - (i32.load offset=4 - (get_local $0) - ) - ) - (unreachable) - ) - (set_local $2 - (call $std:heap/allocate_memory - (i32.mul - (get_local $1) - (i32.const 4) - ) - ) - ) - (if - (i32.load - (get_local $0) - ) - (block - (call $std:heap/move_memory - (get_local $2) - (i32.load - (get_local $0) - ) - (i32.mul - (i32.load offset=4 - (get_local $0) - ) - (i32.const 4) - ) - ) - (block - (block $__inlined_func$std:heap/free_memory - (set_local $3 - (i32.load - (get_local $0) - ) - ) - (nop) - ) - ) - ) - ) - (i32.store - (get_local $0) - (get_local $2) - ) - (i32.store offset=4 - (get_local $0) - (get_local $1) - ) - ) - (func $std:array/Array#push (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (if - (i32.ge_u - (i32.load offset=8 - (get_local $0) - ) - (i32.load offset=4 - (get_local $0) - ) - ) - (call $std:array/Array#__grow - (get_local $0) - (select - (tee_local $2 - (i32.add - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (tee_local $3 - (i32.shl - (i32.load offset=4 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.gt_s - (get_local $2) - (get_local $3) - ) - ) - ) - ) - (i32.store - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (i32.load offset=8 - (get_local $0) - ) - (i32.const 4) - ) - ) - (get_local $1) - ) - (i32.store offset=8 - (get_local $0) - (tee_local $2 - (i32.add - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - ) - (get_local $2) - ) - (func $std:array/Array#__get (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (if - (i32.ge_u - (get_local $1) - (i32.load offset=4 - (get_local $0) - ) - ) - (unreachable) - ) - (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (get_local $1) - (i32.const 4) - ) - ) - ) - ) - (func $std:array/Array#pop (; 6 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (if - (i32.and - (if (result i32) - (tee_local $1 - (i32.lt_s - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (get_local $1) - (i32.gt_u - (i32.load offset=8 - (get_local $0) - ) - (i32.load offset=4 - (get_local $0) - ) - ) - ) - (i32.const 1) - ) - (unreachable) - ) - (i32.store offset=8 - (get_local $0) - (i32.sub - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (i32.load offset=8 - (get_local $0) - ) - (i32.const 4) - ) - ) - ) - ) - (func $std:array/Array#unshift (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (if - (i32.ge_u - (i32.load offset=8 - (get_local $0) - ) - (tee_local $2 - (i32.load offset=4 - (get_local $0) - ) - ) - ) - (call $std:array/Array#__grow - (get_local $0) - (select - (tee_local $3 - (i32.add - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (tee_local $4 - (i32.mul - (get_local $2) - (i32.const 2) - ) - ) - (i32.gt_s - (get_local $3) - (get_local $4) - ) - ) - ) - ) - (if - (get_local $2) - (loop $continue|0 - (if - (i32.gt_u - (get_local $2) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (get_local $2) - (i32.const 4) - ) - ) - (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (i32.sub - (get_local $2) - (i32.const 1) - ) - (i32.const 4) - ) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (br $continue|0) - ) - ) - ) - ) - (i32.store - (i32.load - (get_local $0) - ) - (get_local $1) - ) - (i32.store offset=8 - (get_local $0) - (tee_local $3 - (i32.add - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - ) - (get_local $3) - ) - (func $std:heap/set_memory (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i64) - (local $4 i32) - (if - (i32.eqz - (get_local $2) - ) - (return) - ) - (i32.store8 - (get_local $0) - (get_local $1) - ) - (i32.store8 - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 1) - ) - (get_local $1) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 2) - ) - (return) - ) - (i32.store8 - (i32.add - (get_local $0) - (i32.const 1) - ) - (get_local $1) - ) - (i32.store8 - (i32.add - (get_local $0) - (i32.const 2) - ) - (get_local $1) - ) - (i32.store8 - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 2) - ) - (get_local $1) - ) - (i32.store8 - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 3) - ) - (get_local $1) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 6) - ) - (return) - ) - (i32.store8 - (i32.add - (get_local $0) - (i32.const 3) - ) - (get_local $1) - ) - (i32.store8 - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 4) - ) - (get_local $1) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 8) - ) - (return) - ) - (i32.store - (tee_local $0 - (i32.add - (get_local $0) - (tee_local $4 - (i32.and - (i32.sub - (i32.const 0) - (get_local $0) - ) - (i32.const 3) - ) - ) - ) - ) - (tee_local $1 - (i32.mul - (get_local $1) - (i32.const 16843009) - ) - ) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (tee_local $2 - (i32.and - (i32.sub - (get_local $2) - (get_local $4) - ) - (i32.const -4) - ) - ) - ) - (i32.const 4) - ) - (get_local $1) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 8) - ) - (return) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (get_local $1) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (get_local $1) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 12) - ) - (get_local $1) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 8) - ) - (get_local $1) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 24) - ) - (return) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 12) - ) - (get_local $1) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 16) - ) - (get_local $1) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 20) - ) - (get_local $1) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 24) - ) - (get_local $1) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 28) - ) - (get_local $1) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 24) - ) - (get_local $1) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 20) - ) - (get_local $1) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 16) - ) - (get_local $1) - ) - (set_local $0 - (i32.add - (get_local $0) - (tee_local $4 - (i32.add - (i32.and - (get_local $0) - (i32.const 4) - ) - (i32.const 24) - ) - ) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (get_local $4) - ) - ) - (set_local $3 - (i64.or - (i64.extend_u/i32 - (get_local $1) - ) - (i64.shl - (i64.extend_u/i32 - (get_local $1) - ) - (i64.const 32) - ) - ) - ) - (loop $continue|0 - (if - (i32.ge_u - (get_local $2) - (i32.const 32) - ) - (block - (i64.store - (get_local $0) - (get_local $3) - ) - (i64.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (get_local $3) - ) - (i64.store - (i32.add - (get_local $0) - (i32.const 16) - ) - (get_local $3) - ) - (i64.store - (i32.add - (get_local $0) - (i32.const 24) - ) - (get_local $3) - ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 32) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (i32.const 32) - ) - ) - (br $continue|0) - ) - ) - ) - ) - (func $std:array/Array#shift (; 9 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (if - (i32.and - (if (result i32) - (tee_local $1 - (i32.lt_s - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (get_local $1) - (i32.gt_u - (i32.load offset=8 - (get_local $0) - ) - (i32.load offset=4 - (get_local $0) - ) - ) - ) - (i32.const 1) - ) - (unreachable) - ) - (set_local $1 - (i32.load - (i32.load - (get_local $0) - ) - ) - ) - (call $std:heap/move_memory - (i32.load - (get_local $0) - ) - (i32.add - (i32.load - (get_local $0) - ) - (i32.const 4) - ) - (i32.mul - (i32.sub - (i32.load offset=4 - (get_local $0) - ) - (i32.const 1) - ) - (i32.const 4) - ) - ) - (call $std:heap/set_memory - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (i32.sub - (i32.load offset=4 - (get_local $0) - ) - (i32.const 1) - ) - (i32.const 4) - ) - ) - (i32.const 0) - (i32.const 4) - ) - (i32.store offset=8 - (get_local $0) - (i32.sub - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (get_local $1) - ) - (func $start (; 10 ;) (type $v) - (set_global $std:heap/HEAP_OFFSET - (get_global $HEAP_BASE) - ) - (set_global $std/array/arr - (call $std:heap/allocate_memory - (i32.const 12) - ) - ) - (if - (i32.load offset=8 - (get_global $std/array/arr) - ) - (unreachable) - ) - (if - (i32.load offset=4 - (get_global $std/array/arr) - ) - (unreachable) - ) - (drop - (call $std:array/Array#push - (get_global $std/array/arr) - (i32.const 42) - ) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 42) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 1) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 1) - ) - (unreachable) - ) - (set_global $std/array/i - (call $std:array/Array#pop - (get_global $std/array/arr) - ) - ) - (if - (i32.ne - (get_global $std/array/i) - (i32.const 42) - ) - (unreachable) - ) - (if - (i32.load offset=8 - (get_global $std/array/arr) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 1) - ) - (unreachable) - ) - (drop - (call $std:array/Array#push - (get_global $std/array/arr) - (i32.const 43) - ) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 1) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 1) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 43) - ) - (unreachable) - ) - (drop - (call $std:array/Array#push - (get_global $std/array/arr) - (i32.const 44) - ) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 2) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 2) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 43) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 1) - ) - (i32.const 44) - ) - (unreachable) - ) - (drop - (call $std:array/Array#push - (get_global $std/array/arr) - (i32.const 45) - ) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 3) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 4) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 43) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 1) - ) - (i32.const 44) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 2) - ) - (i32.const 45) - ) - (unreachable) - ) - (drop - (call $std:array/Array#unshift - (get_global $std/array/arr) - (i32.const 42) - ) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 4) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 4) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 42) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 1) - ) - (i32.const 43) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 2) - ) - (i32.const 44) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 3) - ) - (i32.const 45) - ) - (unreachable) - ) - (drop - (call $std:array/Array#unshift - (get_global $std/array/arr) - (i32.const 41) - ) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 5) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 8) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 41) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 1) - ) - (i32.const 42) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 2) - ) - (i32.const 43) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 3) - ) - (i32.const 44) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 4) - ) - (i32.const 45) - ) - (unreachable) - ) - (set_global $std/array/i - (call $std:array/Array#shift - (get_global $std/array/arr) - ) - ) - (if - (i32.ne - (get_global $std/array/i) - (i32.const 41) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 4) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 8) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 42) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 1) - ) - (i32.const 43) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 2) - ) - (i32.const 44) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 3) - ) - (i32.const 45) - ) - (unreachable) - ) - (set_global $std/array/i - (call $std:array/Array#pop - (get_global $std/array/arr) - ) - ) - (if - (i32.ne - (get_global $std/array/i) - (i32.const 45) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=8 - (get_global $std/array/arr) - ) - (i32.const 3) - ) - (unreachable) - ) - (if - (i32.ne - (i32.load offset=4 - (get_global $std/array/arr) - ) - (i32.const 8) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 0) - ) - (i32.const 42) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 1) - ) - (i32.const 43) - ) - (unreachable) - ) - (if - (i32.ne - (call $std:array/Array#__get - (get_global $std/array/arr) - (i32.const 2) - ) - (i32.const 44) - ) - (unreachable) - ) - ) -) diff --git a/tests/compiler/std/array.optimized.wast b/tests/compiler/std/array.optimized.wast index 1a005641..02857b39 100644 --- a/tests/compiler/std/array.optimized.wast +++ b/tests/compiler/std/array.optimized.wast @@ -2168,79 +2168,99 @@ (i32.load offset=8 (get_local $0) ) - (tee_local $2 + (tee_local $4 (i32.load offset=4 (get_local $0) ) ) ) - (call $std:array/Array#__grow - (get_local $0) - (select - (tee_local $3 - (i32.add - (i32.load offset=8 - (get_local $0) + (block + (if + (i32.le_s + (tee_local $2 + (select + (tee_local $2 + (i32.add + (i32.load offset=8 + (get_local $0) + ) + (i32.const 1) + ) + ) + (tee_local $3 + (i32.mul + (get_local $4) + (i32.const 2) + ) + ) + (i32.gt_s + (get_local $2) + (get_local $3) + ) ) - (i32.const 1) + ) + (i32.load offset=4 + (get_local $0) ) ) - (tee_local $4 + (unreachable) + ) + (set_local $3 + (call $std:heap/allocate_memory (i32.mul (get_local $2) - (i32.const 2) + (i32.const 4) ) ) - (i32.gt_s - (get_local $3) - (get_local $4) - ) ) - ) - ) - (if - (get_local $2) - (loop $continue|0 (if - (i32.gt_u - (get_local $2) - (i32.const 0) + (i32.load + (get_local $0) ) (block - (i32.store + (call $std:heap/move_memory (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (get_local $2) - (i32.const 4) - ) + (get_local $3) + (i32.const 4) ) (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (i32.sub - (get_local $2) - (i32.const 1) - ) - (i32.const 4) - ) - ) + (get_local $0) + ) + (i32.mul + (get_local $4) + (i32.const 4) ) ) - (set_local $2 - (i32.sub - (get_local $2) - (i32.const 1) + (call $std:heap/free_memory + (i32.load + (get_local $0) ) ) - (br $continue|0) ) ) + (i32.store + (get_local $0) + (get_local $3) + ) + (i32.store offset=4 + (get_local $0) + (get_local $2) + ) + ) + (call $std:heap/move_memory + (i32.add + (i32.load + (get_local $0) + ) + (i32.const 4) + ) + (i32.load + (get_local $0) + ) + (i32.mul + (get_local $4) + (i32.const 4) + ) ) ) (i32.store @@ -2251,7 +2271,7 @@ ) (i32.store offset=8 (get_local $0) - (tee_local $3 + (tee_local $2 (i32.add (i32.load offset=8 (get_local $0) @@ -2260,7 +2280,7 @@ ) ) ) - (get_local $3) + (get_local $2) ) (func $std:heap/set_memory (; 9 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i64) diff --git a/tests/compiler/std/array.wast b/tests/compiler/std/array.wast index 7d3bd821..ff34378a 100644 --- a/tests/compiler/std/array.wast +++ b/tests/compiler/std/array.wast @@ -2449,6 +2449,7 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) (block (set_local $2 (i32.load offset=4 @@ -2463,80 +2464,100 @@ ) (get_local $2) ) - (call $std:array/Array#__grow - (get_local $0) - (select - (tee_local $3 - (i32.add - (i32.load offset=8 - (get_local $0) - ) - (i32.const 1) - ) - ) - (tee_local $4 - (i32.mul - (get_local $2) - (i32.const 2) - ) - ) - (i32.gt_s - (get_local $3) - (get_local $4) - ) - ) - ) - ) - (if - (get_local $2) - (block $break|0 + (block (block (set_local $5 - (get_local $2) - ) - ) - (loop $continue|0 - (if - (i32.gt_u - (get_local $5) - (i32.const 0) - ) - (block - (i32.store + (select + (tee_local $3 (i32.add - (i32.load + (i32.load offset=8 (get_local $0) ) - (i32.mul - (get_local $5) - (i32.const 4) - ) - ) - (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (i32.sub - (get_local $5) - (i32.const 1) - ) - (i32.const 4) - ) - ) - ) - ) - (set_local $5 - (i32.sub - (get_local $5) (i32.const 1) ) ) - (br $continue|0) + (tee_local $4 + (i32.mul + (get_local $2) + (i32.const 2) + ) + ) + (i32.gt_s + (get_local $3) + (get_local $4) + ) ) ) ) + (if + (i32.eqz + (i32.gt_s + (get_local $5) + (i32.load offset=4 + (get_local $0) + ) + ) + ) + (unreachable) + ) + (block + (set_local $6 + (call $std:heap/allocate_memory + (i32.mul + (get_local $5) + (i32.const 4) + ) + ) + ) + ) + (if + (i32.load + (get_local $0) + ) + (block + (call $std:heap/move_memory + (i32.add + (get_local $6) + (i32.const 4) + ) + (i32.load + (get_local $0) + ) + (i32.mul + (get_local $2) + (i32.const 4) + ) + ) + (call $std:heap/free_memory + (i32.load + (get_local $0) + ) + ) + ) + ) + (i32.store + (get_local $0) + (get_local $6) + ) + (i32.store offset=4 + (get_local $0) + (get_local $5) + ) + ) + (call $std:heap/move_memory + (i32.add + (i32.load + (get_local $0) + ) + (i32.const 4) + ) + (i32.load + (get_local $0) + ) + (i32.mul + (get_local $2) + (i32.const 4) + ) ) ) (i32.store