about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-20 09:44:57 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-20 09:44:57 +0000
commit77f8bea61510eb5e3906042c6567ca6bb192893e (patch)
treeac76360314ce7f1ca6272834a91c518777c06ba7
parentbb49bc7844a760c22ab2d2bd3538cf54c811748d (diff)
downloadbox64-77f8bea61510eb5e3906042c6567ca6bb192893e.tar.gz
box64-77f8bea61510eb5e3906042c6567ca6bb192893e.zip
[RV64_DYNAREC] Preparing float/double handling
-rw-r--r--src/dynarec/rv64/rv64_epilog.S38
-rw-r--r--src/dynarec/rv64/rv64_prolog.S15
2 files changed, 25 insertions, 28 deletions
diff --git a/src/dynarec/rv64/rv64_epilog.S b/src/dynarec/rv64/rv64_epilog.S
index 9b97c232..6a299d9d 100644
--- a/src/dynarec/rv64/rv64_epilog.S
+++ b/src/dynarec/rv64/rv64_epilog.S
@@ -7,6 +7,8 @@
 .align 4
 
 .global rv64_epilog
+.global rv64_epilog_fast
+
 rv64_epilog:
     //update register -> emu
     sd      x16, (a0)
@@ -33,27 +35,7 @@ rv64_epilog:
     or      x8, x8, x5
     sd      x8, 128(a0)     //xFlags
     sd      x7, 136(a0)     // put back reg value in emu, including EIP (so x7 must be EIP now)
-    //restore all used register
-    ld      ra, (sp)  // save ra
-    ld      x8, 8(sp) // save fp
-    ld      x18, 16(sp)
-    ld      x19, 24(sp)
-    ld      x20, 32(sp)
-    ld      x21, 40(sp)
-    ld      x22, 48(sp)
-    ld      x23, 56(sp)
-    ld      x24, 64(sp)
-    ld      x25, 72(sp)
-    ld      x26, 80(sp)
-    ld      x27, 88(sp)
-    fsd     f8, 96(sp)
-    fsd     f9, 104(sp)
-    addi    sp,  sp, (8 * 14)
-    //end, return...
-    ret
-
-
-.global rv64_epilog_fast
+    // fallback to epilog_fast now, just restoring saved regs
 rv64_epilog_fast:
     ld      ra, (sp)  // save ra
     ld      x8, 8(sp) // save fp
@@ -67,8 +49,16 @@ rv64_epilog_fast:
     ld      x25, 72(sp)
     ld      x26, 80(sp)
     ld      x27, 88(sp)
-    fsd     f8, 96(sp)
-    fsd     f9, 104(sp)
-    addi    sp,  sp, (8 * 14)
+    fld     f18, (12*8)(sp)
+    fld     f19, (13*8)(sp)
+    fld     f20, (14*8)(sp)
+    fld     f21, (15*8)(sp)
+    fld     f22, (16*8)(sp)
+    fld     f23, (17*8)(sp)
+    fld     f24, (18*8)(sp)
+    fld     f25, (19*8)(sp)
+    fld     f26, (20*8)(sp)
+    fld     f27, (21*8)(sp)
+    addi    sp,  sp, (8 * 22)
     //end, return...
     ret
diff --git a/src/dynarec/rv64/rv64_prolog.S b/src/dynarec/rv64/rv64_prolog.S
index 06d275b7..0817bdc1 100644
--- a/src/dynarec/rv64/rv64_prolog.S
+++ b/src/dynarec/rv64/rv64_prolog.S
@@ -11,7 +11,7 @@
 .global rv64_prolog
 rv64_prolog:
     //save all 18 used register
-    addi    sp,  sp, -(8 * 14)
+    addi    sp,  sp, -(8 * 22)
     sd      ra, (sp)  // save ra
     sd      x8, 8(sp) // save fp
     sd      x18, 16(sp)
@@ -24,9 +24,16 @@ rv64_prolog:
     sd      x25, 72(sp)
     sd      x26, 80(sp)
     sd      x27, 88(sp)
-    fsd     f8, 96(sp)
-    fsd     f9, 104(sp)
-    // save f18-f27 too probably
+    fsd     f18, (12*8)(sp)
+    fsd     f19, (13*8)(sp)
+    fsd     f20, (14*8)(sp)
+    fsd     f21, (15*8)(sp)
+    fsd     f22, (16*8)(sp)
+    fsd     f23, (17*8)(sp)
+    fsd     f24, (18*8)(sp)
+    fsd     f25, (19*8)(sp)
+    fsd     f26, (20*8)(sp)
+    fsd     f27, (21*8)(sp)
     //setup emu -> register
     ld      x16, (a0)
     ld      x17, 8(a0)