about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorphorcys <phorcys@126.com>2025-07-09 14:56:12 +0800
committerGitHub <noreply@github.com>2025-07-09 08:56:12 +0200
commit4bb1bc9ea8011cbb39655eca0d09b2f56a2344af (patch)
treed4f626ebecf09c0c5d9a502fd172d9ae41e88b2d
parent614d142205241a06733fa49f438c47a6906a5ab2 (diff)
downloadbox64-4bb1bc9ea8011cbb39655eca0d09b2f56a2344af.tar.gz
box64-4bb1bc9ea8011cbb39655eca0d09b2f56a2344af.zip
[LA64_DYNAREC] Fix la64 avx->sse same reg migration. (#2801)
In current code, if an avx reg  writed reg is used by  following sse inst.
A VLD would emitted by sse_get_reg,  causing prev avx inst writed content lose.
Skip sse_get_reg's VLD  emit, when reg content is already load/changed in prev avx inst.
-rw-r--r--src/dynarec/la64/dynarec_la64_helper.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/dynarec/la64/dynarec_la64_helper.c b/src/dynarec/la64/dynarec_la64_helper.c
index 6efc7bfb..bd925559 100644
--- a/src/dynarec/la64/dynarec_la64_helper.c
+++ b/src/dynarec/la64/dynarec_la64_helper.c
@@ -881,15 +881,17 @@ int sse_get_reg(dynarec_la64_t* dyn, int ninst, int s1, int a, int forwrite)
         }
         return dyn->lsx.ssecache[a].reg;
     }
+    int need_vld = 1;
     // migrate from avx to sse
     if (dyn->lsx.avxcache[a].v != -1) {
         avx_reflect_reg_upper128(dyn, ninst, a, forwrite);
         dyn->lsx.avxcache[a].v = -1;
+        need_vld = 0;
     }
     dyn->lsx.ssecache[a].reg = fpu_get_reg_xmm(dyn, forwrite ? LSX_CACHE_XMMW : LSX_CACHE_XMMR, a);
     int ret = dyn->lsx.ssecache[a].reg;
     dyn->lsx.ssecache[a].write = forwrite;
-    VLD(ret, xEmu, offsetof(x64emu_t, xmm[a]));
+    if(need_vld) VLD(ret, xEmu, offsetof(x64emu_t, xmm[a])); //skip VLD if migrate from avx
     return ret;
 }