From 219ee81bc9d0a8042e801c7d42fdd9f102ddd6ad Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Sun, 28 Jan 2018 15:30:49 +0100 Subject: [PATCH] Rename heap to memory; Allocator strategies --- bin/asc.js | 7 +- std/assembly/{heap.ts => memory.ts} | 22 +- std/assembly/memory/arena.ts | 30 + tests/compiler.js | 8 +- tests/compiler/std/array.optimized.wast | 735 ++++++++++---------- tests/compiler/std/array.wast | 839 ++++++++++++----------- tests/compiler/std/carray.wast | 54 +- tests/compiler/std/heap.optimized.wast | 215 +++--- tests/compiler/std/heap.wast | 283 ++++---- tests/compiler/std/new.optimized.wast | 363 +++++++++- tests/compiler/std/new.wast | 447 ++++++++++-- tests/compiler/std/set.optimized.wast | 384 ++++++++++- tests/compiler/std/set.wast | 472 +++++++++++-- tests/compiler/std/string.optimized.wast | 8 +- tests/compiler/std/string.wast | 62 +- 15 files changed, 2694 insertions(+), 1235 deletions(-) rename std/assembly/{heap.ts => memory.ts} (91%) create mode 100644 std/assembly/memory/arena.ts diff --git a/bin/asc.js b/bin/asc.js index c437ae56..226e4010 100644 --- a/bin/asc.js +++ b/bin/asc.js @@ -105,8 +105,8 @@ function checkDiagnostics(parser) { } // Include standard library +var stdlibDir = path.join(__dirname, "..", "std", "assembly"); if (!args.noLib) { - var stdlibDir = path.join(__dirname, "..", "std", "assembly"); var notIoTime = 0; readTime += measure(() => { glob.sync("*.ts", { cwd: stdlibDir }).forEach(file => { @@ -156,7 +156,10 @@ args._.forEach(filename => { while ((nextPath = parser.nextFile()) != null) { try { readTime += measure(() => { - nextText = fs.readFileSync(nextPath + ".ts", { encoding: "utf8" }); + if (nextPath.starsWith("std:")) + nextText = fs.readFileSync(stdlibDir + "/" + nextPath.substring(4) + ".ts", { encoding: "utf8" }); + else + nextText = fs.readFileSync(nextPath + ".ts", { encoding: "utf8" }); }); ++readCount; } catch (e) { diff --git a/std/assembly/heap.ts b/std/assembly/memory.ts similarity index 91% rename from std/assembly/heap.ts rename to std/assembly/memory.ts index c1fc71ea..662bba2b 100644 --- a/std/assembly/heap.ts +++ b/std/assembly/memory.ts @@ -1,24 +1,4 @@ -const ALIGN_LOG2: usize = 3; -const ALIGN_SIZE: usize = 1 << ALIGN_LOG2; -const ALIGN_MASK: usize = ALIGN_SIZE - 1; - -var HEAP_OFFSET: usize = HEAP_BASE; // HEAP_BASE is a constant generated by the compiler - -export function allocate_memory(size: usize): usize { - if (!size) return 0; - var len: i32 = current_memory(); - if (HEAP_OFFSET + size > len << 16) - if(grow_memory(max(ceil(size / 65536), len * 2 - len)) < 0) - unreachable(); - var ptr: usize = HEAP_OFFSET; - if ((HEAP_OFFSET += size) & ALIGN_MASK) // align next offset - HEAP_OFFSET = (HEAP_OFFSET | ALIGN_MASK) + 1; - return ptr; -} - -export function free_memory(ptr: usize): void { - // just a big chunk of non-disposable memory for now -} +import "std:memory/arena"; function copy_memory(dest: usize, src: usize, n: usize): void { // based on musl's implementation of memcpy diff --git a/std/assembly/memory/arena.ts b/std/assembly/memory/arena.ts new file mode 100644 index 00000000..298d56fd --- /dev/null +++ b/std/assembly/memory/arena.ts @@ -0,0 +1,30 @@ +// An simple arena allocator that provides a `clear_memory` function to reset +// everything to the initial state. A user must have to make sure that there +// a no more references to cleared memory. + +const ALIGN_LOG2: usize = 3; +const ALIGN_SIZE: usize = 1 << ALIGN_LOG2; +const ALIGN_MASK: usize = ALIGN_SIZE - 1; + +var HEAP_OFFSET: usize = HEAP_BASE; // generated by the compiler + +export function allocate_memory(size: usize): usize { + if (!size) return 0; + var len: i32 = current_memory(); + if (HEAP_OFFSET + size > len << 16) + if(grow_memory(max(ceil(size / 65536), len * 2 - len)) < 0) + unreachable(); + var ptr: usize = HEAP_OFFSET; + if ((HEAP_OFFSET += size) & ALIGN_MASK) // align next offset + HEAP_OFFSET = (HEAP_OFFSET | ALIGN_MASK) + 1; + set_memory(ptr, 0, size); + return ptr; +} + +export function free_memory(ptr: usize): void { + // nop +} + +export function clear_memory(): void { + HEAP_OFFSET = HEAP_BASE; +} diff --git a/tests/compiler.js b/tests/compiler.js index c781893b..6f279d9f 100644 --- a/tests/compiler.js +++ b/tests/compiler.js @@ -15,7 +15,8 @@ var ElementKind = require("../src/program").ElementKind; var isCreate = process.argv[2] === "--create"; var filter = process.argv.length > 2 && !isCreate ? "**/" + process.argv[2] + ".ts" : "**/*.ts"; -var stdFiles = glob.sync("*.ts", { cwd: __dirname + "/../std/assembly" }); +var stdDir = __dirname + "/../std/assembly"; +var stdFiles = glob.sync("*.ts", { cwd: stdDir }); var success = 0; var failures = 0; @@ -42,7 +43,10 @@ glob.sync(filter, { cwd: __dirname + "/compiler" }).forEach(filename => { while ((nextFile = parser.nextFile()) !== null) { var nextSourceText; try { - nextSourceText = fs.readFileSync(path.join(__dirname, "compiler", nextFile + ".ts"), { encoding: "utf8" }); + if (nextFile.startsWith("std:")) + nextSourceText = fs.readFileSync(path.join(stdDir, nextFile.substring(4) + ".ts"), { encoding: "utf8" }); + else + nextSourceText = fs.readFileSync(path.join(__dirname, "compiler", nextFile + ".ts"), { encoding: "utf8" }); } catch (e) { nextSourceText = fs.readFileSync(path.join(__dirname, "compiler", nextFile, "index.ts"), { encoding: "utf8" }); } diff --git a/tests/compiler/std/array.optimized.wast b/tests/compiler/std/array.optimized.wast index 59b00d27..3c4d0037 100644 --- a/tests/compiler/std/array.optimized.wast +++ b/tests/compiler/std/array.optimized.wast @@ -1,19 +1,352 @@ (module - (type $ii (func (param i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) + (type $ii (func (param i32) (result i32))) (type $iv (func (param i32))) (type $iiv (func (param i32 i32))) (type $iii (func (param i32 i32) (result i32))) (type $iiii (func (param i32 i32 i32) (result i32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/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) + (func $std:memory/set_memory (; 0 ;) (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:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (if @@ -30,7 +363,7 @@ (if (i32.gt_u (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) (i32.shl @@ -75,39 +408,44 @@ ) ) (set_local $1 - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (if (block (result i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) ) (i32.and - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) ) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add (i32.or - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) (i32.const 1) ) ) ) + (call $std:memory/set_memory + (get_local $1) + (i32.const 0) + (get_local $0) + ) (get_local $1) ) - (func $std:array/Array#get:length (; 1 ;) (type $ii) (param $0 i32) (result i32) + (func $std:array/Array#get:length (; 2 ;) (type $ii) (param $0 i32) (result i32) (i32.load offset=8 (get_local $0) ) ) - (func $std:heap/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/copy_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (loop $continue|0 @@ -1683,7 +2021,7 @@ ) ) ) - (func $std:heap/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/move_memory (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -1716,7 +2054,7 @@ (i32.const 1) ) (block - (call $std:heap/copy_memory + (call $std:memory/copy_memory (get_local $0) (get_local $1) (get_local $2) @@ -1973,10 +2311,10 @@ ) ) ) - (func $std:heap/free_memory (; 4 ;) (type $iv) (param $0 i32) + (func $std:memory/arena/free_memory (; 5 ;) (type $iv) (param $0 i32) (nop) ) - (func $std:array/Array#__grow (; 5 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $std:array/Array#__grow (; 6 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) (if (i32.le_s @@ -1988,7 +2326,7 @@ (unreachable) ) (set_local $2 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.mul (get_local $1) (i32.const 4) @@ -2000,7 +2338,7 @@ (get_local $0) ) (block - (call $std:heap/move_memory + (call $std:memory/move_memory (get_local $2) (i32.load (get_local $0) @@ -2012,7 +2350,7 @@ (i32.const 4) ) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (i32.load (get_local $0) ) @@ -2028,7 +2366,7 @@ (get_local $1) ) ) - (func $std:array/Array#push (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:array/Array#push (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eq @@ -2082,7 +2420,7 @@ ) (get_local $2) ) - (func $std:array/Array#__get (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:array/Array#__get (; 8 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.ge_u (get_local $1) @@ -2104,7 +2442,7 @@ ) ) ) - (func $std:array/Array#pop (; 8 ;) (type $ii) (param $0 i32) (result i32) + (func $std:array/Array#pop (; 9 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (i32.lt_s @@ -2140,7 +2478,7 @@ ) ) ) - (func $std:array/Array#unshift (; 9 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:array/Array#unshift (; 10 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2175,7 +2513,7 @@ (unreachable) ) (set_local $4 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.mul (get_local $3) (i32.const 4) @@ -2187,7 +2525,7 @@ (get_local $0) ) (block - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (get_local $4) (i32.const 4) @@ -2200,7 +2538,7 @@ (i32.const 4) ) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (i32.load (get_local $0) ) @@ -2216,7 +2554,7 @@ (get_local $3) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (i32.load (get_local $0) @@ -2251,339 +2589,6 @@ ) (get_local $0) ) - (func $std:heap/set_memory (; 10 ;) (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 (; 11 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if @@ -2602,7 +2607,7 @@ ) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.load (get_local $0) ) @@ -2622,7 +2627,7 @@ (i32.const 4) ) ) - (call $std:heap/set_memory + (call $std:memory/set_memory (i32.add (i32.load (get_local $0) @@ -2838,7 +2843,7 @@ (return) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (i32.load (get_local $0) @@ -2892,11 +2897,11 @@ ) ) (func $start (; 15 ;) (type $v) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/array/arr - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 12) ) ) diff --git a/tests/compiler/std/array.wast b/tests/compiler/std/array.wast index 6c585ab5..8b11e5ed 100644 --- a/tests/compiler/std/array.wast +++ b/tests/compiler/std/array.wast @@ -1,23 +1,378 @@ (module (type $i (func (result i32))) - (type $ii (func (param i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) + (type $ii (func (param i32) (result i32))) (type $iv (func (param i32))) (type $iiv (func (param i32 i32))) (type $iii (func (param i32 i32) (result i32))) (type $iiii (func (param i32 i32 i32) (result i32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) - (global $std:heap/ALIGN_LOG2 i32 (i32.const 3)) - (global $std:heap/ALIGN_SIZE i32 (i32.const 8)) - (global $std:heap/ALIGN_MASK i32 (i32.const 7)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/ALIGN_LOG2 i32 (i32.const 3)) + (global $std:memory/arena/ALIGN_SIZE i32 (i32.const 8)) + (global $std:memory/arena/ALIGN_MASK i32 (i32.const 7)) (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) + (func $std:memory/set_memory (; 0 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i64) + (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) + ) + (set_local $3 + (i32.and + (i32.sub + (i32.const 0) + (get_local $0) + ) + (i32.const 3) + ) + ) + (set_local $0 + (i32.add + (get_local $0) + (get_local $3) + ) + ) + (set_local $2 + (i32.sub + (get_local $2) + (get_local $3) + ) + ) + (set_local $2 + (i32.and + (get_local $2) + (i32.sub + (i32.const 0) + (i32.const 4) + ) + ) + ) + (set_local $4 + (i32.mul + (i32.div_u + (i32.sub + (i32.const 0) + (i32.const 1) + ) + (i32.const 255) + ) + (get_local $1) + ) + ) + (i32.store + (get_local $0) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 4) + ) + (get_local $4) + ) + (if + (i32.le_u + (get_local $2) + (i32.const 8) + ) + (return) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 4) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 8) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 12) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 8) + ) + (get_local $4) + ) + (if + (i32.le_u + (get_local $2) + (i32.const 24) + ) + (return) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 12) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 16) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 20) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 24) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 28) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 24) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 20) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 16) + ) + (get_local $4) + ) + (set_local $3 + (i32.add + (i32.const 24) + (i32.and + (get_local $0) + (i32.const 4) + ) + ) + ) + (set_local $0 + (i32.add + (get_local $0) + (get_local $3) + ) + ) + (set_local $2 + (i32.sub + (get_local $2) + (get_local $3) + ) + ) + (set_local $5 + (i64.or + (i64.extend_u/i32 + (get_local $4) + ) + (i64.shl + (i64.extend_u/i32 + (get_local $4) + ) + (i64.const 32) + ) + ) + ) + (block $break|0 + (loop $continue|0 + (if + (i32.ge_u + (get_local $2) + (i32.const 32) + ) + (block + (block + (i64.store + (get_local $0) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 8) + ) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 16) + ) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 24) + ) + (get_local $5) + ) + (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:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -36,7 +391,7 @@ (if (i32.gt_u (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) (i32.shl @@ -81,43 +436,48 @@ ) ) (set_local $4 - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (if (i32.and (block (result i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) ) - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (i32.const 7) ) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add (i32.or - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) (i32.const 1) ) ) ) + (call $std:memory/set_memory + (get_local $4) + (i32.const 0) + (get_local $0) + ) (return (get_local $4) ) ) - (func $std:array/Array#get:length (; 1 ;) (type $ii) (param $0 i32) (result i32) + (func $std:array/Array#get:length (; 2 ;) (type $ii) (param $0 i32) (result i32) (return (i32.load offset=8 (get_local $0) ) ) ) - (func $std:heap/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/copy_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -1917,7 +2277,7 @@ ) ) ) - (func $std:heap/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/move_memory (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -1953,7 +2313,7 @@ (i32.const 1) ) (block - (call $std:heap/copy_memory + (call $std:memory/copy_memory (get_local $0) (get_local $1) (get_local $2) @@ -2243,9 +2603,9 @@ ) ) ) - (func $std:heap/free_memory (; 4 ;) (type $iv) (param $0 i32) + (func $std:memory/arena/free_memory (; 5 ;) (type $iv) (param $0 i32) ) - (func $std:array/Array#__grow (; 5 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $std:array/Array#__grow (; 6 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) (if (i32.eqz @@ -2259,7 +2619,7 @@ (unreachable) ) (set_local $2 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.mul (get_local $1) (i32.const 4) @@ -2271,7 +2631,7 @@ (get_local $0) ) (block - (call $std:heap/move_memory + (call $std:memory/move_memory (get_local $2) (i32.load (get_local $0) @@ -2283,7 +2643,7 @@ (i32.const 4) ) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (i32.load (get_local $0) ) @@ -2299,7 +2659,7 @@ (get_local $1) ) ) - (func $std:array/Array#push (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:array/Array#push (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eq @@ -2358,7 +2718,7 @@ ) ) ) - (func $std:array/Array#__get (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:array/Array#__get (; 8 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.ge_u (get_local $1) @@ -2382,7 +2742,7 @@ ) ) ) - (func $std:array/Array#pop (; 8 ;) (type $ii) (param $0 i32) (result i32) + (func $std:array/Array#pop (; 9 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (i32.lt_s @@ -2421,7 +2781,7 @@ ) ) ) - (func $std:array/Array#unshift (; 9 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:array/Array#unshift (; 10 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2461,7 +2821,7 @@ (unreachable) ) (set_local $4 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.mul (get_local $3) (i32.const 4) @@ -2473,7 +2833,7 @@ (get_local $0) ) (block - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (get_local $4) (i32.const 4) @@ -2486,7 +2846,7 @@ (i32.const 4) ) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (i32.load (get_local $0) ) @@ -2502,7 +2862,7 @@ (get_local $3) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (i32.load (get_local $0) @@ -2542,361 +2902,6 @@ ) ) ) - (func $std:heap/set_memory (; 10 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i64) - (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) - ) - (set_local $3 - (i32.and - (i32.sub - (i32.const 0) - (get_local $0) - ) - (i32.const 3) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (get_local $3) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (get_local $3) - ) - ) - (set_local $2 - (i32.and - (get_local $2) - (i32.sub - (i32.const 0) - (i32.const 4) - ) - ) - ) - (set_local $4 - (i32.mul - (i32.div_u - (i32.sub - (i32.const 0) - (i32.const 1) - ) - (i32.const 255) - ) - (get_local $1) - ) - ) - (i32.store - (get_local $0) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 4) - ) - (get_local $4) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 8) - ) - (return) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 4) - ) - (get_local $4) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 12) - ) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 8) - ) - (get_local $4) - ) - (if - (i32.le_u - (get_local $2) - (i32.const 24) - ) - (return) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 12) - ) - (get_local $4) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 16) - ) - (get_local $4) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 20) - ) - (get_local $4) - ) - (i32.store - (i32.add - (get_local $0) - (i32.const 24) - ) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 28) - ) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 24) - ) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 20) - ) - (get_local $4) - ) - (i32.store - (i32.sub - (i32.add - (get_local $0) - (get_local $2) - ) - (i32.const 16) - ) - (get_local $4) - ) - (set_local $3 - (i32.add - (i32.const 24) - (i32.and - (get_local $0) - (i32.const 4) - ) - ) - ) - (set_local $0 - (i32.add - (get_local $0) - (get_local $3) - ) - ) - (set_local $2 - (i32.sub - (get_local $2) - (get_local $3) - ) - ) - (set_local $5 - (i64.or - (i64.extend_u/i32 - (get_local $4) - ) - (i64.shl - (i64.extend_u/i32 - (get_local $4) - ) - (i64.const 32) - ) - ) - ) - (block $break|0 - (loop $continue|0 - (if - (i32.ge_u - (get_local $2) - (i32.const 32) - ) - (block - (block - (i64.store - (get_local $0) - (get_local $5) - ) - (i64.store - (i32.add - (get_local $0) - (i32.const 8) - ) - (get_local $5) - ) - (i64.store - (i32.add - (get_local $0) - (i32.const 16) - ) - (get_local $5) - ) - (i64.store - (i32.add - (get_local $0) - (i32.const 24) - ) - (get_local $5) - ) - (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 (; 11 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if @@ -2915,7 +2920,7 @@ ) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.load (get_local $0) ) @@ -2935,7 +2940,7 @@ (i32.const 4) ) ) - (call $std:heap/set_memory + (call $std:memory/set_memory (i32.add (i32.load (get_local $0) @@ -3199,7 +3204,7 @@ ) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (i32.load (get_local $0) @@ -3237,11 +3242,11 @@ ) ) (func $start (; 15 ;) (type $v) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/array/arr - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.add (i32.const 4) (i32.mul @@ -4045,23 +4050,15 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - GLOBAL: std:heap/ALIGN_LOG2 - GLOBAL: std:heap/ALIGN_SIZE - GLOBAL: std:heap/ALIGN_MASK - GLOBAL: std:heap/HEAP_OFFSET - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/copy_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory - FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: std:memory/copy_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory + FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -4081,6 +4078,16 @@ FUNCTION_PROTOTYPE: parseFloat GLOBAL: std/array/arr GLOBAL: std/array/i + GLOBAL: std:memory/arena/ALIGN_LOG2 + GLOBAL: std:memory/arena/ALIGN_SIZE + GLOBAL: std:memory/arena/ALIGN_MASK + GLOBAL: std:memory/arena/HEAP_OFFSET + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory + FUNCTION_PROTOTYPE: clear_memory [program.exports] CLASS_PROTOTYPE: std:array/Array CLASS_PROTOTYPE: Array @@ -4090,18 +4097,14 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: compare_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: compare_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -4112,4 +4115,10 @@ FUNCTION_PROTOTYPE: std:string/parseInt FUNCTION_PROTOTYPE: parseFloat FUNCTION_PROTOTYPE: std:string/parseFloat + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: clear_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory ;) diff --git a/tests/compiler/std/carray.wast b/tests/compiler/std/carray.wast index 3f4ad3e1..c58f2cdd 100644 --- a/tests/compiler/std/carray.wast +++ b/tests/compiler/std/carray.wast @@ -258,23 +258,15 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - GLOBAL: std:heap/ALIGN_LOG2 - GLOBAL: std:heap/ALIGN_SIZE - GLOBAL: std:heap/ALIGN_MASK - GLOBAL: std:heap/HEAP_OFFSET - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/copy_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory - FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: std:memory/copy_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory + FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -293,6 +285,16 @@ FUNCTION_PROTOTYPE: std:string/parseFloat FUNCTION_PROTOTYPE: parseFloat GLOBAL: std/carray/arr + GLOBAL: std:memory/arena/ALIGN_LOG2 + GLOBAL: std:memory/arena/ALIGN_SIZE + GLOBAL: std:memory/arena/ALIGN_MASK + GLOBAL: std:memory/arena/HEAP_OFFSET + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory + FUNCTION_PROTOTYPE: clear_memory [program.exports] CLASS_PROTOTYPE: std:array/Array CLASS_PROTOTYPE: Array @@ -302,18 +304,14 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: compare_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: compare_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -324,4 +322,10 @@ FUNCTION_PROTOTYPE: std:string/parseInt FUNCTION_PROTOTYPE: parseFloat FUNCTION_PROTOTYPE: std:string/parseFloat + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: clear_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory ;) diff --git a/tests/compiler/std/heap.optimized.wast b/tests/compiler/std/heap.optimized.wast index 0d8ea488..b77a9696 100644 --- a/tests/compiler/std/heap.optimized.wast +++ b/tests/compiler/std/heap.optimized.wast @@ -1,10 +1,10 @@ (module - (type $ii (func (param i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) + (type $ii (func (param i32) (result i32))) (type $iiii (func (param i32 i32 i32) (result i32))) (type $iv (func (param i32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) (global $std/heap/ptr1 (mut i32) (i32.const 0)) (global $std/heap/ptr2 (mut i32) (i32.const 0)) (global $std/heap/i (mut i32) (i32.const 0)) @@ -12,96 +12,7 @@ (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/set_memory (; 1 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/set_memory (; 0 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i64) (local $4 i32) (if @@ -434,7 +345,101 @@ ) ) ) - (func $std:heap/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/arena/allocate_memory (; 1 ;) (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:memory/arena/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:memory/arena/HEAP_OFFSET) + ) + (if + (block (result i32) + (set_global $std:memory/arena/HEAP_OFFSET + (i32.add + (get_global $std:memory/arena/HEAP_OFFSET) + (get_local $0) + ) + ) + (i32.and + (get_global $std:memory/arena/HEAP_OFFSET) + (i32.const 7) + ) + ) + (set_global $std:memory/arena/HEAP_OFFSET + (i32.add + (i32.or + (get_global $std:memory/arena/HEAP_OFFSET) + (i32.const 7) + ) + (i32.const 1) + ) + ) + ) + (call $std:memory/set_memory + (get_local $1) + (i32.const 0) + (get_local $0) + ) + (get_local $1) + ) + (func $std:memory/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (loop $continue|0 @@ -2010,7 +2015,7 @@ ) ) ) - (func $std:heap/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -2043,7 +2048,7 @@ (i32.const 1) ) (block - (call $std:heap/copy_memory + (call $std:memory/copy_memory (get_local $0) (get_local $1) (get_local $2) @@ -2300,7 +2305,7 @@ ) ) ) - (func $std:heap/compare_memory (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std:memory/compare_memory (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -2360,20 +2365,20 @@ (i32.const 0) ) ) - (func $std:heap/free_memory (; 5 ;) (type $iv) (param $0 i32) + (func $std:memory/arena/free_memory (; 5 ;) (type $iv) (param $0 i32) (nop) ) (func $start (; 6 ;) (type $v) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/heap/ptr1 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 42) ) ) (set_global $std/heap/ptr2 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 42) ) ) @@ -2384,7 +2389,7 @@ ) (unreachable) ) - (call $std:heap/set_memory + (call $std:memory/set_memory (get_global $std/heap/ptr1) (i32.const 18) (i32.const 42) @@ -2421,7 +2426,7 @@ ) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (get_global $std/heap/ptr2) (get_global $std/heap/ptr1) (i32.const 42) @@ -2459,17 +2464,17 @@ ) ) (if - (call $std:heap/compare_memory + (call $std:memory/compare_memory (get_global $std/heap/ptr1) (get_global $std/heap/ptr2) (i32.const 42) ) (unreachable) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (get_global $std/heap/ptr1) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (get_global $std/heap/ptr2) ) ) diff --git a/tests/compiler/std/heap.wast b/tests/compiler/std/heap.wast index dc070316..c8f9da39 100644 --- a/tests/compiler/std/heap.wast +++ b/tests/compiler/std/heap.wast @@ -1,15 +1,15 @@ (module (type $i (func (result i32))) - (type $ii (func (param i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) + (type $ii (func (param i32) (result i32))) (type $iiii (func (param i32 i32 i32) (result i32))) (type $iv (func (param i32))) (type $v (func)) (global $std/heap/size i32 (i32.const 42)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) - (global $std:heap/ALIGN_LOG2 i32 (i32.const 3)) - (global $std:heap/ALIGN_SIZE i32 (i32.const 8)) - (global $std:heap/ALIGN_MASK i32 (i32.const 7)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/ALIGN_LOG2 i32 (i32.const 3)) + (global $std:memory/arena/ALIGN_SIZE i32 (i32.const 8)) + (global $std:memory/arena/ALIGN_MASK i32 (i32.const 7)) (global $std/heap/ptr1 (mut i32) (i32.const 0)) (global $std/heap/ptr2 (mut i32) (i32.const 0)) (global $std/heap/i (mut i32) (i32.const 0)) @@ -17,100 +17,7 @@ (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) - (local $3 i32) - (local $4 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 $3 - (i32.sub - (i32.mul - (get_local $1) - (i32.const 2) - ) - (get_local $1) - ) - ) - (i32.gt_s - (get_local $2) - (get_local $3) - ) - ) - ) - (i32.const 0) - ) - (unreachable) - ) - ) - (set_local $4 - (get_global $std:heap/HEAP_OFFSET) - ) - (if - (i32.and - (block (result i32) - (set_global $std:heap/HEAP_OFFSET - (i32.add - (get_global $std:heap/HEAP_OFFSET) - (get_local $0) - ) - ) - (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) - ) - ) - ) - (return - (get_local $4) - ) - ) - (func $std:heap/set_memory (; 1 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/set_memory (; 0 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i64) @@ -465,7 +372,105 @@ ) ) ) - (func $std:heap/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 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:memory/arena/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 $3 + (i32.sub + (i32.mul + (get_local $1) + (i32.const 2) + ) + (get_local $1) + ) + ) + (i32.gt_s + (get_local $2) + (get_local $3) + ) + ) + ) + (i32.const 0) + ) + (unreachable) + ) + ) + (set_local $4 + (get_global $std:memory/arena/HEAP_OFFSET) + ) + (if + (i32.and + (block (result i32) + (set_global $std:memory/arena/HEAP_OFFSET + (i32.add + (get_global $std:memory/arena/HEAP_OFFSET) + (get_local $0) + ) + ) + (get_global $std:memory/arena/HEAP_OFFSET) + ) + (i32.const 7) + ) + (set_global $std:memory/arena/HEAP_OFFSET + (i32.add + (i32.or + (get_global $std:memory/arena/HEAP_OFFSET) + (i32.const 7) + ) + (i32.const 1) + ) + ) + ) + (call $std:memory/set_memory + (get_local $4) + (i32.const 0) + (get_local $0) + ) + (return + (get_local $4) + ) + ) + (func $std:memory/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2265,7 +2270,7 @@ ) ) ) - (func $std:heap/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -2301,7 +2306,7 @@ (i32.const 1) ) (block - (call $std:heap/copy_memory + (call $std:memory/copy_memory (get_local $0) (get_local $1) (get_local $2) @@ -2591,7 +2596,7 @@ ) ) ) - (func $std:heap/compare_memory (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std:memory/compare_memory (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -2660,19 +2665,19 @@ ) ) ) - (func $std:heap/free_memory (; 5 ;) (type $iv) (param $0 i32) + (func $std:memory/arena/free_memory (; 5 ;) (type $iv) (param $0 i32) ) (func $start (; 6 ;) (type $v) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/heap/ptr1 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 42) ) ) (set_global $std/heap/ptr2 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 42) ) ) @@ -2685,7 +2690,7 @@ ) (unreachable) ) - (call $std:heap/set_memory + (call $std:memory/set_memory (get_global $std/heap/ptr1) (i32.const 18) (i32.const 42) @@ -2726,7 +2731,7 @@ ) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (get_global $std/heap/ptr2) (get_global $std/heap/ptr1) (i32.const 42) @@ -2770,7 +2775,7 @@ (if (i32.eqz (i32.eq - (call $std:heap/compare_memory + (call $std:memory/compare_memory (get_global $std/heap/ptr1) (get_global $std/heap/ptr2) (i32.const 42) @@ -2780,10 +2785,10 @@ ) (unreachable) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (get_global $std/heap/ptr1) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (get_global $std/heap/ptr2) ) ) @@ -2841,23 +2846,15 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - GLOBAL: std:heap/ALIGN_LOG2 - GLOBAL: std:heap/ALIGN_SIZE - GLOBAL: std:heap/ALIGN_MASK - GLOBAL: std:heap/HEAP_OFFSET - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/copy_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory - FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: std:memory/copy_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory + FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -2879,6 +2876,16 @@ GLOBAL: std/heap/ptr1 GLOBAL: std/heap/ptr2 GLOBAL: std/heap/i + GLOBAL: std:memory/arena/ALIGN_LOG2 + GLOBAL: std:memory/arena/ALIGN_SIZE + GLOBAL: std:memory/arena/ALIGN_MASK + GLOBAL: std:memory/arena/HEAP_OFFSET + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory + FUNCTION_PROTOTYPE: clear_memory [program.exports] CLASS_PROTOTYPE: std:array/Array CLASS_PROTOTYPE: Array @@ -2888,18 +2895,14 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: compare_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: compare_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -2910,4 +2913,10 @@ FUNCTION_PROTOTYPE: std:string/parseInt FUNCTION_PROTOTYPE: parseFloat FUNCTION_PROTOTYPE: std:string/parseFloat + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: clear_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory ;) diff --git a/tests/compiler/std/new.optimized.wast b/tests/compiler/std/new.optimized.wast index b8159730..097f32c7 100644 --- a/tests/compiler/std/new.optimized.wast +++ b/tests/compiler/std/new.optimized.wast @@ -1,13 +1,347 @@ (module + (type $iiiv (func (param i32 i32 i32))) (type $ii (func (param i32) (result i32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) (global $std/new/aClass (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) + (func $std:memory/set_memory (; 0 ;) (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:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (if @@ -24,7 +358,7 @@ (if (i32.gt_u (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) (i32.shl @@ -69,44 +403,49 @@ ) ) (set_local $1 - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (if (block (result i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) ) (i32.and - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) ) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add (i32.or - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) (i32.const 1) ) ) ) + (call $std:memory/set_memory + (get_local $1) + (i32.const 0) + (get_local $0) + ) (get_local $1) ) - (func $start (; 1 ;) (type $v) + (func $start (; 2 ;) (type $v) (local $0 i32) (local $1 i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/new/aClass (block (result i32) (i32.store (tee_local $0 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 8) ) ) diff --git a/tests/compiler/std/new.wast b/tests/compiler/std/new.wast index c4b42cb3..77f99f11 100644 --- a/tests/compiler/std/new.wast +++ b/tests/compiler/std/new.wast @@ -1,18 +1,374 @@ (module (type $i (func (result i32))) + (type $iiiv (func (param i32 i32 i32))) (type $ii (func (param i32) (result i32))) (type $ifv (func (param i32 f32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) - (global $std:heap/ALIGN_LOG2 i32 (i32.const 3)) - (global $std:heap/ALIGN_SIZE i32 (i32.const 8)) - (global $std:heap/ALIGN_MASK i32 (i32.const 7)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/ALIGN_LOG2 i32 (i32.const 3)) + (global $std:memory/arena/ALIGN_SIZE i32 (i32.const 8)) + (global $std:memory/arena/ALIGN_MASK i32 (i32.const 7)) (global $std/new/aClass (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) + (func $std:memory/set_memory (; 0 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i64) + (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) + ) + (set_local $3 + (i32.and + (i32.sub + (i32.const 0) + (get_local $0) + ) + (i32.const 3) + ) + ) + (set_local $0 + (i32.add + (get_local $0) + (get_local $3) + ) + ) + (set_local $2 + (i32.sub + (get_local $2) + (get_local $3) + ) + ) + (set_local $2 + (i32.and + (get_local $2) + (i32.sub + (i32.const 0) + (i32.const 4) + ) + ) + ) + (set_local $4 + (i32.mul + (i32.div_u + (i32.sub + (i32.const 0) + (i32.const 1) + ) + (i32.const 255) + ) + (get_local $1) + ) + ) + (i32.store + (get_local $0) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 4) + ) + (get_local $4) + ) + (if + (i32.le_u + (get_local $2) + (i32.const 8) + ) + (return) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 4) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 8) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 12) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 8) + ) + (get_local $4) + ) + (if + (i32.le_u + (get_local $2) + (i32.const 24) + ) + (return) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 12) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 16) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 20) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 24) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 28) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 24) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 20) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 16) + ) + (get_local $4) + ) + (set_local $3 + (i32.add + (i32.const 24) + (i32.and + (get_local $0) + (i32.const 4) + ) + ) + ) + (set_local $0 + (i32.add + (get_local $0) + (get_local $3) + ) + ) + (set_local $2 + (i32.sub + (get_local $2) + (get_local $3) + ) + ) + (set_local $5 + (i64.or + (i64.extend_u/i32 + (get_local $4) + ) + (i64.shl + (i64.extend_u/i32 + (get_local $4) + ) + (i64.const 32) + ) + ) + ) + (block $break|0 + (loop $continue|0 + (if + (i32.ge_u + (get_local $2) + (i32.const 32) + ) + (block + (block + (i64.store + (get_local $0) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 8) + ) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 16) + ) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 24) + ) + (get_local $5) + ) + (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:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -31,7 +387,7 @@ (if (i32.gt_u (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) (i32.shl @@ -76,36 +432,41 @@ ) ) (set_local $4 - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (if (i32.and (block (result i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) ) - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (i32.const 7) ) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add (i32.or - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) (i32.const 1) ) ) ) + (call $std:memory/set_memory + (get_local $4) + (i32.const 0) + (get_local $0) + ) (return (get_local $4) ) ) - (func $std/new/AClass#constructor (; 1 ;) (type $ifv) (param $0 i32) (param $1 f32) + (func $std/new/AClass#constructor (; 2 ;) (type $ifv) (param $0 i32) (param $1 f32) (i32.store (get_local $0) (i32.add @@ -120,15 +481,15 @@ (get_local $1) ) ) - (func $start (; 2 ;) (type $v) + (func $start (; 3 ;) (type $v) (local $0 i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/new/aClass (block (result i32) (set_local $0 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 8) ) ) @@ -202,23 +563,15 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - GLOBAL: std:heap/ALIGN_LOG2 - GLOBAL: std:heap/ALIGN_SIZE - GLOBAL: std:heap/ALIGN_MASK - GLOBAL: std:heap/HEAP_OFFSET - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/copy_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory - FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: std:memory/copy_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory + FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -239,6 +592,16 @@ CLASS_PROTOTYPE: std/new/AClass GLOBAL: std/new/AClass.aStaticField GLOBAL: std/new/aClass + GLOBAL: std:memory/arena/ALIGN_LOG2 + GLOBAL: std:memory/arena/ALIGN_SIZE + GLOBAL: std:memory/arena/ALIGN_MASK + GLOBAL: std:memory/arena/HEAP_OFFSET + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory + FUNCTION_PROTOTYPE: clear_memory [program.exports] CLASS_PROTOTYPE: std:array/Array CLASS_PROTOTYPE: Array @@ -248,18 +611,14 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: compare_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: compare_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -270,4 +629,10 @@ FUNCTION_PROTOTYPE: std:string/parseInt FUNCTION_PROTOTYPE: parseFloat FUNCTION_PROTOTYPE: std:string/parseFloat + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: clear_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory ;) diff --git a/tests/compiler/std/set.optimized.wast b/tests/compiler/std/set.optimized.wast index 2528ccd3..d422e7a3 100644 --- a/tests/compiler/std/set.optimized.wast +++ b/tests/compiler/std/set.optimized.wast @@ -1,15 +1,348 @@ (module - (type $ii (func (param i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) + (type $ii (func (param i32) (result i32))) (type $iii (func (param i32 i32) (result i32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) (global $std/set/set (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) + (func $std:memory/set_memory (; 0 ;) (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:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (if @@ -26,7 +359,7 @@ (if (i32.gt_u (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) (i32.shl @@ -71,39 +404,44 @@ ) ) (set_local $1 - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (if (block (result i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) ) (i32.and - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) ) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add (i32.or - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) (i32.const 1) ) ) ) + (call $std:memory/set_memory + (get_local $1) + (i32.const 0) + (get_local $0) + ) (get_local $1) ) - (func $std:set/Set#get:size (; 1 ;) (type $ii) (param $0 i32) (result i32) + (func $std:set/Set#get:size (; 2 ;) (type $ii) (param $0 i32) (result i32) (i32.load offset=8 (get_local $0) ) ) - (func $std:heap/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/copy_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (loop $continue|0 @@ -1679,7 +2017,7 @@ ) ) ) - (func $std:heap/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/move_memory (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -1712,7 +2050,7 @@ (i32.const 1) ) (block - (call $std:heap/copy_memory + (call $std:memory/copy_memory (get_local $0) (get_local $1) (get_local $2) @@ -1969,7 +2307,7 @@ ) ) ) - (func $std:set/Set#add (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:set/Set#add (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -1989,7 +2327,7 @@ ) (block (set_local $2 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.mul (tee_local $3 (select @@ -2017,7 +2355,7 @@ (get_local $0) ) (block - (call $std:heap/move_memory + (call $std:memory/move_memory (get_local $2) (i32.load (get_local $0) @@ -2071,7 +2409,7 @@ ) (get_local $0) ) - (func $std:set/Set#has (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:set/Set#has (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -2123,7 +2461,7 @@ ) (i32.const 0) ) - (func $std:set/Set#delete (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:set/Set#delete (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -2170,7 +2508,7 @@ (get_local $0) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (i32.load (get_local $0) @@ -2229,13 +2567,13 @@ ) (i32.const 0) ) - (func $start (; 7 ;) (type $v) + (func $start (; 8 ;) (type $v) (local $0 i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/set/set - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.const 12) ) ) diff --git a/tests/compiler/std/set.wast b/tests/compiler/std/set.wast index d07d6163..f81d864d 100644 --- a/tests/compiler/std/set.wast +++ b/tests/compiler/std/set.wast @@ -1,20 +1,375 @@ (module (type $i (func (result i32))) - (type $ii (func (param i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) + (type $ii (func (param i32) (result i32))) (type $iv (func (param i32))) (type $iii (func (param i32 i32) (result i32))) (type $v (func)) - (global $std:heap/HEAP_OFFSET (mut i32) (i32.const 0)) - (global $std:heap/ALIGN_LOG2 i32 (i32.const 3)) - (global $std:heap/ALIGN_SIZE i32 (i32.const 8)) - (global $std:heap/ALIGN_MASK i32 (i32.const 7)) + (global $std:memory/arena/HEAP_OFFSET (mut i32) (i32.const 0)) + (global $std:memory/arena/ALIGN_LOG2 i32 (i32.const 3)) + (global $std:memory/arena/ALIGN_SIZE i32 (i32.const 8)) + (global $std:memory/arena/ALIGN_MASK i32 (i32.const 7)) (global $std/set/set (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) + (func $std:memory/set_memory (; 0 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i64) + (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) + ) + (set_local $3 + (i32.and + (i32.sub + (i32.const 0) + (get_local $0) + ) + (i32.const 3) + ) + ) + (set_local $0 + (i32.add + (get_local $0) + (get_local $3) + ) + ) + (set_local $2 + (i32.sub + (get_local $2) + (get_local $3) + ) + ) + (set_local $2 + (i32.and + (get_local $2) + (i32.sub + (i32.const 0) + (i32.const 4) + ) + ) + ) + (set_local $4 + (i32.mul + (i32.div_u + (i32.sub + (i32.const 0) + (i32.const 1) + ) + (i32.const 255) + ) + (get_local $1) + ) + ) + (i32.store + (get_local $0) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 4) + ) + (get_local $4) + ) + (if + (i32.le_u + (get_local $2) + (i32.const 8) + ) + (return) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 4) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 8) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 12) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 8) + ) + (get_local $4) + ) + (if + (i32.le_u + (get_local $2) + (i32.const 24) + ) + (return) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 12) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 16) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 20) + ) + (get_local $4) + ) + (i32.store + (i32.add + (get_local $0) + (i32.const 24) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 28) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 24) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 20) + ) + (get_local $4) + ) + (i32.store + (i32.sub + (i32.add + (get_local $0) + (get_local $2) + ) + (i32.const 16) + ) + (get_local $4) + ) + (set_local $3 + (i32.add + (i32.const 24) + (i32.and + (get_local $0) + (i32.const 4) + ) + ) + ) + (set_local $0 + (i32.add + (get_local $0) + (get_local $3) + ) + ) + (set_local $2 + (i32.sub + (get_local $2) + (get_local $3) + ) + ) + (set_local $5 + (i64.or + (i64.extend_u/i32 + (get_local $4) + ) + (i64.shl + (i64.extend_u/i32 + (get_local $4) + ) + (i64.const 32) + ) + ) + ) + (block $break|0 + (loop $continue|0 + (if + (i32.ge_u + (get_local $2) + (i32.const 32) + ) + (block + (block + (i64.store + (get_local $0) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 8) + ) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 16) + ) + (get_local $5) + ) + (i64.store + (i32.add + (get_local $0) + (i32.const 24) + ) + (get_local $5) + ) + (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:memory/arena/allocate_memory (; 1 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -33,7 +388,7 @@ (if (i32.gt_u (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) (i32.shl @@ -78,43 +433,48 @@ ) ) (set_local $4 - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (if (i32.and (block (result i32) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (get_local $0) ) ) - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) ) (i32.const 7) ) - (set_global $std:heap/HEAP_OFFSET + (set_global $std:memory/arena/HEAP_OFFSET (i32.add (i32.or - (get_global $std:heap/HEAP_OFFSET) + (get_global $std:memory/arena/HEAP_OFFSET) (i32.const 7) ) (i32.const 1) ) ) ) + (call $std:memory/set_memory + (get_local $4) + (i32.const 0) + (get_local $0) + ) (return (get_local $4) ) ) - (func $std:set/Set#get:size (; 1 ;) (type $ii) (param $0 i32) (result i32) + (func $std:set/Set#get:size (; 2 ;) (type $ii) (param $0 i32) (result i32) (return (i32.load offset=8 (get_local $0) ) ) ) - (func $std:heap/copy_memory (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/copy_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -1914,7 +2274,7 @@ ) ) ) - (func $std:heap/move_memory (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $std:memory/move_memory (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -1950,7 +2310,7 @@ (i32.const 1) ) (block - (call $std:heap/copy_memory + (call $std:memory/copy_memory (get_local $0) (get_local $1) (get_local $2) @@ -2240,9 +2600,9 @@ ) ) ) - (func $std:heap/free_memory (; 4 ;) (type $iv) (param $0 i32) + (func $std:memory/arena/free_memory (; 5 ;) (type $iv) (param $0 i32) ) - (func $std:set/Set#add (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:set/Set#add (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2286,7 +2646,7 @@ ) ) (set_local $5 - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.mul (get_local $4) (i32.const 4) @@ -2298,7 +2658,7 @@ (get_local $0) ) (block - (call $std:heap/move_memory + (call $std:memory/move_memory (get_local $5) (i32.load (get_local $0) @@ -2310,7 +2670,7 @@ (i32.const 4) ) ) - (call $std:heap/free_memory + (call $std:memory/arena/free_memory (i32.load (get_local $0) ) @@ -2354,7 +2714,7 @@ (get_local $0) ) ) - (func $std:set/Set#has (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:set/Set#has (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -2418,7 +2778,7 @@ (i32.const 0) ) ) - (func $std:set/Set#delete (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std:set/Set#delete (; 8 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -2474,7 +2834,7 @@ (get_local $0) ) ) - (call $std:heap/move_memory + (call $std:memory/move_memory (i32.add (i32.load (get_local $0) @@ -2536,7 +2896,7 @@ (i32.const 0) ) ) - (func $std:set/Set#clear (; 8 ;) (type $iv) (param $0 i32) + (func $std:set/Set#clear (; 9 ;) (type $iv) (param $0 i32) (if (i32.eqz (i32.ne @@ -2551,12 +2911,12 @@ (i32.const 0) ) ) - (func $start (; 9 ;) (type $v) - (set_global $std:heap/HEAP_OFFSET + (func $start (; 10 ;) (type $v) + (set_global $std:memory/arena/HEAP_OFFSET (get_global $HEAP_BASE) ) (set_global $std/set/set - (call $std:heap/allocate_memory + (call $std:memory/arena/allocate_memory (i32.add (i32.const 4) (i32.mul @@ -2770,23 +3130,15 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - GLOBAL: std:heap/ALIGN_LOG2 - GLOBAL: std:heap/ALIGN_SIZE - GLOBAL: std:heap/ALIGN_MASK - GLOBAL: std:heap/HEAP_OFFSET - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/copy_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory - FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: std:memory/copy_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory + FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -2805,6 +3157,16 @@ FUNCTION_PROTOTYPE: std:string/parseFloat FUNCTION_PROTOTYPE: parseFloat GLOBAL: std/set/set + GLOBAL: std:memory/arena/ALIGN_LOG2 + GLOBAL: std:memory/arena/ALIGN_SIZE + GLOBAL: std:memory/arena/ALIGN_MASK + GLOBAL: std:memory/arena/HEAP_OFFSET + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory + FUNCTION_PROTOTYPE: clear_memory [program.exports] CLASS_PROTOTYPE: std:array/Array CLASS_PROTOTYPE: Array @@ -2814,18 +3176,14 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: compare_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: compare_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -2836,4 +3194,10 @@ FUNCTION_PROTOTYPE: std:string/parseInt FUNCTION_PROTOTYPE: parseFloat FUNCTION_PROTOTYPE: std:string/parseFloat + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: clear_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory ;) diff --git a/tests/compiler/std/string.optimized.wast b/tests/compiler/std/string.optimized.wast index a7cd446d..b0eebc05 100644 --- a/tests/compiler/std/string.optimized.wast +++ b/tests/compiler/std/string.optimized.wast @@ -43,7 +43,7 @@ ) ) ) - (func $std:heap/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std:memory/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -162,7 +162,7 @@ ) ) (i32.eqz - (call $std:heap/compare_memory + (call $std:memory/compare_memory (i32.add (i32.add (get_local $0) @@ -239,7 +239,7 @@ ) ) (i32.eqz - (call $std:heap/compare_memory + (call $std:memory/compare_memory (i32.add (i32.add (get_local $0) @@ -321,7 +321,7 @@ (block (if (i32.eqz - (call $std:heap/compare_memory + (call $std:memory/compare_memory (i32.add (i32.add (get_local $0) diff --git a/tests/compiler/std/string.wast b/tests/compiler/std/string.wast index 90ce8307..79eae22b 100644 --- a/tests/compiler/std/string.wast +++ b/tests/compiler/std/string.wast @@ -53,7 +53,7 @@ ) ) ) - (func $std:heap/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std:memory/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -199,7 +199,7 @@ ) (return (i32.eqz - (call $std:heap/compare_memory + (call $std:memory/compare_memory (i32.add (i32.add (get_local $0) @@ -295,7 +295,7 @@ ) (return (i32.eqz - (call $std:heap/compare_memory + (call $std:memory/compare_memory (i32.add (i32.add (get_local $0) @@ -398,7 +398,7 @@ (block (if (i32.eqz - (call $std:heap/compare_memory + (call $std:memory/compare_memory (i32.add (i32.add (get_local $0) @@ -608,23 +608,15 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - GLOBAL: std:heap/ALIGN_LOG2 - GLOBAL: std:heap/ALIGN_SIZE - GLOBAL: std:heap/ALIGN_MASK - GLOBAL: std:heap/HEAP_OFFSET - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/copy_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory - FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: std:memory/copy_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory + FUNCTION_PROTOTYPE: compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -644,6 +636,16 @@ FUNCTION_PROTOTYPE: parseFloat GLOBAL: std/string/str FUNCTION_PROTOTYPE: std/string/getString + GLOBAL: std:memory/arena/ALIGN_LOG2 + GLOBAL: std:memory/arena/ALIGN_SIZE + GLOBAL: std:memory/arena/ALIGN_MASK + GLOBAL: std:memory/arena/HEAP_OFFSET + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory + FUNCTION_PROTOTYPE: clear_memory [program.exports] CLASS_PROTOTYPE: std:array/Array CLASS_PROTOTYPE: Array @@ -653,18 +655,14 @@ CLASS_PROTOTYPE: Error CLASS_PROTOTYPE: std:error/RangeError CLASS_PROTOTYPE: RangeError - FUNCTION_PROTOTYPE: allocate_memory - FUNCTION_PROTOTYPE: std:heap/allocate_memory - FUNCTION_PROTOTYPE: free_memory - FUNCTION_PROTOTYPE: std:heap/free_memory - FUNCTION_PROTOTYPE: move_memory - FUNCTION_PROTOTYPE: std:heap/move_memory - FUNCTION_PROTOTYPE: set_memory - FUNCTION_PROTOTYPE: std:heap/set_memory - FUNCTION_PROTOTYPE: compare_memory - FUNCTION_PROTOTYPE: std:heap/compare_memory CLASS_PROTOTYPE: std:map/Map CLASS_PROTOTYPE: Map + FUNCTION_PROTOTYPE: move_memory + FUNCTION_PROTOTYPE: std:memory/move_memory + FUNCTION_PROTOTYPE: set_memory + FUNCTION_PROTOTYPE: std:memory/set_memory + FUNCTION_PROTOTYPE: compare_memory + FUNCTION_PROTOTYPE: std:memory/compare_memory CLASS_PROTOTYPE: std:regexp/RegExp CLASS_PROTOTYPE: RegExp CLASS_PROTOTYPE: std:set/Set @@ -676,4 +674,10 @@ FUNCTION_PROTOTYPE: parseFloat FUNCTION_PROTOTYPE: std:string/parseFloat FUNCTION_PROTOTYPE: std/string/getString + FUNCTION_PROTOTYPE: allocate_memory + FUNCTION_PROTOTYPE: std:memory/arena/allocate_memory + FUNCTION_PROTOTYPE: free_memory + FUNCTION_PROTOTYPE: std:memory/arena/free_memory + FUNCTION_PROTOTYPE: clear_memory + FUNCTION_PROTOTYPE: std:memory/arena/clear_memory ;)