summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-07 14:11:55 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-07 14:11:55 -0800
commit0fb0a68db70f2720d93a182129e73e4a0eaeb3cb (patch)
tree263f7bfedd28d9ac9edc34df02b9853e1f81c581
parentc44dc7b23fae93222c8a38da53e50c0b0aaa0366 (diff)
downloadbinaryen-0fb0a68db70f2720d93a182129e73e4a0eaeb3cb.tar.gz
binaryen-0fb0a68db70f2720d93a182129e73e4a0eaeb3cb.tar.bz2
binaryen-0fb0a68db70f2720d93a182129e73e4a0eaeb3cb.zip
import Math.imul
-rw-r--r--src/wasm2asm.h44
-rw-r--r--test/emcc_O2_hello_world.2asm.js1
-rw-r--r--test/hello_world.2asm.js1
-rw-r--r--test/min.2asm.js1
-rw-r--r--test/unit.2asm.js1
5 files changed, 34 insertions, 14 deletions
diff --git a/src/wasm2asm.h b/src/wasm2asm.h
index 0dec0722c..e57a0cff8 100644
--- a/src/wasm2asm.h
+++ b/src/wasm2asm.h
@@ -162,7 +162,7 @@ private:
// All our function tables have the same size TODO: optimize?
size_t tableSize;
- void addHeaps(Ref ast);
+ void addBasics(Ref ast);
};
Ref Wasm2AsmBuilder::processWasm(Module* wasm) {
@@ -173,8 +173,8 @@ Ref Wasm2AsmBuilder::processWasm(Module* wasm) {
ValueBuilder::appendArgumentToFunction(asmFunc, ENV);
ValueBuilder::appendArgumentToFunction(asmFunc, BUFFER);
asmFunc[3]->push_back(ValueBuilder::makeStatement(ValueBuilder::makeString(USE_ASM)));
- // create heaps
- addHeaps(asmFunc[3]);
+ // create heaps, etc
+ addBasics(asmFunc[3]);
// figure out the table size
tableSize = wasm->table.names.size();
size_t pow2ed = 1;
@@ -193,9 +193,9 @@ 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) {
+void Wasm2AsmBuilder::addBasics(Ref ast) {
+ // heaps, var HEAP8 = new global.Int8Array(buffer); etc
+ auto addHeap = [&](IString name, IString view) {
Ref theVar = ValueBuilder::makeVar();
ast->push_back(theVar);
ValueBuilder::appendToVar(theVar,
@@ -211,14 +211,30 @@ void Wasm2AsmBuilder::addHeaps(Ref ast) {
)
);
};
- add(HEAP8, INT8ARRAY);
- add(HEAP16, INT16ARRAY);
- add(HEAP32, INT32ARRAY);
- add(HEAPU8, UINT8ARRAY);
- add(HEAPU16, UINT16ARRAY);
- add(HEAPU32, UINT32ARRAY);
- add(HEAPF32, FLOAT32ARRAY);
- add(HEAPF64, FLOAT64ARRAY);
+ addHeap(HEAP8, INT8ARRAY);
+ addHeap(HEAP16, INT16ARRAY);
+ addHeap(HEAP32, INT32ARRAY);
+ addHeap(HEAPU8, UINT8ARRAY);
+ addHeap(HEAPU16, UINT16ARRAY);
+ addHeap(HEAPU32, UINT32ARRAY);
+ addHeap(HEAPF32, FLOAT32ARRAY);
+ addHeap(HEAPF64, FLOAT64ARRAY);
+ // core asm.js imports
+ auto addMath = [&](IString name, IString base) {
+ Ref theVar = ValueBuilder::makeVar();
+ ast->push_back(theVar);
+ ValueBuilder::appendToVar(theVar,
+ name,
+ ValueBuilder::makeDot(
+ ValueBuilder::makeDot(
+ ValueBuilder::makeName(GLOBAL),
+ MATH
+ ),
+ base
+ )
+ );
+ };
+ addMath(MATH_IMUL, IMUL);
}
Ref Wasm2AsmBuilder::processFunction(Function* func) {
diff --git a/test/emcc_O2_hello_world.2asm.js b/test/emcc_O2_hello_world.2asm.js
index 98331025f..63d1f62bb 100644
--- a/test/emcc_O2_hello_world.2asm.js
+++ b/test/emcc_O2_hello_world.2asm.js
@@ -8,6 +8,7 @@ function asmFunc(global, env, buffer) {
var HEAPU32 = new global.Uint32Array(buffer);
var HEAPF32 = new global.Float32Array(buffer);
var HEAPF64 = new global.Float64Array(buffer);
+ var Math_imul = global.Math.imul;
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 a7437f64b..48b0538c8 100644
--- a/test/hello_world.2asm.js
+++ b/test/hello_world.2asm.js
@@ -8,6 +8,7 @@ function asmFunc(global, env, buffer) {
var HEAPU32 = new global.Uint32Array(buffer);
var HEAPF32 = new global.Float32Array(buffer);
var HEAPF64 = new global.Float64Array(buffer);
+ var Math_imul = global.Math.imul;
function add(x, y) {
x = x | 0;
y = y | 0;
diff --git a/test/min.2asm.js b/test/min.2asm.js
index bd15fd5aa..c1cd2b64c 100644
--- a/test/min.2asm.js
+++ b/test/min.2asm.js
@@ -8,6 +8,7 @@ function asmFunc(global, env, buffer) {
var HEAPU32 = new global.Uint32Array(buffer);
var HEAPF32 = new global.Float32Array(buffer);
var HEAPF64 = new global.Float64Array(buffer);
+ var Math_imul = global.Math.imul;
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 1dfc7f32b..104b7c22c 100644
--- a/test/unit.2asm.js
+++ b/test/unit.2asm.js
@@ -8,6 +8,7 @@ function asmFunc(global, env, buffer) {
var HEAPU32 = new global.Uint32Array(buffer);
var HEAPF32 = new global.Float32Array(buffer);
var HEAPF64 = new global.Float64Array(buffer);
+ var Math_imul = global.Math.imul;
function big_negative() {
var temp = 0.0;
temp = -2147483648.0;