diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp index b1fc35446f..5233f3ac66 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/a64_interface.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "dynarmic/common/assert.h" diff --git a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp index 751ed1c19a..0f66940339 100644 --- a/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp +++ b/src/dynarmic/src/dynarmic/backend/ppc64/emit_ppc64.cpp @@ -169,7 +169,21 @@ void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LinkBlock te } void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location, bool) { - ASSERT(false && "unimp"); + if (ctx.emit_conf.a64_variant) { + auto const tmp = ctx.reg_alloc.ScratchGpr(); + code.LI(tmp, terminal.next.Value()); + code.STD(tmp, PPC64::RJIT, offsetof(A64JitState, pc)); + code.LD(tmp, PPC64::RTOCPTR, 0); + code.MTCTR(tmp); + code.LD(powah::R2, PPC64::RTOCPTR, 8); + code.LD(powah::R11, PPC64::RTOCPTR, 16); + code.BCTR(); + } else { + auto const tmp = ctx.reg_alloc.ScratchGpr(); + code.LI(tmp, terminal.next.Value()); + code.STW(tmp, PPC64::RJIT, offsetof(A32JitState, regs) + sizeof(u32) * 15); + ASSERT(false && "unimp"); + } } void EmitTerminal(powah::Context& code, EmitContext& ctx, IR::Term::PopRSBHint, IR::LocationDescriptor, bool) {