wasm: remove i64 workaround, use BigInt instead

Browsers previously didn't support the WebAssembly i64 type, so we had
to work around that limitation by converting the LLVM i64 type to
something else. Some people used a pair of i32 values, but we used a
pointer to a stack allocated i64.

Now however, all major browsers and Node.js do support WebAssembly
BigInt integration so that i64 values can be passed back and forth
between WebAssembly and JavaScript easily. Therefore, I think the time
has come to drop support for this workaround.

For more information: https://v8.dev/features/wasm-bigint (note that
TinyGo has used a slightly different way of passing i64 values between
JS and Wasm).

For information on browser support: https://webassembly.org/roadmap/
This commit is contained in:
Ayke van Laethem
2023-04-30 17:54:03 +02:00
committed by Ron Evans
parent 6d5f4c4be2
commit 4d2a6d2bbe
10 changed files with 72 additions and 360 deletions
-28
View File
@@ -1,28 +0,0 @@
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown-wasm"
declare i64 @externalCall(ptr, i32, i64)
define internal i64 @testCall(ptr %ptr, i32 %len, i64 %foo) {
%val = call i64 @externalCall(ptr %ptr, i32 %len, i64 %foo)
ret i64 %val
}
define internal i64 @testCallNonEntry(ptr %ptr, i32 %len) {
entry:
br label %bb1
bb1:
%val = call i64 @externalCall(ptr %ptr, i32 %len, i64 3)
ret i64 %val
}
define void @exportedFunction(i64 %foo) {
%unused = shl i64 %foo, 1
ret void
}
define internal void @callExportedFunction(i64 %foo) {
call void @exportedFunction(i64 %foo)
ret void
}
-45
View File
@@ -1,45 +0,0 @@
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown-wasm"
declare i64 @"externalCall$i64wrap"(ptr, i32, i64)
define internal i64 @testCall(ptr %ptr, i32 %len, i64 %foo) {
%i64asptr = alloca i64, align 8
%i64asptr1 = alloca i64, align 8
store i64 %foo, ptr %i64asptr1, align 8
call void @externalCall(ptr %i64asptr, ptr %ptr, i32 %len, ptr %i64asptr1)
%retval = load i64, ptr %i64asptr, align 8
ret i64 %retval
}
define internal i64 @testCallNonEntry(ptr %ptr, i32 %len) {
entry:
%i64asptr = alloca i64, align 8
%i64asptr1 = alloca i64, align 8
br label %bb1
bb1: ; preds = %entry
store i64 3, ptr %i64asptr1, align 8
call void @externalCall(ptr %i64asptr, ptr %ptr, i32 %len, ptr %i64asptr1)
%retval = load i64, ptr %i64asptr, align 8
ret i64 %retval
}
define internal void @"exportedFunction$i64wrap"(i64 %foo) unnamed_addr {
%unused = shl i64 %foo, 1
ret void
}
define internal void @callExportedFunction(i64 %foo) {
call void @"exportedFunction$i64wrap"(i64 %foo)
ret void
}
declare void @externalCall(ptr, ptr, i32, ptr)
define void @exportedFunction(ptr %0) {
entry:
%i64 = load i64, ptr %0, align 8
call void @"exportedFunction$i64wrap"(i64 %i64)
ret void
}