From 7e486efbf63833b297d28eb483f62736827b0e1d Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 20 Mar 2026 05:28:45 +0000 Subject: [PATCH] fix mk8d --- src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp | 5 +---- src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h | 4 ++-- src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp | 5 +---- src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h | 4 ++-- src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp | 2 +- src/dynarmic/src/dynarmic/backend/x64/emit_x64.h | 5 ++--- 6 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp index 36349c4f36..c1ac289479 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp @@ -59,7 +59,7 @@ static Xbyak::Address MJitStateExtReg(A32::ExtReg reg) { UNREACHABLE(); } -A32EmitContext::A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels) +A32EmitContext::A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) : EmitContext(reg_alloc, block, shared_labels) , conf(conf) {} @@ -112,9 +112,6 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) { return gprs; }(), any_xmm); - // up to 2 labels per insn - if (auto const inst_count = block.instructions.size(); inst_count > shared_labels.capacity()) - shared_labels.reserve(inst_count * 16); A32EmitContext ctx{conf, reg_alloc, block, shared_labels}; // Start emitting. diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h index 00beff3004..8e97dc7737 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h @@ -29,7 +29,7 @@ namespace Dynarmic::Backend::X64 { class RegAlloc; struct A32EmitContext final : public EmitContext { - A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels); + A32EmitContext(const A32::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); A32::LocationDescriptor Location() const; A32::LocationDescriptor EndLocation() const; @@ -130,7 +130,7 @@ public: ankerl::unordered_dense::map, void (*)()> write_fallbacks; ankerl::unordered_dense::map, void (*)()> exclusive_write_fallbacks; ankerl::unordered_dense::set do_not_fastmem; - std::vector shared_labels; + boost::container::stable_vector shared_labels; void (*memory_read_128)() = nullptr; // Dummy void (*memory_write_128)() = nullptr; // Dummy const void* terminal_handler_pop_rsb_hint; diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp index e80063b63c..dfd12e0108 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp @@ -37,7 +37,7 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; -A64EmitContext::A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels) +A64EmitContext::A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) : EmitContext(reg_alloc, block, shared_labels) , conf(conf) {} @@ -86,9 +86,6 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) noexcept { return gprs; }(), any_xmm}; - // up to 2 labels per insn - if (auto const inst_count = block.instructions.size(); inst_count > shared_labels.capacity()) - shared_labels.reserve(inst_count * 16); A64EmitContext ctx{conf, reg_alloc, block, shared_labels}; // Start emitting. diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h index 94e9556f92..d57b1d81b9 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h @@ -27,7 +27,7 @@ namespace Dynarmic::Backend::X64 { struct A64EmitContext final : public EmitContext { - A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels); + A64EmitContext(const A64::UserConfig& conf, RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); A64::LocationDescriptor Location() const; bool IsSingleStep() const; @@ -126,7 +126,7 @@ public: ankerl::unordered_dense::map, void (*)()> write_fallbacks; ankerl::unordered_dense::map, void (*)()> exclusive_write_fallbacks; ankerl::unordered_dense::set do_not_fastmem; - std::vector shared_labels; + boost::container::stable_vector shared_labels; const void* terminal_handler_pop_rsb_hint = nullptr; const void* terminal_handler_fast_dispatch_hint = nullptr; FastDispatchEntry& (*fast_dispatch_table_lookup)(u64) = nullptr; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp index 2bb1fe6853..4ed198e09f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp @@ -32,7 +32,7 @@ namespace Dynarmic::Backend::X64 { using namespace Xbyak::util; -EmitContext::EmitContext(RegAlloc& reg_alloc, IR::Block& block, std::vector& shared_labels) +EmitContext::EmitContext(RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels) : reg_alloc(reg_alloc) , block(block) , shared_labels(shared_labels) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h index 7d20f17341..619945e19a 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.h @@ -55,20 +55,19 @@ using HalfVectorArray = std::array& shared_labels); + EmitContext(RegAlloc& reg_alloc, IR::Block& block, boost::container::stable_vector& shared_labels); virtual ~EmitContext(); virtual FP::FPCR FPCR(bool fpcr_controlled = true) const = 0; virtual bool HasOptimization(OptimizationFlag flag) const = 0; [[nodiscard]] inline Xbyak::Label* GenSharedLabel() noexcept { - DEBUG_ASSERT(shared_labels.size() + 1 <= shared_labels.capacity()); return &shared_labels.emplace_back(); } std::vector> deferred_emits; RegAlloc& reg_alloc; IR::Block& block; - std::vector& shared_labels; + boost::container::stable_vector& shared_labels; }; class EmitX64 {