diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-07-23 19:30:06 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-23 13:30:06 +0200 |
| commit | 2989afdf849e9950e4a9f62fa24347bc70436709 (patch) | |
| tree | 1069cea91a021effc06cc4e7d6a8001d5be90601 /src | |
| parent | 9c1b015689e965fe117b13ee217345ea22c130ce (diff) | |
| download | box64-2989afdf849e9950e4a9f62fa24347bc70436709.tar.gz box64-2989afdf849e9950e4a9f62fa24347bc70436709.zip | |
[RV64_DYNAREC] Fixed more issues in the vector infrastructure (#1706)
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); |