diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_private.h | 2 |
3 files changed, 9 insertions, 5 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c index 2d46d5e2..b3aedaa8 100644 --- a/src/dynarec/rv64/dynarec_rv64_functions.c +++ b/src/dynarec/rv64/dynarec_rv64_functions.c @@ -363,7 +363,11 @@ int fpuCacheNeedsTransform(dynarec_rv64_t* dyn, int ninst) { if(!cache_i2.extcache[i].v) { // but there is nothing at i2 for i ret = 1; } else if(dyn->insts[ninst].e.extcache[i].v!=cache_i2.extcache[i].v) { // there is something different - ret = 1; + if (dyn->insts[ninst].e.extcache[i].n != cache_i2.extcache[i].n) { // not the same x64 reg + ret = 1; + } else if (dyn->insts[ninst].e.extcache[i].t == EXT_CACHE_XMMR && cache_i2.extcache[i].t == EXT_CACHE_XMMW) { /* nothing */ + } else + ret = 1; } } else if(cache_i2.extcache[i].v) ret = 1; @@ -495,7 +499,7 @@ void extcacheUnwind(extcache_t* cache) break; case EXT_CACHE_XMMR: case EXT_CACHE_XMMW: - cache->ssecache[cache->extcache[i].n].reg = i; + cache->ssecache[cache->extcache[i].n].reg = EXTREG(i); cache->ssecache[cache->extcache[i].n].vector = 1; cache->ssecache[cache->extcache[i].n].write = (cache->extcache[i].t == EXT_CACHE_XMMW) ? 1 : 0; ++cache->fpu_reg; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 2a28a0bf..3461cec0 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -2055,7 +2055,7 @@ static void loadCache(dynarec_rv64_t* dyn, int ninst, int stack_cnt, int s1, int MESSAGE(LOG_DUMP, "\t - Loading %s\n", getCacheName(t, n)); SET_ELEMENT_WIDTH(s1, VECTOR_SEW8); ADDI(s1, xEmu, offsetof(x64emu_t, xmm[n])); - VLE8_V(i, s1, VECTOR_UNMASKED, VECTOR_NFIELD1); + VLE8_V(reg, s1, VECTOR_UNMASKED, VECTOR_NFIELD1); break; case EXT_CACHE_SS: MESSAGE(LOG_DUMP, "\t - Loading %s\n", getCacheName(t, n)); @@ -2115,7 +2115,7 @@ static void unloadCache(dynarec_rv64_t* dyn, int ninst, int stack_cnt, int s1, i MESSAGE(LOG_DUMP, "\t - Unloading %s\n", getCacheName(t, n)); SET_ELEMENT_WIDTH(s1, VECTOR_SEW8); ADDI(s1, xEmu, offsetof(x64emu_t, xmm[n])); - VSE8_V(i, s1, VECTOR_UNMASKED, VECTOR_NFIELD1); + VSE8_V(reg, s1, VECTOR_UNMASKED, VECTOR_NFIELD1); break; case EXT_CACHE_SS: MESSAGE(LOG_DUMP, "\t - Unloading %s\n", getCacheName(t, n)); diff --git a/src/dynarec/rv64/dynarec_rv64_private.h b/src/dynarec/rv64/dynarec_rv64_private.h index 70f58661..b5bfff5b 100644 --- a/src/dynarec/rv64/dynarec_rv64_private.h +++ b/src/dynarec/rv64/dynarec_rv64_private.h @@ -154,7 +154,7 @@ typedef struct dynarec_rv64_s { // convert idx (0..24) to reg index (10..31 0..1) #define EXTREG(A) (((A)+10)&31) -// convert reg index (10..31 0..1) or idx (0..24) +// convert reg index (10..31 0..1) to idx (0..24) #define EXTIDX(A) (((A)-10)&31) void add_next(dynarec_rv64_t *dyn, uintptr_t addr); |