diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-10-31 13:45:03 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-10-31 13:45:03 -0700 |
commit | 39db17f164e21473d839272db2271791259666d7 (patch) | |
tree | ce39feda53c48b3ce864de7fb980d1c217a75fc6 /src/wasm-js.cpp | |
parent | 81e35a5fdf894232e4167a9d66c7b93ecf31ea41 (diff) | |
download | binaryen-39db17f164e21473d839272db2271791259666d7.tar.gz binaryen-39db17f164e21473d839272db2271791259666d7.tar.bz2 binaryen-39db17f164e21473d839272db2271791259666d7.zip |
load and store in interpreter/js
Diffstat (limited to 'src/wasm-js.cpp')
-rw-r--r-- | src/wasm-js.cpp | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index 2bea09a16..c0b2aadc2 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -59,9 +59,59 @@ extern "C" ModuleInstance* EMSCRIPTEN_KEEPALIVE load_asm(char *input) { } Literal load(Load* load, Literal ptr) override { + size_t addr = ptr.geti32(); + assert(load->align == load->bytes); + if (!load->float_) { + if (load->bytes == 1) { + if (load->signed_) { + return Literal(EM_ASM_INT({ return Module['instance'].parent['HEAP8'][$0] }, addr)); + } else { + return Literal(EM_ASM_INT({ return Module['instance'].parent['HEAPU8'][$0] }, addr)); + } + } else if (load->bytes == 2) { + if (load->signed_) { + return Literal(EM_ASM_INT({ return Module['instance'].parent['HEAP16'][$0] }, addr)); + } else { + return Literal(EM_ASM_INT({ return Module['instance'].parent['HEAPU16'][$0] }, addr)); + } + } else if (load->bytes == 4) { + if (load->signed_) { + return Literal(EM_ASM_INT({ return Module['instance'].parent['HEAP32'][$0] }, addr)); + } else { + return Literal(EM_ASM_INT({ return Module['instance'].parent['HEAPU32'][$0] }, addr)); + } + } + abort(); + } else { + if (load->bytes == 4) { + return Literal(EM_ASM_DOUBLE({ return Module['instance'].parent['HEAPF32'][$0] }, addr)); + } else if (load->bytes == 8) { + return Literal(EM_ASM_DOUBLE({ return Module['instance'].parent['HEAPF64'][$0] }, addr)); + } + abort(); + } } - Literal store(Store* store, Literal ptr, Literal value) override { + void store(Store* store, Literal ptr, Literal value) override { + size_t addr = ptr.geti32(); + assert(store->align == store->bytes); + if (!store->float_) { + if (store->bytes == 1) { + EM_ASM_INT({ Module['instance'].parent['HEAP8'][$0] = $1 }, addr, value.geti32()); + } else if (store->bytes == 2) { + EM_ASM_INT({ Module['instance'].parent['HEAP16'][$0] = $1 }, addr, value.geti32()); + } else if (store->bytes == 4) { + EM_ASM_INT({ Module['instance'].parent['HEAP32'][$0] = $1 }, addr, value.geti32()); + } + abort(); + } else { + if (store->bytes == 4) { + EM_ASM_DOUBLE({ Module['instance'].parent['HEAPF32'][$0] = $1 }, addr, value.getf64()); + } else if (store->bytes == 8) { + EM_ASM_DOUBLE({ Module['instance'].parent['HEAPF64'][$0] = $1 }, addr, value.getf64()); + } + abort(); + } } }; |