diff --git a/src/dynarmic/backend/arm64/emit_arm64.cpp b/src/dynarmic/backend/arm64/emit_arm64.cpp index ef553f2b..3ac68ac7 100644 --- a/src/dynarmic/backend/arm64/emit_arm64.cpp +++ b/src/dynarmic/backend/arm64/emit_arm64.cpp @@ -180,7 +180,7 @@ EmittedBlockInfo EmitArm64(oaknut::CodeGenerator& code, IR::Block block, const E FpsrManager fpsr_manager{code, conf.state_fpsr_offset}; RegAlloc reg_alloc{code, fpsr_manager, GPR_ORDER, FPR_ORDER}; - EmitContext ctx{block, reg_alloc, conf, ebi, fpsr_manager}; + EmitContext ctx{block, reg_alloc, conf, ebi, fpsr_manager, {}}; ebi.entry_point = code.ptr(); @@ -232,6 +232,12 @@ EmittedBlockInfo EmitArm64(oaknut::CodeGenerator& code, IR::Block block, const E EmitAddCycles(code, ctx, block.CycleCount()); conf.emit_terminal(code, ctx); + code.BRK(0); + + for (const auto& deferred_emit : ctx.deferred_emits) { + deferred_emit(); + } + code.BRK(0); ebi.size = code.ptr() - ebi.entry_point; return ebi; diff --git a/src/dynarmic/backend/arm64/emit_context.h b/src/dynarmic/backend/arm64/emit_context.h index 108e0a42..0f55a630 100644 --- a/src/dynarmic/backend/arm64/emit_context.h +++ b/src/dynarmic/backend/arm64/emit_context.h @@ -5,6 +5,12 @@ #pragma once +#include +#include +#include + +#include + #include "dynarmic/backend/arm64/emit_arm64.h" #include "dynarmic/backend/arm64/reg_alloc.h" #include "dynarmic/common/fp/fpcr.h" @@ -19,6 +25,12 @@ namespace Dynarmic::Backend::Arm64 { struct EmitConfig; class FpsrManager; +using SharedLabel = std::shared_ptr; + +inline SharedLabel GenSharedLabel() { + return std::make_shared(); +} + struct EmitContext { IR::Block& block; RegAlloc& reg_alloc; @@ -26,6 +38,8 @@ struct EmitContext { EmittedBlockInfo& ebi; FpsrManager& fpsr; + std::vector> deferred_emits; + FP::FPCR FPCR(bool fpcr_controlled = true) const { const FP::FPCR fpcr = conf.descriptor_to_fpcr(block.Location()); return fpcr_controlled ? fpcr : fpcr.ASIMDStandardValue();