Commit 0a408131 authored by Andreas Haas's avatar Andreas Haas Committed by V8 LUCI CQ

[wasm] Support externref returns in the generic wrapper

Externref does not need a translation from WebAssembly to JavaScript.
The return value can therefore just be forwarded to JavaScript.

R=thibaudm@chromium.org

Bug: v8:12565
Change-Id: I3b3ae37578c2793f6c09d1345f4ee555b40c853d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3404779Reviewed-by: 's avatarThibaud Michaud <thibaudm@chromium.org>
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/main@{#78721}
parent 3643b9e7
......@@ -3544,6 +3544,11 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) {
__ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field()));
__ j(equal, &return_kWasmF64);
// All types that are not SIMD are reference types.
__ cmpq(valuetype, Immediate(wasm::kWasmS128.raw_bit_field()));
// References can be passed to JavaScript as is.
__ j(not_equal, &return_done);
__ int3();
__ bind(&return_kWasmI32);
......
......@@ -175,10 +175,14 @@ bool UseGenericWrapper(const FunctionSig* sig) {
if (sig->returns().size() > 1) {
return false;
}
if (sig->returns().size() == 1 && sig->GetReturn(0).kind() != kI32 &&
sig->GetReturn(0).kind() != kI64 && sig->GetReturn(0).kind() != kF32 &&
sig->GetReturn(0).kind() != kF64) {
return false;
if (sig->returns().size() == 1) {
ValueType ret = sig->GetReturn(0);
if (ret.kind() == kS128) return false;
if (ret.is_reference()) {
if (ret.heap_representation() != wasm::HeapType::kExtern) {
return false;
}
}
}
for (ValueType type : sig->parameters()) {
if (type.kind() != kI32 && type.kind() != kI64 && type.kind() != kF32 &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment