summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/abi/js.h5
-rw-r--r--src/asmjs/shared-constants.cpp2
-rw-r--r--src/passes/RemoveNonJSOps.cpp5
-rw-r--r--src/passes/wasm-intrinsics.wat22
-rw-r--r--src/wasm2js.h16
5 files changed, 17 insertions, 33 deletions
diff --git a/src/abi/js.h b/src/abi/js.h
index c8ac94407..118a2c981 100644
--- a/src/abi/js.h
+++ b/src/abi/js.h
@@ -38,8 +38,6 @@ namespace wasm2js {
extern cashew::IString SCRATCH_LOAD_I32;
extern cashew::IString SCRATCH_STORE_I32;
-extern cashew::IString SCRATCH_LOAD_I64;
-extern cashew::IString SCRATCH_STORE_I64;
extern cashew::IString SCRATCH_LOAD_F32;
extern cashew::IString SCRATCH_STORE_F32;
extern cashew::IString SCRATCH_LOAD_F64;
@@ -76,8 +74,6 @@ inline void ensureHelpers(Module* wasm,
ensureImport(SCRATCH_LOAD_I32, {Type::i32}, Type::i32);
ensureImport(SCRATCH_STORE_I32, {Type::i32, Type::i32}, Type::none);
- ensureImport(SCRATCH_LOAD_I64, {}, Type::i64);
- ensureImport(SCRATCH_STORE_I64, {Type::i64}, Type::none);
ensureImport(SCRATCH_LOAD_F32, {}, Type::f32);
ensureImport(SCRATCH_STORE_F32, {Type::f32}, Type::none);
ensureImport(SCRATCH_LOAD_F64, {}, Type::f64);
@@ -98,7 +94,6 @@ inline void ensureHelpers(Module* wasm,
inline bool isHelper(cashew::IString name) {
return name == SCRATCH_LOAD_I32 || name == SCRATCH_STORE_I32 ||
- name == SCRATCH_LOAD_I64 || name == SCRATCH_STORE_I64 ||
name == SCRATCH_LOAD_F32 || name == SCRATCH_STORE_F32 ||
name == SCRATCH_LOAD_F64 || name == SCRATCH_STORE_F64 ||
name == ATOMIC_WAIT_I32 || name == MEMORY_INIT ||
diff --git a/src/asmjs/shared-constants.cpp b/src/asmjs/shared-constants.cpp
index 8a13cf55c..37594108a 100644
--- a/src/asmjs/shared-constants.cpp
+++ b/src/asmjs/shared-constants.cpp
@@ -113,8 +113,6 @@ namespace wasm2js {
cashew::IString SCRATCH_LOAD_I32("wasm2js_scratch_load_i32");
cashew::IString SCRATCH_STORE_I32("wasm2js_scratch_store_i32");
-cashew::IString SCRATCH_LOAD_I64("wasm2js_scratch_load_i64");
-cashew::IString SCRATCH_STORE_I64("wasm2js_scratch_store_i64");
cashew::IString SCRATCH_LOAD_F32("wasm2js_scratch_load_f32");
cashew::IString SCRATCH_STORE_F32("wasm2js_scratch_store_f32");
cashew::IString SCRATCH_LOAD_F64("wasm2js_scratch_load_f64");
diff --git a/src/passes/RemoveNonJSOps.cpp b/src/passes/RemoveNonJSOps.cpp
index 3c1947725..e25a834b0 100644
--- a/src/passes/RemoveNonJSOps.cpp
+++ b/src/passes/RemoveNonJSOps.cpp
@@ -107,6 +107,11 @@ struct RemoveNonJSOpsPass : public WalkerPass<PostWalker<RemoveNonJSOpsPass>> {
neededFunctions.clear();
}
+ // Copy all the globals in the intrinsics module
+ for (auto& global : intrinsicsModule.globals) {
+ ModuleUtils::copyGlobal(global.get(), *module);
+ }
+
// Intrinsics may use memory, so ensure the module has one.
MemoryUtils::ensureExists(module->memory);
diff --git a/src/passes/wasm-intrinsics.wat b/src/passes/wasm-intrinsics.wat
index f54547a0d..76e900734 100644
--- a/src/passes/wasm-intrinsics.wat
+++ b/src/passes/wasm-intrinsics.wat
@@ -6,9 +6,8 @@
;; (aka inlining and whatnot)
;;
;; LOCAL MODS done by hand afterwards:
-;; * Remove hardcoded address 1024 (apparently a free memory location rustc
-;; thinks is ok to use?); add intrinsic functions, which load/store to
-;; special scratch space, wasm2js_scratch_load_i32 etc.
+;; * Remove hardcoded address 1024 which was used for temporary data; instead
+;; add $wasm-intrinsics-temp-i64 global for that.
;; * Fix function type of __wasm_ctz_i64, which was wrong somehow,
;; i32, i32 => i32 instead of i64 => i64
;;
@@ -22,8 +21,6 @@
(type $4 (func (param i32 i32) (result i32)))
(type $5 (func (param i64) (result i64)))
(import "env" "memory" (memory $0 17))
- (import "env" "wasm2js_scratch_load_i64" (func $wasm2js_scratch_load_i64 (result i64)))
- (import "env" "wasm2js_scratch_store_i64" (func $wasm2js_scratch_store_i64 (param i64)))
(export "__wasm_i64_sdiv" (func $__wasm_i64_sdiv))
(export "__wasm_i64_udiv" (func $__wasm_i64_udiv))
(export "__wasm_i64_srem" (func $__wasm_i64_srem))
@@ -41,6 +38,7 @@
(export "__wasm_nearest_f64" (func $__wasm_nearest_f64))
(export "__wasm_popcnt_i32" (func $__wasm_popcnt_i32))
(export "__wasm_popcnt_i64" (func $__wasm_popcnt_i64))
+ (global $__wasm-intrinsics-temp-i64 (mut i64) (i64.const 0))
;; lowering of the i32.popcnt instruction, counts the number of bits set in the
;; input and returns the result
@@ -137,7 +135,7 @@
(local.get $var$1)
)
)
- (call $wasm2js_scratch_load_i64)
+ (global.get $__wasm-intrinsics-temp-i64)
)
;; lowering of the i64.mul instruction, return $var0 * $var$1
(func $__wasm_i64_mul (; 4 ;) (type $0) (param $var$0 i64) (param $var$1 i64) (result i64)
@@ -578,7 +576,7 @@
(i64.const 4294967296)
)
)
- (call $wasm2js_scratch_store_i64
+ (global.set $__wasm-intrinsics-temp-i64
(i64.extend_i32_u
(i32.sub
(local.tee $var$2
@@ -639,7 +637,7 @@
(local.get $var$3)
)
)
- (call $wasm2js_scratch_store_i64
+ (global.set $__wasm-intrinsics-temp-i64
(i64.or
(i64.shl
(i64.extend_i32_u
@@ -719,7 +717,7 @@
)
(br $label$3)
)
- (call $wasm2js_scratch_store_i64
+ (global.set $__wasm-intrinsics-temp-i64
(i64.shl
(i64.extend_i32_u
(i32.sub
@@ -761,7 +759,7 @@
)
(br $label$2)
)
- (call $wasm2js_scratch_store_i64
+ (global.set $__wasm-intrinsics-temp-i64
(i64.extend_i32_u
(i32.and
(local.get $var$4)
@@ -892,7 +890,7 @@
)
)
)
- (call $wasm2js_scratch_store_i64
+ (global.set $__wasm-intrinsics-temp-i64
(local.get $var$5)
)
(return
@@ -905,7 +903,7 @@
)
)
)
- (call $wasm2js_scratch_store_i64
+ (global.set $__wasm-intrinsics-temp-i64
(local.get $var$0)
)
(local.set $var$0
diff --git a/src/wasm2js.h b/src/wasm2js.h
index a6f27eff1..6b4ad697f 100644
--- a/src/wasm2js.h
+++ b/src/wasm2js.h
@@ -283,6 +283,8 @@ Ref Wasm2JSBuilder::processWasm(Module* wasm, Name funcName) {
{
PassRunner runner(wasm, options);
runner.add(make_unique<AutoDrop>());
+ // TODO: only legalize if necessary - emscripten would already do so, and
+ // likely other toolchains. but spec test suite needs that.
runner.add("legalize-js-interface");
// First up remove as many non-JS operations we can, including things like
// 64-bit integer multiplication/division, `f32.nearest` instructions, etc.
@@ -2378,20 +2380,6 @@ void Wasm2JSGlue::emitSpecialSupport() {
return i32ScratchView[index];
}
)";
- } else if (import->base == ABI::wasm2js::SCRATCH_STORE_I64) {
- out << R"(
- function legalimport$wasm2js_scratch_store_i64(low, high) {
- i32ScratchView[0] = low;
- i32ScratchView[1] = high;
- }
- )";
- } else if (import->base == ABI::wasm2js::SCRATCH_LOAD_I64) {
- out << R"(
- function legalimport$wasm2js_scratch_load_i64() {
- if (typeof setTempRet0 === 'function') setTempRet0(i32ScratchView[1]);
- return i32ScratchView[0];
- }
- )";
} else if (import->base == ABI::wasm2js::SCRATCH_STORE_F32) {
out << R"(
function wasm2js_scratch_store_f32(value) {