diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-04 10:24:57 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-04 10:43:02 -0700 |
commit | 47c88ce06292b77fe75522cfa8d8f8b4126bb19c (patch) | |
tree | 617ef80d99b1a96e02da729a8cde42931c71141e | |
parent | e959e9b05a7e24b4bfff252ac9b959e9eecd35af (diff) | |
download | binaryen-47c88ce06292b77fe75522cfa8d8f8b4126bb19c.tar.gz binaryen-47c88ce06292b77fe75522cfa8d8f8b4126bb19c.tar.bz2 binaryen-47c88ce06292b77fe75522cfa8d8f8b4126bb19c.zip |
handle unaligned i64 loads in wasm-js.cpp
-rw-r--r-- | src/wasm-js.cpp | 16 |
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); |