mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-18 23:07:00 +02:00
save more regs
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
34c18d2807
commit
78cde5696c
6 changed files with 48 additions and 21 deletions
|
|
@ -5,10 +5,9 @@
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <boost/icl/interval_set.hpp>
|
#include <boost/icl/interval_set.hpp>
|
||||||
#include "dynarmic/common/assert.h"
|
|
||||||
#include <mcl/scope_exit.hpp>
|
|
||||||
#include "dynarmic/common/common_types.h"
|
|
||||||
|
|
||||||
|
#include "dynarmic/common/assert.h"
|
||||||
|
#include "dynarmic/common/common_types.h"
|
||||||
#include "dynarmic/frontend/A32/a32_location_descriptor.h"
|
#include "dynarmic/frontend/A32/a32_location_descriptor.h"
|
||||||
#include "dynarmic/frontend/A32/translate/a32_translate.h"
|
#include "dynarmic/frontend/A32/translate/a32_translate.h"
|
||||||
#include "dynarmic/interface/A32/config.h"
|
#include "dynarmic/interface/A32/config.h"
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,40 @@
|
||||||
|
|
||||||
namespace Dynarmic::Backend::PPC64 {
|
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)
|
// Jit fn signature => (AXXAddressSpace& process, AXXJitState& thread_ctx, volatile u32* halt_reason)
|
||||||
constexpr powah::GPR RPROCESS = powah::R3;
|
constexpr powah::GPR RPROCESS = powah::R3;
|
||||||
constexpr powah::GPR RJIT = powah::R4;
|
constexpr powah::GPR RJIT = powah::R4;
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,25 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
#include "dynarmic/backend/ppc64/emit_ppc64.h"
|
|
||||||
|
|
||||||
#include <bit>
|
#include <bit>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <powah_emit.hpp>
|
#include <powah_emit.hpp>
|
||||||
#include <fmt/ostream.h>
|
#include <fmt/ostream.h>
|
||||||
#include <mcl/bit/bit_field.hpp>
|
|
||||||
|
|
||||||
#include "a32_core.h"
|
#include "dynarmic/backend/ppc64/emit_ppc64.h"
|
||||||
#include "a64_core.h"
|
#include "dynarmic/backend/ppc64/a32_core.h"
|
||||||
#include "abi.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/a32_core.h"
|
||||||
#include "dynarmic/backend/ppc64/a64_core.h"
|
#include "dynarmic/backend/ppc64/a64_core.h"
|
||||||
#include "dynarmic/backend/ppc64/abi.h"
|
#include "dynarmic/backend/ppc64/abi.h"
|
||||||
#include "dynarmic/backend/ppc64/emit_context.h"
|
#include "dynarmic/backend/ppc64/emit_context.h"
|
||||||
#include "dynarmic/backend/ppc64/reg_alloc.h"
|
#include "dynarmic/backend/ppc64/reg_alloc.h"
|
||||||
|
#include "dynarmic/backend/ppc64/stack_layout.h"
|
||||||
#include "dynarmic/ir/basic_block.h"
|
#include "dynarmic/ir/basic_block.h"
|
||||||
#include "dynarmic/ir/microinstruction.h"
|
#include "dynarmic/ir/microinstruction.h"
|
||||||
#include "dynarmic/ir/opcodes.h"
|
#include "dynarmic/ir/opcodes.h"
|
||||||
#include "stack_layout.h"
|
|
||||||
|
|
||||||
namespace Dynarmic::Backend::PPC64 {
|
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) {
|
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();
|
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) {
|
if (ctx.emit_conf.a64_variant) {
|
||||||
code.LI(tmp, terminal.next.Value());
|
code.LI(tmp, terminal.next.Value());
|
||||||
code.STD(tmp, PPC64::RJIT, offsetof(A64JitState, pc));
|
code.STD(tmp, PPC64::RJIT, offsetof(A64JitState, pc));
|
||||||
code.LD(tmp, PPC64::RJIT, offsetof(A64JitState, run_fn));
|
code.LD(tmp, PPC64::RJIT, offsetof(A64JitState, run_fn));
|
||||||
code.MTCTR(tmp);
|
code.MTCTR(tmp);
|
||||||
for (u32 i = 0; i < 4; ++i)
|
for (u32 i = 0; i < 16; ++i)
|
||||||
code.STD(powah::GPR{3 + i}, powah::R1, -((GPR_ORDER.size() + i) * 8));
|
code.STD(powah::GPR{14 + i}, powah::R1, -(offsetof(StackLayout, extra_regs) + (i * 8)));
|
||||||
code.ADDIS(powah::R1, powah::R1, -sizeof(StackLayout));
|
code.ADDIS(powah::R1, powah::R1, -sizeof(StackLayout));
|
||||||
code.BCTRL();
|
code.BCTRL();
|
||||||
code.ADDI(powah::R1, powah::R1, sizeof(StackLayout));
|
code.ADDI(powah::R1, powah::R1, sizeof(StackLayout));
|
||||||
for (u32 i = 0; i < 4; ++i)
|
for (u32 i = 0; i < 16; ++i)
|
||||||
code.LD(powah::GPR{3 + i}, powah::R1, -((GPR_ORDER.size() + i) * 8));
|
code.LD(powah::GPR{14 + i}, powah::R1, -(offsetof(StackLayout, extra_regs) + (i * 8)));
|
||||||
} else {
|
} else {
|
||||||
code.LI(tmp, terminal.next.Value());
|
code.LI(tmp, terminal.next.Value());
|
||||||
code.STW(tmp, PPC64::RJIT, offsetof(A32JitState, regs) + sizeof(u32) * 15);
|
code.STW(tmp, PPC64::RJIT, offsetof(A32JitState, regs) + sizeof(u32) * 15);
|
||||||
ASSERT(false && "unimp");
|
ASSERT(false && "unimp");
|
||||||
}
|
}
|
||||||
code.MTCTR(tmp_lr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location, bool) {
|
void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location, bool) {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
#include <powah_emit.hpp>
|
#include <powah_emit.hpp>
|
||||||
#include <fmt/ostream.h>
|
#include <fmt/ostream.h>
|
||||||
|
|
||||||
#include "abi.h"
|
|
||||||
#include "dynarmic/common/assert.h"
|
#include "dynarmic/common/assert.h"
|
||||||
#include "dynarmic/backend/ppc64/a32_core.h"
|
#include "dynarmic/backend/ppc64/a32_core.h"
|
||||||
#include "dynarmic/backend/ppc64/abi.h"
|
#include "dynarmic/backend/ppc64/abi.h"
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,10 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <powah_emit.hpp>
|
#include <powah_emit.hpp>
|
||||||
#include "dynarmic/common/assert.h"
|
|
||||||
#include "dynarmic/common/common_types.h"
|
|
||||||
#include <ankerl/unordered_dense.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/stack_layout.h"
|
||||||
#include "dynarmic/backend/ppc64/hostloc.h"
|
#include "dynarmic/backend/ppc64/hostloc.h"
|
||||||
#include "dynarmic/ir/cond.h"
|
#include "dynarmic/ir/cond.h"
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ struct alignas(16) StackLayout {
|
||||||
std::array<u64, SpillCount> spill;
|
std::array<u64, SpillCount> spill;
|
||||||
u64 check_bit;
|
u64 check_bit;
|
||||||
void* lr;
|
void* lr;
|
||||||
|
std::array<u64, 29> extra_regs;
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert(sizeof(StackLayout) % 16 == 0);
|
static_assert(sizeof(StackLayout) % 16 == 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue