diff options
| author | phorcys <phorcys@126.com> | 2025-07-09 14:56:12 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-09 08:56:12 +0200 |
| commit | 4bb1bc9ea8011cbb39655eca0d09b2f56a2344af (patch) | |
| tree | d4f626ebecf09c0c5d9a502fd172d9ae41e88b2d | |
| parent | 614d142205241a06733fa49f438c47a6906a5ab2 (diff) | |
| download | box64-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.c | 4 |
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; } |