From 403cc0ab66eb4a6ca09edc03999b639fb3872702 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 31 Aug 2026 02:42:30 +0000 Subject: [PATCH] [dynarmic] fix windows perf regression due to reordered CPR Signed-off-by: lizzie --- src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.h | 6 +++--- src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.h | 8 +++----- src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp | 2 +- src/dynarmic/src/dynarmic/backend/x64/block_of_code.h | 7 +++++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.h b/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.h index ad151e6092..c61f7723a1 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_jitstate.h @@ -39,9 +39,6 @@ struct A32JitState { u32 cpsr_q = 0; u32 cpsr_nzcv = 0; u32 cpsr_jaifm = 0; - u32 fpsr_exc = 0; - u32 fpsr_qc = 0; - u32 fpsr_nzcv = 0; alignas(16) std::array ExtReg{}; // Extension registers. @@ -56,6 +53,9 @@ struct A32JitState { u32 rsb_ptr = 0; std::array rsb_location_descriptors; std::array rsb_codeptrs; + u32 fpsr_exc = 0; + u32 fpsr_qc = 0; + u32 fpsr_nzcv = 0; u32 Cpsr() const; void SetCpsr(u32 cpsr); diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.h b/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.h index c3d8b04d1e..6de15b4709 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_jitstate.h @@ -39,12 +39,7 @@ struct A64JitState { u64 sp = 0; u64 pc = 0; u32 cpsr_nzcv = 0; - u32 fpsr_exc = 0; - u32 fpsr_qc = 0; - u32 fpcr = 0; - alignas(16) std::array vec{}; // Extension registers. - // For internal use (See: BlockOfCode::RunCode) u32 guest_MXCSR = 0x00001f80; u32 asimd_MXCSR = 0x00009fc0; @@ -55,6 +50,9 @@ struct A64JitState { u32 rsb_ptr = 0; std::array rsb_location_descriptors; std::array rsb_codeptrs; + u32 fpsr_exc = 0; + u32 fpsr_qc = 0; + u32 fpcr = 0; u32 GetPstate() const { return NZCV::FromX64(cpsr_nzcv); diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 24bfa799f2..65b60e956b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -170,9 +170,9 @@ BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_cod , nullptr //Allow RWE #endif , nullptr) - , constant_pool(*this, CONSTANT_POOL_SIZE) , jsi(jsi) , cb(std::move(cb)) + , constant_pool(*this, CONSTANT_POOL_SIZE) { EnableWriting(); EnsureMemoryCommitted(PRELUDE_COMMIT_SIZE); diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h index 20012a070f..b154d1ddc4 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h @@ -173,12 +173,15 @@ private: static constexpr size_t MXCSR_ALREADY_EXITED = 1 << 0; static constexpr size_t FORCE_RETURN = 1 << 1; - ConstantPool constant_pool; + // dont change the order of these + // Windows hates when jsi -> cb -> constant-pool are not in that + // specific order JitStateInfo jsi; + RunCodeCallbacks cb; + ConstantPool constant_pool; std::array return_from_run_code; RunCodeFuncType run_code = nullptr; RunCodeFuncType step_code = nullptr; - RunCodeCallbacks cb; CodePtr code_begin = nullptr; #ifdef _WIN32 size_t committed_size = 0;