summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-04-04 10:24:57 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-04-04 10:43:02 -0700
commit47c88ce06292b77fe75522cfa8d8f8b4126bb19c (patch)
tree617ef80d99b1a96e02da729a8cde42931c71141e
parente959e9b05a7e24b4bfff252ac9b959e9eecd35af (diff)
downloadbinaryen-47c88ce06292b77fe75522cfa8d8f8b4126bb19c.tar.gz
binaryen-47c88ce06292b77fe75522cfa8d8f8b4126bb19c.tar.bz2
binaryen-47c88ce06292b77fe75522cfa8d8f8b4126bb19c.zip
handle unaligned i64 loads in wasm-js.cpp
-rw-r--r--src/wasm-js.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp
index 1db313727..61eac6e6c 100644
--- a/src/wasm-js.cpp
+++ b/src/wasm-js.cpp
@@ -258,7 +258,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
if (!isFloat) {
if (bytes === 1) ret = isSigned ? HEAP8[0] : HEAPU8[0];
else if (bytes === 2) ret = isSigned ? HEAP16[0] : HEAPU16[0];
- else if (bytes === 4) ret = isSigned ? HEAP32[0] : HEAPU32[0];
+ else if (bytes === 4 || bytes === 8) ret = isSigned ? HEAP32[0] : HEAPU32[0]; // if i64, return low 32 bits here
else abort();
} else {
if (bytes === 4) ret = HEAPF32[0];
@@ -269,6 +269,20 @@ extern "C" void EMSCRIPTEN_KEEPALIVE instantiate() {
return ret;
}, addr, load->bytes, isWasmTypeFloat(load->type), load->signed_);
if (!isWasmTypeFloat(load->type)) {
+ if (load->type == i64) {
+ if (load->bytes == 8) {
+ int32_t high = EM_ASM_INT_V({
+ return HEAPU32[1];
+ });
+ return Literal(int64_t(int32_t(ret)) | (int64_t(int32_t(high)) << 32));
+ } else {
+ if (load->signed_) {
+ return Literal(int64_t(int32_t(ret)));
+ } else {
+ return Literal(int64_t(uint32_t(ret)));
+ }
+ }
+ }
return Literal((int32_t)ret);
} else if (load->bytes == 4) {
return Literal((float)ret);