about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-07-23 19:30:06 +0800
committerGitHub <noreply@github.com>2024-07-23 13:30:06 +0200
commit2989afdf849e9950e4a9f62fa24347bc70436709 (patch)
tree1069cea91a021effc06cc4e7d6a8001d5be90601 /src
parent9c1b015689e965fe117b13ee217345ea22c130ce (diff)
downloadbox64-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.c8
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_private.h2
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);