Browse Source

save more regs

Signed-off-by: lizzie <lizzie@eden-emu.dev>
dynarmic-ppc64
lizzie 3 weeks ago
parent
commit
9fa9cc203e
No known key found for this signature in database GPG Key ID: 287378CADCAB13
  1. 3
      src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp
  2. 34
      src/dynarmic/src/dynarmic/backend/ppc64/abi.h
  3. 24
      src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp
  4. 1
      src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp
  5. 4
      src/dynarmic/src/dynarmic/backend/ppc64/reg_alloc.h
  6. 1
      src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h

3
src/dynarmic/src/dynarmic/backend/ppc64/a32_interface.cpp

@ -5,10 +5,9 @@
#include <mutex>
#include <boost/icl/interval_set.hpp>
#include "dynarmic/common/assert.h"
#include <mcl/scope_exit.hpp>
#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"

34
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;

24
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 <bit>
#include <cstdint>
#include <powah_emit.hpp>
#include <fmt/ostream.h>
#include <mcl/bit/bit_field.hpp>
#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) {

1
src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_data_processing.cpp

@ -4,7 +4,6 @@
#include <powah_emit.hpp>
#include <fmt/ostream.h>
#include "abi.h"
#include "dynarmic/common/assert.h"
#include "dynarmic/backend/ppc64/a32_core.h"
#include "dynarmic/backend/ppc64/abi.h"

4
src/dynarmic/src/dynarmic/backend/ppc64/reg_alloc.h

@ -10,10 +10,10 @@
#include <vector>
#include <powah_emit.hpp>
#include "dynarmic/common/assert.h"
#include "dynarmic/common/common_types.h"
#include <ankerl/unordered_dense.h>
#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"

1
src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h

@ -16,6 +16,7 @@ struct alignas(16) StackLayout {
std::array<u64, SpillCount> spill;
u64 check_bit;
void* lr;
std::array<u64, 29> extra_regs;
};
static_assert(sizeof(StackLayout) % 16 == 0);

Loading…
Cancel
Save