summaryrefslogtreecommitdiff
path: root/src/wasm-js.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-10-31 13:45:03 -0700
committerAlon Zakai <alonzakai@gmail.com>2015-10-31 13:45:03 -0700
commit39db17f164e21473d839272db2271791259666d7 (patch)
treece39feda53c48b3ce864de7fb980d1c217a75fc6 /src/wasm-js.cpp
parent81e35a5fdf894232e4167a9d66c7b93ecf31ea41 (diff)
downloadbinaryen-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.cpp52
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();
+ }
}
};