From fa7713b13caf4f60223aa9c76d497342096ab791 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Thu, 29 Oct 2026 21:02:16 +0800 Subject: [PATCH] [ARM64_DYNAREC] Fixed xmm value lost in a loop ``` pcmpestrm xmm0, xmm14, 0x2 ``` In this opcode, `sse_get_reg_empty()` marked xmm0 old value as dead even when the same opcode had already read it, so loop merge points skipped storing it. And in the second iteration, the C helper of this opcode will have a stale value from memory. --- src/dynarec/arm64/dynarec_arm64_helper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index ac4f39b8c9..adfebf0c79 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -1548,8 +1548,9 @@ int sse_get_reg_empty(dynarec_arm_t* dyn, int ninst, int s1, int a) dyn->n.xmm_used |= 1<n.ssecache[a].reg; } + if(!(dyn->n.xmm_used&(1<n.xmm_unneeded |= 1<n.xmm_used |= 1<n.xmm_unneeded |= 1<n.ssecache[a].reg = fpu_get_reg_xmm(dyn, NEON_CACHE_XMMW, a); dyn->n.ssecache[a].write = 1; // it will be write... return dyn->n.ssecache[a].reg;