about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-08-28 20:01:50 +0800
committerGitHub <noreply@github.com>2024-08-28 14:01:50 +0200
commit189222cb66c6770c0eab465bc2f15941248cb9bf (patch)
tree57825ec1b282c6c386d189ad8627cb5f6707a677 /src
parent6835c4aaf5d9f6b07652d4be9ccdbf9ba03aff8b (diff)
downloadbox64-189222cb66c6770c0eab465bc2f15941248cb9bf.tar.gz
box64-189222cb66c6770c0eab465bc2f15941248cb9bf.zip
[BOX32][RV64_DYNAREC] Added preliminary box32 support to RV64 (#1766)
* [BOX32][RV64_DYNAREC] Added preliminary box32 support to RV64

* fix

* fix fix

* fix
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_64.c24
-rw-r--r--src/dynarec/rv64/dynarec_rv64_6664.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_emit_math.c11
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c8
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h16
-rw-r--r--src/dynarec/rv64/rv64_emitter.h10
6 files changed, 38 insertions, 35 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c
index aef4f21c..c1ff69df 100644
--- a/src/dynarec/rv64/dynarec_rv64_64.c
+++ b/src/dynarec/rv64/dynarec_rv64_64.c
@@ -79,7 +79,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             GETEX(x2, 0, 8);
                             if(!MODREG) {
                                 grab_segdata(dyn, addr, ninst, x4, seg);
-                                ADD(x4, x4, wback);
+                                ADDz(x4, x4, wback);
                                 wback = x4;
                             }
                             LD(x3, gback, gdoffset+0);
@@ -101,7 +101,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             } else {
                                 grab_segdata(dyn, addr, ninst, x4, seg);
                                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0);
-                                ADD(x4, x4, ed);
+                                ADDz(x4, x4, ed);
                                 ed = x4;
                                 FSD(v0, ed, fixedaddress);
                                 SMWRITE2();
@@ -118,7 +118,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             } else {
                                 grab_segdata(dyn, addr, ninst, x4, seg);
                                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0);
-                                ADD(x4, x4, ed);
+                                ADDz(x4, x4, ed);
                                 ed = x4;
                                 FSW(v0, ed, fixedaddress);
                                 SMWRITE2();
@@ -373,7 +373,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 MVxw(xRAX+(nextop&7)+(rex.b<<3), gd);
             } else {                    // mem <= reg
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
-                ADD(x4, ed, x4);
+                ADDz(x4, ed, x4);
                 SDxw(gd, x4, fixedaddress);
                 SMWRITE2();
             }
@@ -389,7 +389,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             } else {       // mem <= reg
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
-                ADD(x4, ed, x4);
+                ADDz(x4, ed, x4);
                 LDxw(gd, x4, fixedaddress);
             }
             break;
@@ -403,7 +403,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             } else {
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 0, 0);
-                ADD(x4, wback, x4);
+                ADDz(x4, wback, x4);
                 LHU(x1, x4, 0);
                 ed = x1;
             }
@@ -420,12 +420,12 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 POP1z(x3); // so this can handle POP [ESP] and maybe some variant too
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 0, 0);
                 if (ed == xRSP) {
-                    ADD(x4, ed, x4);
+                    ADDz(x4, ed, x4);
                     SDz(x3, x4, 0);
                 } else {
                     // complicated to just allow a segfault that can be recovered correctly
                     ADDIz(xRSP, xRSP, rex.is32bits ? -4 : -8);
-                    ADD(x4, ed, x4);
+                    ADDz(x4, ed, x4);
                     SDz(x3, x4, 0);
                     ADDIz(xRSP, xRSP, rex.is32bits ? 4 : 8);
                 }
@@ -440,7 +440,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 u64 = F64;
             // TODO: could be optimized.
             MOV64z(x1, u64);
-            ADD(x1, x1, x4);
+            ADDz(x1, x1, x4);
             LDxw(xRAX, x1, 0);
             break;
 
@@ -453,7 +453,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 u64 = F64;
             // TODO: could be optimized.
             MOV64z(x1, u64);
-            ADD(x1, x1, x4);
+            ADDz(x1, x1, x4);
             SDxw(xRAX, x1, 0);
             SMWRITE2();
             break;
@@ -500,7 +500,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     ed = x3;
                 } else
                     ed = xZR;
-                ADD(x4, wback, x4);
+                ADDz(x4, wback, x4);
                 SB(ed, x4, fixedaddress);
                 SMWRITE2();
             }
@@ -521,7 +521,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     ed = x3;
                 } else
                     ed = xZR;
-                ADD(x4, wback, x4);
+                ADDz(x4, wback, x4);
                 SDxw(ed, x4, fixedaddress);
                 SMWRITE2();
             }
