diff options
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 7 | ||||
-rw-r--r-- | src/shared-constants.h | 2 | ||||
-rw-r--r-- | src/wasm2asm.h | 34 | ||||
-rw-r--r-- | test/emcc_O2_hello_world.2asm.js | 10 | ||||
-rw-r--r-- | test/hello_world.2asm.js | 10 | ||||
-rw-r--r-- | test/min.2asm.js | 10 | ||||
-rw-r--r-- | test/unit.2asm.js | 10 |
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; |