Browse Source

fix invalidations, use stack for checkbit

Signed-off-by: lizzie <lizzie@eden-emu.dev>
dynarmic-ppc64
lizzie 2 months ago
parent
commit
791f353ad0
No known key found for this signature in database GPG Key ID: 287378CADCAB13
  1. 1
      src/dynarmic/README.md
  2. 1
      src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp
  3. 4
      src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp
  4. 2
      src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_a64.cpp
  5. 12
      src/dynarmic/src/dynarmic/backend/ppc64/stack_layout.h

1
src/dynarmic/README.md

@ -35,6 +35,7 @@ There are no plans to support v1 or v2.
* x86-64
* AArch64
* PowerPC 64 (POWER 4 and up)
There are no plans to support any 32-bit architecture.

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

@ -81,6 +81,7 @@ struct Jit::Impl final {
ASSERT(!is_executing);
is_executing = true;
HaltReason hr = core.Run(current_address_space, jit_state, &halt_reason);
current_address_space.ClearCache(); // TODO: dont just invalidate everything
is_executing = false;
RequestCacheInvalidation();
return hr;

4
src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp

@ -182,8 +182,8 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::CheckBit ter
powah::Label const l_else = code.DefineLabel();
powah::Label const l_end = code.DefineLabel();
auto const tmp = ctx.reg_alloc.ScratchGpr();
code.LBZ(tmp, PPC64::RJIT, ctx.emit_conf.a64_variant ? offsetof(A64JitState, check_bit) : offsetof(A32JitState, check_bit));
code.CMPLWI(tmp, 0);
code.LD(tmp, powah::R1, offsetof(StackLayout, check_bit));
code.CMPLDI(tmp, 0);
code.BEQ(powah::CR0, l_else);
// CheckBit == 1
EmitTerminal(code, ctx, terminal.then_, initial_location, is_single_step);

2
src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64_a64.cpp

@ -19,7 +19,7 @@ namespace Dynarmic::Backend::PPC64 {
template<>
void EmitIR<IR::Opcode::A64SetCheckBit>(powah::Context& code, EmitContext& ctx, IR::Inst* inst) {
auto const value = ctx.reg_alloc.UseGpr(inst->GetArg(0));
code.STB(value, PPC64::RJIT, offsetof(A64JitState, check_bit));
code.STD(value, powah::R1, offsetof(StackLayout, check_bit));
}
template<>

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

@ -9,18 +9,12 @@
namespace Dynarmic::Backend::PPC64 {
constexpr size_t SpillCount = 64;
constexpr size_t SpillCount = 16;
struct alignas(16) StackLayout {
s64 cycles_remaining;
s64 cycles_to_run;
std::array<u64, 18> regs;
std::array<u64, SpillCount> spill;
u32 save_host_fpcr;
u32 save_host_fpsr;
bool check_bit;
u64 check_bit;
};
static_assert(sizeof(StackLayout) % 16 == 0);

Loading…
Cancel
Save