summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/emscripten-optimizer/simple_ast.h7
-rw-r--r--src/shared-constants.h2
-rw-r--r--src/wasm2asm.h34
-rw-r--r--test/emcc_O2_hello_world.2asm.js10
-rw-r--r--test/hello_world.2asm.js10
-rw-r--r--test/min.2asm.js10
-rw-r--r--test/unit.2asm.js10
7 files changed, 79 insertions, 4 deletions
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h
index 94cae9f2f..d83eb4cdd 100644
--- a/src/emscripten-optimizer/simple_ast.h
+++ b/src/emscripten-optimizer/simple_ast.h
@@ -1336,6 +1336,13 @@ public:
.push_back(target)
.push_back(makeRawArray());
}
+ static Ref makeCall(Ref target, Ref arg) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(target)
+ .push_back(makeRawArray());
+ ret[2]->push_back(arg);
+ return ret;
+ }
static Ref makeCall(IString target) {
Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
.push_back(makeName(target))
diff --git a/src/shared-constants.h b/src/shared-constants.h
index 15fe8647f..b052f54df 100644
--- a/src/shared-constants.h
+++ b/src/shared-constants.h
@@ -53,6 +53,8 @@ cashew::IString GLOBAL("global"),
CASE("case"),
BR("br"),
USE_ASM("use asm"),
+ BUFFER("buffer"),
+ ENV("env"),
FAKE_RETURN("fake_return_waka123"),
MATH_CLZ32("Math_clz32"),
MATH_CTZ32("Math_ctz32"),
diff --git a/src/wasm2asm.h b/src/wasm2asm.h
index b919a6d3f..415c904c7 100644
--- a/src/wasm2asm.h
+++ b/src/wasm2asm.h
@@ -154,13 +154,19 @@ private:
// Label names to which we break with a value aka spooky-return-at-a-distance
std::set<Name> breakedWithValue;
+
+ void addHeaps(Ref ast);
};
Ref Wasm2AsmBuilder::processWasm(Module* wasm) {
Ref ret = ValueBuilder::makeToplevel();
Ref asmFunc = ValueBuilder::makeFunction(ASM_FUNC);
ret[1]->push_back(asmFunc);
+ ValueBuilder::appendArgumentToFunction(asmFunc, GLOBAL);
+ ValueBuilder::appendArgumentToFunction(asmFunc, ENV);
+ ValueBuilder::appendArgumentToFunction(asmFunc, BUFFER);
asmFunc[3]->push_back(ValueBuilder::makeStatement(ValueBuilder::makeString(USE_ASM)));
+ addHeaps(asmFunc[3]);
// imports XXX
// exports XXX
// functions
@@ -172,6 +178,34 @@ Ref Wasm2AsmBuilder::processWasm(Module* wasm) {
return ret;
}
+void Wasm2AsmBuilder::addHeaps(Ref ast) {
+ // var HEAP8 = new global.Int8Array(buffer); etc
+ auto add = [&](IString name, IString view) {
+ Ref theVar = ValueBuilder::makeVar();
+ ast->push_back(theVar);
+ ValueBuilder::appendToVar(theVar,
+ name,
+ ValueBuilder::makeNew(
+ ValueBuilder::makeCall(
+ ValueBuilder::makeDot(
+ ValueBuilder::makeName(GLOBAL),
+ view
+ ),
+ ValueBuilder::makeName(BUFFER)
+ )
+ )
+ );
+ };
+ add(HEAP8, INT8ARRAY);
+ add(HEAP16, INT16ARRAY);
+ add(HEAP32, INT32ARRAY);
+ add(HEAPU8, UINT8ARRAY);
+ add(HEAPU16, UINT16ARRAY);
+ add(HEAPU32, UINT32ARRAY);
+ add(HEAPF32, FLOAT32ARRAY);
+ add(HEAPF64, FLOAT64ARRAY);
+}
+
Ref Wasm2AsmBuilder::processFunction(Function* func) {
Ref ret = ValueBuilder::makeFunction(fromName(func->name));
frees.clear();
diff --git a/test/emcc_O2_hello_world.2asm.js b/test/emcc_O2_hello_world.2asm.js
index 959ac5681..f58e063d7 100644
--- a/test/emcc_O2_hello_world.2asm.js
+++ b/test/emcc_O2_hello_world.2asm.js
@@ -1,5 +1,13 @@
-function asmFunc() {
+function asmFunc(global, env, buffer) {
"use asm";
+ var HEAP8 = new global.Int8Array(buffer);
+ var HEAP16 = new global.Int16Array(buffer);
+ var HEAP32 = new global.Int32Array(buffer);
+ var HEAPU8 = new global.Uint8Array(buffer);
+ var HEAPU16 = new global.Uint16Array(buffer);
+ var HEAPU32 = new global.Uint32Array(buffer);
+ var HEAPF32 = new global.Float32Array(buffer);
+ var HEAPF64 = new global.Float64Array(buffer);
function _malloc(i1) {
i1 = i1 | 0;
var i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0, i33 = 0, i34 = 0, i35 = 0, i36 = 0, i37 = 0, i38 = 0, i39 = 0, i40 = 0, i41 = 0, i42 = 0, i43 = 0, i44 = 0, i45 = 0, i46 = 0, i47 = 0, i48 = 0, i49 = 0, i50 = 0, i51 = 0, i52 = 0, i53 = 0, i54 = 0, i55 = 0, i56 = 0, i57 = 0, i58 = 0, i59 = 0, i60 = 0, i61 = 0, i62 = 0, i63 = 0, i64 = 0, i65 = 0, i66 = 0, i67 = 0, i68 = 0, i69 = 0, i70 = 0, i71 = 0, i72 = 0, i73 = 0, i74 = 0, i75 = 0, i76 = 0, i77 = 0, i78 = 0, i79 = 0, i80 = 0, i81 = 0, i82 = 0, i83 = 0, i84 = 0, i85 = 0, i86 = 0, i87 = 0, i88 = 0, i89 = 0, i90 = 0, i91 = 0, i92 = 0, wasm2asm_i32$3 = 0, wasm2asm_i32$2 = 0, wasm2asm_i32$1 = 0, wasm2asm_i32$0 = 0;
diff --git a/test/hello_world.2asm.js b/test/hello_world.2asm.js
index 2c67f05ff..eb13f89c9 100644
--- a/test/hello_world.2asm.js
+++ b/test/hello_world.2asm.js
@@ -1,5 +1,13 @@
-function asmFunc() {
+function asmFunc(global, env, buffer) {
"use asm";
+ var HEAP8 = new global.Int8Array(buffer);
+ var HEAP16 = new global.Int16Array(buffer);
+ var HEAP32 = new global.Int32Array(buffer);
+ var HEAPU8 = new global.Uint8Array(buffer);
+ var HEAPU16 = new global.Uint16Array(buffer);
+ var HEAPU32 = new global.Uint32Array(buffer);
+ var HEAPF32 = new global.Float32Array(buffer);
+ var HEAPF64 = new global.Float64Array(buffer);
function add(x, y) {
x = x | 0;
y = y | 0;
diff --git a/test/min.2asm.js b/test/min.2asm.js
index 5574b5a25..3baf0a5cf 100644
--- a/test/min.2asm.js
+++ b/test/min.2asm.js
@@ -1,5 +1,13 @@
-function asmFunc() {
+function asmFunc(global, env, buffer) {
"use asm";
+ var HEAP8 = new global.Int8Array(buffer);
+ var HEAP16 = new global.Int16Array(buffer);
+ var HEAP32 = new global.Int32Array(buffer);
+ var HEAPU8 = new global.Uint8Array(buffer);
+ var HEAPU16 = new global.Uint16Array(buffer);
+ var HEAPU32 = new global.Uint32Array(buffer);
+ var HEAPF32 = new global.Float32Array(buffer);
+ var HEAPF64 = new global.Float64Array(buffer);
function floats(f) {
f = Math_fround(f);
var t = Math_fround(0);
diff --git a/test/unit.2asm.js b/test/unit.2asm.js
index 961a66b1f..80f94b58e 100644
--- a/test/unit.2asm.js
+++ b/test/unit.2asm.js
@@ -1,5 +1,13 @@
-function asmFunc() {
+function asmFunc(global, env, buffer) {
"use asm";
+ var HEAP8 = new global.Int8Array(buffer);
+ var HEAP16 = new global.Int16Array(buffer);
+ var HEAP32 = new global.Int32Array(buffer);
+ var HEAPU8 = new global.Uint8Array(buffer);
+ var HEAPU16 = new global.Uint16Array(buffer);
+ var HEAPU32 = new global.Uint32Array(buffer);
+ var HEAPF32 = new global.Float32Array(buffer);
+ var HEAPF64 = new global.Float64Array(buffer);
function big_negative() {
var temp = 0.0;
temp = -2147483648.0;