diff --git a/src/dynarmic/backend/A64/a32_emit_a64.cpp b/src/dynarmic/backend/A64/a32_emit_a64.cpp index 82b5d539..c71ff418 100644 --- a/src/dynarmic/backend/A64/a32_emit_a64.cpp +++ b/src/dynarmic/backend/A64/a32_emit_a64.cpp @@ -62,6 +62,10 @@ A32::LocationDescriptor A32EmitContext::Location() const { return A32::LocationDescriptor{block.Location()}; } +A32::LocationDescriptor A32EmitContext::EndLocation() const { + return A32::LocationDescriptor{block.EndLocation()}; +} + bool A32EmitContext::IsSingleStep() const { return A32::LocationDescriptor{block.Location()}.SingleStepping(); } @@ -699,6 +703,15 @@ void A32EmitA64::EmitA32BXWritePC(A32EmitContext& ctx, IR::Inst* inst) { } } +void A32EmitA64::EmitA32UpdateUpperLocationDescriptor(A32EmitContext& ctx, IR::Inst*) { + for (auto& inst : ctx.block) { + if (inst.GetOpcode() == IR::Opcode::A32BXWritePC) { + return; + } + } + EmitSetUpperLocationDescriptor(ctx.EndLocation(), ctx.Location()); +} + void A32EmitA64::EmitA32CallSupervisor(A32EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.HostCall(nullptr); diff --git a/src/dynarmic/backend/A64/a32_emit_a64.h b/src/dynarmic/backend/A64/a32_emit_a64.h index 981921b6..f605a997 100644 --- a/src/dynarmic/backend/A64/a32_emit_a64.h +++ b/src/dynarmic/backend/A64/a32_emit_a64.h @@ -30,6 +30,7 @@ class RegAlloc; struct A32EmitContext final : public EmitContext { A32EmitContext(RegAlloc& reg_alloc, IR::Block& block); A32::LocationDescriptor Location() const; + A32::LocationDescriptor EndLocation() const; bool IsSingleStep() const; FP::RoundingMode FPSCR_RMode() const override; u32 FPCR() const override; diff --git a/src/dynarmic/backend/A64/opcodes.inc b/src/dynarmic/backend/A64/opcodes.inc index 6a74cb01..55b50e5b 100644 --- a/src/dynarmic/backend/A64/opcodes.inc +++ b/src/dynarmic/backend/A64/opcodes.inc @@ -32,7 +32,7 @@ A32OPC(GetGEFlags, U32, A32OPC(SetGEFlags, Void, U32 ) A32OPC(SetGEFlagsCompressed, Void, U32 ) A32OPC(BXWritePC, Void, U32 ) -//A32OPC(UpdateUpperLocationDescriptor, Void, ) +A32OPC(UpdateUpperLocationDescriptor, Void, ) A32OPC(CallSupervisor, Void, U32 ) A32OPC(ExceptionRaised, Void, U32, U64 ) //A32OPC(DataSynchronizationBarrier, Void, )