Skip to content

Commit 3d60e09

Browse files
miladfarcaV8 LUCI CQ
authored andcommitted
PPC/s390: [wasm][wasmfx] Implement switch instruction.
Port b752954 Original Commit Message: platforms. [email protected], [email protected] BUG= LOG=N Change-Id: I93f4e647082ac3a3290f2eea61bc2fb81d430672 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7697336 Reviewed-by: John <[email protected]> Reviewed-by: Jakob Kummerow <[email protected]> Commit-Queue: Milad Farazmand <[email protected]> Cr-Commit-Position: refs/heads/main@{#106014}
1 parent e1e428d commit 3d60e09

File tree

3 files changed

+122
-1
lines changed

3 files changed

+122
-1
lines changed

src/builtins/ppc/builtins-ppc.cc

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3704,6 +3704,64 @@ void Builtins::Generate_WasmFXSuspend(MacroAssembler* masm) {
37043704
__ Ret();
37053705
}
37063706

3707+
void Builtins::Generate_WasmFXSwitch(MacroAssembler* masm) {
3708+
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
3709+
Register tag = WasmFXSwitchDescriptor::GetRegisterParameter(0);
3710+
Register cont = WasmFXSwitchDescriptor::GetRegisterParameter(1);
3711+
Register target_stack_reg = WasmFXSwitchDescriptor::GetRegisterParameter(2);
3712+
Register arg_buffer_reg = WasmFXSwitchDescriptor::GetRegisterParameter(3);
3713+
MemOperand sig_op(fp, 2 * kSystemPointerSize);
3714+
Label resume;
3715+
__ Push(kContextRegister);
3716+
{
3717+
FrameScope scope(masm, StackFrame::MANUAL);
3718+
DCHECK(!AreAliased(kCArgRegs[4], cont, target_stack_reg));
3719+
DCHECK(!AreAliased(kCArgRegs[5], target_stack_reg));
3720+
DCHECK(!AreAliased(kCArgRegs[7], tag, cont, target_stack_reg));
3721+
__ PrepareCallCFunction(9, r0);
3722+
__ Move(kCArgRegs[7], arg_buffer_reg);
3723+
__ Move(kCArgRegs[4], tag);
3724+
__ Move(kCArgRegs[5], cont);
3725+
__ Move(kCArgRegs[6], target_stack_reg);
3726+
Register scratch = r4;
3727+
__ LoadU64(scratch, sig_op);
3728+
__ StoreU64(scratch,
3729+
MemOperand(sp, kStackFrameExtraParamSlot * kSystemPointerSize));
3730+
__ Move(kCArgRegs[0], ExternalReference::isolate_address());
3731+
__ Move(kCArgRegs[1], sp);
3732+
__ Move(kCArgRegs[2], fp);
3733+
__ GetLabelAddress(kCArgRegs[3], &resume);
3734+
__ CallCFunction(ExternalReference::wasm_switch_wasmfx_stack(), 9);
3735+
}
3736+
3737+
Label ok;
3738+
__ CmpU64(kReturnRegister0, Operand(0), r0);
3739+
__ bne(&ok);
3740+
3741+
// No handler found.
3742+
__ Pop(kContextRegister); // Retrieve saved context.
3743+
__ CallRuntime(Runtime::kThrowWasmFXSuspendError);
3744+
3745+
__ bind(&ok);
3746+
__ Drop(1); // Drop saved context.
3747+
3748+
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
3749+
// Load the arg buffer to set up resume of target stack
3750+
__ Move(target_stack, kReturnRegister0);
3751+
Register arg_buffer = WasmFXResumeDescriptor::GetRegisterParameter(1);
3752+
__ Move(arg_buffer,
3753+
MemOperand(target_stack, wasm::StackMemory::arg_buffer_offset()));
3754+
3755+
DCHECK(!AreAliased(arg_buffer, target_stack, r4, sp, fp));
3756+
LoadJumpBuffer(masm, target_stack, true, r4);
3757+
__ Trap();
3758+
__ bind(&resume);
3759+
__ Move(kReturnRegister0, WasmFXResumeDescriptor::GetRegisterParameter(1));
3760+
__ LeaveFrame(StackFrame::WASM_STACK_EXIT);
3761+
__ Drop(WasmFXSwitchDescriptor::GetStackParameterCount());
3762+
__ Ret();
3763+
}
3764+
37073765
void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
37083766
Register arg_buffer = WasmFXReturnDescriptor::GetRegisterParameter(0);
37093767
Register active_stack = r3;

src/builtins/s390/builtins-s390.cc

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3712,6 +3712,66 @@ void Builtins::Generate_WasmFXSuspend(MacroAssembler* masm) {
37123712
__ Ret();
37133713
}
37143714

3715+
void Builtins::Generate_WasmFXSwitch(MacroAssembler* masm) {
3716+
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
3717+
Register tag = WasmFXSwitchDescriptor::GetRegisterParameter(0);
3718+
Register cont = WasmFXSwitchDescriptor::GetRegisterParameter(1);
3719+
Register target_stack_reg = WasmFXSwitchDescriptor::GetRegisterParameter(2);
3720+
Register arg_buffer_reg = WasmFXSwitchDescriptor::GetRegisterParameter(3);
3721+
MemOperand sig_op(fp, 2 * kSystemPointerSize);
3722+
Label resume;
3723+
__ Push(kContextRegister);
3724+
{
3725+
FrameScope scope(masm, StackFrame::MANUAL);
3726+
DCHECK(!AreAliased(kCArgRegs[4], cont, target_stack_reg, arg_buffer_reg));
3727+
__ PrepareCallCFunction(9, r0);
3728+
__ Move(kCArgRegs[4], tag);
3729+
__ StoreU64(cont,
3730+
MemOperand(sp, kStackFrameExtraParamSlot * kSystemPointerSize));
3731+
__ StoreU64(
3732+
target_stack_reg,
3733+
MemOperand(sp, (kStackFrameExtraParamSlot + 1) * kSystemPointerSize));
3734+
__ StoreU64(arg_buffer_reg, MemOperand(sp, (kStackFrameExtraParamSlot + 2) *
3735+
kSystemPointerSize));
3736+
Register scratch = r3;
3737+
__ LoadU64(scratch, sig_op);
3738+
__ StoreU64(scratch, MemOperand(sp, (kStackFrameExtraParamSlot + 3) *
3739+
kSystemPointerSize));
3740+
__ Move(kCArgRegs[0], ExternalReference::isolate_address());
3741+
__ Move(kCArgRegs[1], sp);
3742+
__ Move(kCArgRegs[2], fp);
3743+
__ GetLabelAddress(kCArgRegs[3], &resume);
3744+
__ CallCFunction(ExternalReference::wasm_switch_wasmfx_stack(), 9);
3745+
}
3746+
3747+
Label ok;
3748+
__ CmpU64(kReturnRegister0, Operand(0));
3749+
__ bne(&ok);
3750+
3751+
// No handler found.
3752+
__ Pop(kContextRegister); // Retrieve saved context.
3753+
__ CallRuntime(Runtime::kThrowWasmFXSuspendError);
3754+
3755+
__ bind(&ok);
3756+
__ Drop(1); // Drop saved context.
3757+
3758+
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
3759+
// Load the arg buffer to set up resume of target stack
3760+
__ Move(target_stack, kReturnRegister0);
3761+
Register arg_buffer = WasmFXResumeDescriptor::GetRegisterParameter(1);
3762+
__ Move(arg_buffer,
3763+
MemOperand(target_stack, wasm::StackMemory::arg_buffer_offset()));
3764+
3765+
DCHECK(!AreAliased(arg_buffer, target_stack, r3, sp, fp));
3766+
LoadJumpBuffer(masm, target_stack, true, r3);
3767+
__ Trap();
3768+
__ bind(&resume);
3769+
__ Move(kReturnRegister0, WasmFXResumeDescriptor::GetRegisterParameter(1));
3770+
__ LeaveFrame(StackFrame::WASM_STACK_EXIT);
3771+
__ Drop(WasmFXSwitchDescriptor::GetStackParameterCount());
3772+
__ Ret();
3773+
}
3774+
37153775
void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
37163776
Register arg_buffer = WasmFXReturnDescriptor::GetRegisterParameter(0);
37173777
Register active_stack = r2;

src/codegen/interface-descriptors-inl.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -875,9 +875,12 @@ constexpr auto WasmFXSwitchDescriptor::registers() {
875875
#if defined(V8_TARGET_ARCH_IA32)
876876
return RegisterArray(wasm::kGpParamRegisters[1], wasm::kGpParamRegisters[2],
877877
wasm::kGpParamRegisters[3], edi);
878-
#elif defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_S390)
878+
#elif defined(V8_TARGET_ARCH_ARM)
879879
return RegisterArray(wasm::kGpParamRegisters[1], wasm::kGpParamRegisters[2],
880880
wasm::kGpParamRegisters[3], r4);
881+
#elif defined(V8_TARGET_ARCH_S390X)
882+
return RegisterArray(wasm::kGpParamRegisters[1], wasm::kGpParamRegisters[2],
883+
wasm::kGpParamRegisters[3], r7);
881884
#else
882885
return RegisterArray(wasm::kGpParamRegisters[1], wasm::kGpParamRegisters[2],
883886
wasm::kGpParamRegisters[3], wasm::kGpParamRegisters[4]);

0 commit comments

Comments
 (0)