diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-01-29 22:50:38 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-01-29 22:50:38 +0100 |
| commit | 26fdf2275ad87d793f3f600bca9136c23d5b8451 (patch) | |
| tree | 4a9beff43bbc58c71fb1c4297315e2e425c5d9b7 | |
| parent | 1ad38124dff35eb3d3c2bb59833f559251763070 (diff) | |
| download | box64-26fdf2275ad87d793f3f600bca9136c23d5b8451.tar.gz box64-26fdf2275ad87d793f3f600bca9136c23d5b8451.zip | |
[RV64_DYNAREC] Fixed some isue wiht sse_get_reg helper function tht would incorectly mark a regs as changed single/non-single
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index f3badafb..de725ec0 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -1470,18 +1470,20 @@ int sse_get_reg(dynarec_rv64_t* dyn, int ninst, int s1, int a, int single) int sse_get_reg_empty(dynarec_rv64_t* dyn, int ninst, int s1, int a, int single) { if(dyn->e.ssecache[a].v!=-1) { - if(dyn->e.ssecache[a].single!=single && single) { - // writting back the double - FSD(dyn->e.ssecache[a].reg, xEmu, offsetof(x64emu_t, xmm[a])); - // need to wipe the half high 32bits of old Double because we now have a single - //SW(xZR, xEmu, offsetof(x64emu_t, xmm[a])+4); + if(dyn->e.ssecache[a].single!=single) { + if (single) { + // writing back the double + FSD(dyn->e.ssecache[a].reg, xEmu, offsetof(x64emu_t, xmm[a])); + // need to wipe the half high 32bits of old Double because we now have a single + //SW(xZR, xEmu, offsetof(x64emu_t, xmm[a])+4); + } + dyn->e.olds[a].changed = 1; + dyn->e.olds[a].purged = 0; + dyn->e.olds[a].reg = EXTIDX(dyn->e.ssecache[a].reg); + dyn->e.olds[a].single = 1-single; + dyn->e.ssecache[a].single = single; + dyn->e.extcache[EXTIDX(dyn->e.ssecache[a].reg)].t = single?EXT_CACHE_SS:EXT_CACHE_SD; } - dyn->e.olds[a].changed = 1; - dyn->e.olds[a].purged = 0; - dyn->e.olds[a].reg = EXTIDX(dyn->e.ssecache[a].reg); - dyn->e.olds[a].single = 1-single; - dyn->e.ssecache[a].single = single; - dyn->e.extcache[EXTIDX(dyn->e.ssecache[a].reg)].t = single?EXT_CACHE_SS:EXT_CACHE_SD; return dyn->e.ssecache[a].reg; } dyn->e.ssecache[a].reg = fpu_get_reg_xmm(dyn, single?EXT_CACHE_SS:EXT_CACHE_SD, a); |