diff --git a/src/dynarec/rv64/dynarec_rv64_6664.c b/src/dynarec/rv64/dynarec_rv64_6664.c
index 3acac902..a1389aba 100644
--- a/src/dynarec/rv64/dynarec_rv64_6664.c
+++ b/src/dynarec/rv64/dynarec_rv64_6664.c
@@ -56,7 +56,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             } else {
                 grab_segdata(dyn, addr, ninst, x4, seg);
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
-                ADD(x4, ed, x4);
+                ADDz(x4, ed, x4);
                 if(rex.w) {
                     SD(gd, x4, fixedaddress);
                 } else {
@@ -86,7 +86,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 grab_segdata(dyn, addr, ninst, x4, seg);
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
-                ADD(x4, ed, x4);
+                ADDz(x4, ed, x4);
                 if(rex.w) {
                     LD(gd, x4, fixedaddress);
                 } else {
diff --git a/src/dynarec/rv64/dynarec_rv64_emit_math.c b/src/dynarec/rv64/dynarec_rv64_emit_math.c
index 6175f19d..e19acba0 100644
--- a/src/dynarec/rv64/dynarec_rv64_emit_math.c
+++ b/src/dynarec/rv64/dynarec_rv64_emit_math.c
@@ -105,14 +105,13 @@ void emit_add32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s
 void emit_add32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s2, int s3, int s4, int s5)
 {
     CLEAR_FLAGS();
-    if(s1==xRSP && (!dyn->insts || dyn->insts[ninst].x64.gen_flags==X_PEND))
-    {
+    if (s1 == xRSP && (!dyn->insts || dyn->insts[ninst].x64.gen_flags == X_PEND)) {
         // special case when doing math on ESP and only PEND is needed: ignoring it!
-        if(c >= -2048 && c < 2048) {
-            ADDIxw(s1, s1, c);
+        if (c >= -2048 && c < 2048) {
+            ADDI(s1, s1, c);
         } else {
-            MOV64xw(s2, c);
-            ADDxw(s1, s1, s2);
+            MOV64x(s2, c);
+            ADD(s1, s1, s2);
         }
         return;
     }
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index 4cc6e024..8c9f0adc 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -277,6 +277,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                 } else
                     scratch = xRAX+(nextop&0x07);
                 ADDIW(ret, scratch, i32);
+                ZEROUP(ret);
             } else {
                 MOV32w(scratch, i32);
                 if((nextop&7)==4) {
@@ -286,7 +287,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                             SLLI(ret, xRAX + sib_reg, (sib >> 6));
                             ADDW(ret, ret, scratch);
                         } else
-                            ADDW(ret, scratch, xRAX+sib_reg);
+                            ADDW(ret, scratch, xRAX + sib_reg);
                     } else {
                         PASS3(int tmp = xRAX+sib_reg2);
                         ADDW(ret, tmp, scratch);
@@ -295,6 +296,7 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                     PASS3(int tmp = xRAX+(nextop&0x07));
                     ADDW(ret, tmp, scratch);
                 }
+                ZEROUP(ret);
             }
         }
     }
@@ -415,6 +417,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                 } else
                     scratch = xRAX+(nextop&0x07)+(rex.b<<3);
                 ADDIW(ret, scratch, i64);
+                ZEROUP(ret);
             } else {
                 MOV32w(scratch, i64);
                 if((nextop&7)==4) {
@@ -424,7 +427,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                             SLLI(ret, xRAX + sib_reg, (sib >> 6));
                             ADDW(ret, ret, scratch);
                         } else
-                            ADDW(ret, scratch, xRAX+sib_reg);
+                            ADDW(ret, scratch, xRAX + sib_reg);
                     } else {
                         PASS3(int tmp = xRAX+sib_reg2);
                         ADDW(ret, tmp, scratch);
@@ -433,6 +436,7 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                     PASS3(int tmp = xRAX+(nextop&0x07)+(rex.b<<3));
                     ADDW(ret, tmp, scratch);
                 }
+                ZEROUP(ret);
             }
         }
     }
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index b2579454..cd3990a8 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -213,7 +213,7 @@
     } else {                                                                                   \
         SMREAD();                                                                              \
         addr = geted(dyn, addr, ninst, nextop, &wback, x2, S, &fixedaddress, rex, NULL, 1, D); \
-        ADD(S, wback, O);                                                                      \
+        ADDz(S, wback, O);                                                                     \
         LDxw(x1, S, fixedaddress);                                                             \
         ed = x1;                                                                               \
     }
@@ -225,15 +225,15 @@
     } else {                                                                                   \
         SMREAD();                                                                              \
         addr = geted(dyn, addr, ninst, nextop, &wback, x2, S, &fixedaddress, rex, NULL, 1, D); \
-        ADD(S, wback, O);                                                                      \
+        ADDz(S, wback, O);                                                                     \
         LDz(x1, S, fixedaddress);                                                              \
         ed = x1;                                                                               \
     }
-#define WBACKO(O)         \
-    if (wback) {          \
-        ADD(O, wback, O); \
-        SDxw(ed, O, 0);   \
-        SMWRITE2();       \
+#define WBACKO(O)          \
+    if (wback) {           \
+        ADDz(O, wback, O); \
+        SDxw(ed, O, 0);    \
+        SMWRITE2();        \
     }
 
 // FAKEED like GETED, but doesn't get anything
@@ -310,7 +310,7 @@
     } else {                                                                                    \
         SMREAD();                                                                               \
         addr = geted(dyn, addr, ninst, nextop, &wback, x3, x2, &fixedaddress, rex, NULL, 1, D); \
-        ADD(x3, wback, i);                                                                      \
+        ADDz(x3, wback, i);                                                                     \
         if (wback != x3) wback = x3;                                                            \
         LBU(i, wback, fixedaddress);                                                            \
         wb1 = 1;                                                                                \
diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h
index 2d1c6385..d4a95a31 100644
--- a/src/dynarec/rv64/rv64_emitter.h
+++ b/src/dynarec/rv64/rv64_emitter.h
@@ -357,12 +357,12 @@ f28–31  ft8–11  FP temporaries                  Caller
 #define PUSH1_32(reg)         \
     do {                      \
         SW(reg, xRSP, 0xFFC); \
-        SUBIW(xRSP, xRSP, 4); \
+        SUBI(xRSP, xRSP, 4);  \
     } while (0)
-#define POP1_32(reg)                           \
-    do {                                       \
-        LWU(reg, xRSP, 0);                     \
-        if (reg != xRSP) ADDIW(xRSP, xRSP, 4); \
+#define POP1_32(reg)                          \
+    do {                                      \
+        LWU(reg, xRSP, 0);                    \
+        if (reg != xRSP) ADDI(xRSP, xRSP, 4); \
     } while (0)
 
 #define POP1z(reg)      \