summaryrefslogtreecommitdiff
path: root/src/wasm-js.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-02 16:08:04 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-02 16:08:04 -0800
commit79c1a48d3b50c6298f4b89c3237df426aebd3f75 (patch)
tree4b47ddf748660c51986a92a08d1e987c1effe0ca /src/wasm-js.cpp
parenta25a0091a2066a390ee6eade7e6ca1fc6309292a (diff)
downloadbinaryen-79c1a48d3b50c6298f4b89c3237df426aebd3f75.tar.gz
binaryen-79c1a48d3b50c6298f4b89c3237df426aebd3f75.tar.bz2
binaryen-79c1a48d3b50c6298f4b89c3237df426aebd3f75.zip
fix load&store
Diffstat (limited to 'src/wasm-js.cpp')
-rw-r--r--src/wasm-js.cpp26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp
index ab0ac4982..dc385e5e3 100644
--- a/src/wasm-js.cpp
+++ b/src/wasm-js.cpp
@@ -130,23 +130,23 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm(char *input) {
}
} else if (load->bytes == 2) {
if (load->signed_) {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP16'][$0] }, addr));
+ return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP16'][$0 >> 1] }, addr));
} else {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU16'][$0] }, addr));
+ return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU16'][$0 >> 1] }, addr));
}
} else if (load->bytes == 4) {
if (load->signed_) {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP32'][$0] }, addr));
+ return Literal(EM_ASM_INT({ return Module['info'].parent['HEAP32'][$0 >> 2] }, addr));
} else {
- return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU32'][$0] }, addr));
+ return Literal(EM_ASM_INT({ return Module['info'].parent['HEAPU32'][$0 >> 2] }, addr));
}
}
abort();
} else {
if (load->bytes == 4) {
- return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF32'][$0] }, addr)); // XXX expands into double
+ return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF32'][$0 >> 2] }, addr)); // XXX expands into double
} else if (load->bytes == 8) {
- return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF64'][$0] }, addr));
+ return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF64'][$0 >> 3] }, addr));
}
abort();
}
@@ -159,17 +159,17 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm(char *input) {
if (store->bytes == 1) {
EM_ASM_INT({ Module['info'].parent['HEAP8'][$0] = $1 }, addr, value.geti32());
} else if (store->bytes == 2) {
- EM_ASM_INT({ Module['info'].parent['HEAP16'][$0] = $1 }, addr, value.geti32());
+ EM_ASM_INT({ Module['info'].parent['HEAP16'][$0 >> 1] = $1 }, addr, value.geti32());
} else if (store->bytes == 4) {
- EM_ASM_INT({ Module['info'].parent['HEAP32'][$0] = $1 }, addr, value.geti32());
+ EM_ASM_INT({ Module['info'].parent['HEAP32'][$0 >> 2] = $1 }, addr, value.geti32());
} else {
abort();
}
} else {
if (store->bytes == 4) {
- EM_ASM_DOUBLE({ Module['info'].parent['HEAPF32'][$0] = $1 }, addr, value.getf64());
+ EM_ASM_DOUBLE({ Module['info'].parent['HEAPF32'][$0 >> 2] = $1 }, addr, value.getf64());
} else if (store->bytes == 8) {
- EM_ASM_DOUBLE({ Module['info'].parent['HEAPF64'][$0] = $1 }, addr, value.getf64());
+ EM_ASM_DOUBLE({ Module['info'].parent['HEAPF64'][$0 >> 3] = $1 }, addr, value.getf64());
} else {
abort();
}
@@ -189,9 +189,9 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_mapped_globals() {
double value = EM_ASM_DOUBLE({ return Module['lookupImport'](Pointer_stringify($0), Pointer_stringify($1)) }, global.module.str, global.base.str);
unsigned address = global.address;
switch (global.type) {
- case i32: EM_ASM_({ Module['info'].parent['HEAP32'][$0] = $1 }, address, value); break;
- case f32: EM_ASM_({ Module['info'].parent['HEAPF32'][$0] = $1 }, address, value); break;
- case f64: EM_ASM_({ Module['info'].parent['HEAPF64'][$0] = $1 }, address, value); break;
+ case i32: EM_ASM_({ Module['info'].parent['HEAP32'][$0 >> 2] = $1 }, address, value); break;
+ case f32: EM_ASM_({ Module['info'].parent['HEAPF32'][$0 >> 2] = $1 }, address, value); break;
+ case f64: EM_ASM_({ Module['info'].parent['HEAPF64'][$0 >> 3] = $1 }, address, value); break;
default: abort();
}
}