From 9fa9cc203e989c832dece9ba5994f114ee3d5d5d Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 10 Dec 2025 09:31:57 +0000 Subject: [PATCH] save more regs Signed-off-by: lizzie --- .../dynarmic/backend/ppc64/a32_interface.cpp | 3 +- src/dynarmic/src/dynarmic/backend/ppc64/abi.h | 34 +++++++++++++++++++ .../src/dynarmic/backend/ppc64/emit_ppc64.cpp | 24 +++++-------- .../ppc64/emit_ppc64_data_processing.cpp | 1 - .../src/dynarmic/backend/ppc64/reg_alloc.h | 4 +-- .../src/dynarmic/backend/ppc64/stack_layout.h | 1 + 6 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp index e7269582c3..1f01592005 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp @@ -5,10 +5,9 @@ #include #include + #include "dynarmic/common/assert.h" -#include #include "dynarmic/common/common_types.h" - #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/frontend/A32/translate/a32_translate.h" #include "dynarmic/interface/A32/config.h" diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/abi.h b/src/dynarmic/src/dynarmic/backend/ppc64/abi.h index 0f7e059110..1b24e1e9a8 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/abi.h +++ b/src/dynarmic/src/dynarmic/backend/ppc64/abi.h @@ -8,6 +8,40 @@ namespace Dynarmic::Backend::PPC64 { +/* +https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#REG + +r0 Volatile register used in function prologs +r1 Stack frame pointer +r2 TOC pointer +r3 Volatile parameter and return value register +r4-r10 Volatile registers used for function parameters +r11 Volatile register used in calls by pointer and as an environment pointer for languages which require one +r12 Volatile register used for exception handling and glink code +r13 Reserved for use as system thread ID +r14-r31 Nonvolatile registers used for local variables + +f0 Volatile scratch register +f1-f4 Volatile floating point parameter and return value registers +f5-f13 Volatile floating point parameter registers +f14-f31 Nonvolatile registers + +LR Link register (volatile) +CTR Loop counter register (volatile) +XER Fixed point exception register (volatile) +FPSCR Floating point status and control register (volatile) + +CR0-CR1 Volatile condition code register fields +CR2-CR4 Nonvolatile condition code register fields +CR5-CR7 Volatile condition code register fields + +v0-v1 Volatile scratch registers +v2-v13 Volatile vector parameters registers +v14-v19 Volatile scratch registers +v20-v31 Non-volatile registers +vrsave Non-volatile 32-bit register +*/ + // Jit fn signature => (AXXAddressSpace& process, AXXJitState& thread_ctx, volatile u32* halt_reason) constexpr powah::GPR RPROCESS = powah::R3; constexpr powah::GPR RJIT = powah::R4; diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp index 14be3d3aaa..0d4e6e93c5 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp @@ -1,27 +1,25 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "dynarmic/backend/ppc64/emit_ppc64.h" - #include #include #include #include -#include -#include "a32_core.h" -#include "a64_core.h" -#include "abi.h" +#include "dynarmic/backend/ppc64/emit_ppc64.h" +#include "dynarmic/backend/ppc64/a32_core.h" +#include "dynarmic/backend/ppc64/a64_core.h" +#include "dynarmic/backend/ppc64/abi.h" #include "dynarmic/backend/ppc64/a32_core.h" #include "dynarmic/backend/ppc64/a64_core.h" #include "dynarmic/backend/ppc64/abi.h" #include "dynarmic/backend/ppc64/emit_context.h" #include "dynarmic/backend/ppc64/reg_alloc.h" +#include "dynarmic/backend/ppc64/stack_layout.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" #include "dynarmic/ir/opcodes.h" -#include "stack_layout.h" namespace Dynarmic::Backend::PPC64 { @@ -156,28 +154,24 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::ReturnToDisp } void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location, bool) { - auto const tmp_lr = ctx.reg_alloc.ScratchGpr(); auto const tmp = ctx.reg_alloc.ScratchGpr(); - code.LD(tmp_lr, PPC64::RJIT, offsetof(StackLayout, lr)); - code.MFCTR(tmp_lr); if (ctx.emit_conf.a64_variant) { code.LI(tmp, terminal.next.Value()); code.STD(tmp, PPC64::RJIT, offsetof(A64JitState, pc)); code.LD(tmp, PPC64::RJIT, offsetof(A64JitState, run_fn)); code.MTCTR(tmp); - for (u32 i = 0; i < 4; ++i) - code.STD(powah::GPR{3 + i}, powah::R1, -((GPR_ORDER.size() + i) * 8)); + for (u32 i = 0; i < 16; ++i) + code.STD(powah::GPR{14 + i}, powah::R1, -(offsetof(StackLayout, extra_regs) + (i * 8))); code.ADDIS(powah::R1, powah::R1, -sizeof(StackLayout)); code.BCTRL(); code.ADDI(powah::R1, powah::R1, sizeof(StackLayout)); - for (u32 i = 0; i < 4; ++i) - code.LD(powah::GPR{3 + i}, powah::R1, -((GPR_ORDER.size() + i) * 8)); + for (u32 i = 0; i < 16; ++i) + code.LD(powah::GPR{14 + i}, powah::R1, -(offsetof(StackLayout, extra_regs) + (i * 8))); } else { code.LI(tmp, terminal.next.Value()); code.STW(tmp, PPC64::RJIT, offsetof(A32JitState, regs) + sizeof(u32) * 15); ASSERT(false && "unimp"); } - code.MTCTR(tmp_lr); } void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location, bool) { diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp index 98a73f2028..24c677c9ff 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp @@ -4,7 +4,6 @@ #include #include -#include "abi.h" #include "dynarmic/common/assert.h" #include "dynarmic/backend/ppc64/a32_core.h" #include "dynarmic/backend/ppc64/abi.h" diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/ppc64/reg_alloc.h index 00815cf902..a8122bfb92 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/reg_alloc.h +++ b/src/dynarmic/src/dynarmic/backend/ppc64/reg_alloc.h @@ -10,10 +10,10 @@ #include #include -#include "dynarmic/common/assert.h" -#include "dynarmic/common/common_types.h" #include +#include "dynarmic/common/assert.h" +#include "dynarmic/common/common_types.h" #include "dynarmic/backend/ppc64/stack_layout.h" #include "dynarmic/backend/ppc64/hostloc.h" #include "dynarmic/ir/cond.h" diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h b/src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h index 91aac3d942..fa4948b364 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h +++ b/src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h @@ -16,6 +16,7 @@ struct alignas(16) StackLayout { std::array spill; u64 check_bit; void* lr; + std::array extra_regs; }; static_assert(sizeof(StackLayout) % 16 == 0);