about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-25 22:23:02 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-25 22:23:02 +0000
commit56e161d1ff2c1aef1d4f54d030b5f07354d20554 (patch)
tree7f7ced5a7f82a602c5c2cd0ec3c7841b4ba66a62 /src
parent85da2b7e235a1d289ca957cbe926896ed882a094 (diff)
downloadbox64-56e161d1ff2c1aef1d4f54d030b5f07354d20554.tar.gz
box64-56e161d1ff2c1aef1d4f54d030b5f07354d20554.zip
[RV64_DYNAREC] Fixed CreateJumpNext function
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c10
-rw-r--r--src/dynarec/rv64/dynarec_rv64_jmpnext.c10
2 files changed, 13 insertions, 7 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index bcdf9cc7..140bac68 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -235,19 +235,19 @@ void jump_to_next(dynarec_rv64_t* dyn, uintptr_t ip, int reg, int ninst)
         SRLI(x2, xRIP, JMPTABL_START3);
         SLLI(x2, x2, 3);
         ADD(x3, x3, x2);
-        LD(x3, x3, 0);
+        LD(x3, x3, 0); // could be LR_D(x3, x3, 1, 1); for better safety
         MOV64x(x4, JMPTABLE_MASK2<<3);    // x4 = mask
         SRLI(x2, xRIP, JMPTABL_START2-3);
         AND(x2, x2, x4);
         ADD(x3, x3, x2);
-        LD(x3, x3, 0);
+        LD(x3, x3, 0); //LR_D(x3, x3, 1, 1);
         if(JMPTABLE_MASK2!=JMPTABLE_MASK1) {
             MOV64x(x4, JMPTABLE_MASK1<<3);    // x4 = mask
         }
         SRLI(x2, xRIP, JMPTABL_START1-3);
         AND(x2, x2, x4);
         ADD(x3, x3, x2);
-        LD(x3, x3, 0);
+        LD(x3, x3, 0); //LR_D(x3, x3, 1, 1);
         if(JMPTABLE_MASK0<2048) {
             ANDI(x2, xRIP, JMPTABLE_MASK0);
         } else {
@@ -258,13 +258,13 @@ void jump_to_next(dynarec_rv64_t* dyn, uintptr_t ip, int reg, int ninst)
         }
         SLLI(x2, x2, 3);
         ADD(x3, x3, x2);
-        LD(x2, x3, 0);
+        LD(x2, x3, 0); //LR_D(x2, x3, 1, 1);
     } else {
         uintptr_t p = getJumpTableAddress64(ip);
         MAYUSE(p);
         TABLE64(x3, p);
         GETIP_(ip);
-        LD(x2, x3, 0);
+        LD(x2, x3, 0); //LR_D(x2, x3, 1, 1);
     }
     if(reg!=A1) {
         MV(A1, xRIP);
diff --git a/src/dynarec/rv64/dynarec_rv64_jmpnext.c b/src/dynarec/rv64/dynarec_rv64_jmpnext.c
index 5f58183f..9150dd44 100644
--- a/src/dynarec/rv64/dynarec_rv64_jmpnext.c
+++ b/src/dynarec/rv64/dynarec_rv64_jmpnext.c
@@ -7,7 +7,13 @@ void CreateJmpNext(void* addr, void* next)
 {
     uint32_t* block = (uint32_t*)addr;
     uintptr_t diff = (intptr_t)next - (intptr_t)addr;
-    AUIPC(x2, diff>>12);
-    LD(x2, x2, diff&0b111111111111);
+    AUIPC(x2, SPLIT20(diff));
+    #if 1
+    LD(x2, x2, SPLIT12(diff));
+    #else
+    // Probably not usefull, but keeping the code, just in case
+    ADDI(x2, x2, SPLIT12(diff));
+    LR_D(x2, x2, 1, 1);
+    #endif
     BR(x2);
 }
\ No newline at end of file