about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-09-12 08:54:18 +0000
committerYang Liu <liuyang22@iscas.ac.cn>2023-09-12 08:54:18 +0000
commitc086a1ff24341625dca76aa33b04a7eff62d791b (patch)
treeeca087eed307c691139f3ff01f9e69d640e18395 /src
parent75958f1f315f15206618185240bab8080c8bfd0f (diff)
downloadbox64-c086a1ff24341625dca76aa33b04a7eff62d791b.tar.gz
box64-c086a1ff24341625dca76aa33b04a7eff62d791b.zip
Fixed CI and simplified
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f.c8
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c30
-rw-r--r--src/dynarec/rv64/rv64_emitter.h20
3 files changed, 20 insertions, 38 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c
index b0f4a3c4..8e85cc8e 100644
--- a/src/dynarec/rv64/dynarec_rv64_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_0f.c
@@ -1097,7 +1097,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, NULL, 1, 0);
                 SRAIxw(x1, gd, 5+rex.w); // r1 = (gd>>5)
-                ADDSL(x3, wback, x1, 2+rex.w);
+                ADDSL(x3, wback, x1, 2+rex.w, x1);
                 LDxw(x1, x3, fixedaddress);
                 ed = x1;
             }
@@ -1130,7 +1130,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, NULL, 1, 0);
                 SRAI(x1, gd, 5+rex.w);
-                ADDSL(x3, wback, x1, 2+rex.w);
+                ADDSL(x3, wback, x1, 2+rex.w, x1);
                 LDxw(x1, x3, fixedaddress);
                 ed = x1;
                 wback = x3;
@@ -1277,7 +1277,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0);
                 SRAI(x1, gd, 5+rex.w);
-                ADDSL(x3, wback, x1, 2+rex.w);
+                ADDSL(x3, wback, x1, 2+rex.w, x1);
                 LDxw(x1, x3, fixedaddress);
                 ed = x1;
                 wback = x3;
@@ -1446,7 +1446,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, x1, &fixedaddress, rex, NULL, 1, 0);
                 SRAI(x1, gd, 5+rex.w);
-                ADDSL(x3, wback, x1, 2+rex.w);
+                ADDSL(x3, wback, x1, 2+rex.w, x1);
                 LDxw(x1, x3, fixedaddress);
                 ed = x1;
                 wback = x3;
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index bb9d518e..1b89b08b 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -56,11 +56,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop,
                 if (sib_reg!=4) {
                     if(tmp && ((tmp<-2048) || (tmp>maxval) || !i12)) {
                         MOV64x(scratch, tmp);
-                        if((sib>>6)) {
-                            ADDSL(ret, scratch, xRAX+sib_reg, sib>>6);
-                        } else {
-                            ADD(ret, xRAX+sib_reg, scratch);
-                        }
+                        ADDSL(ret, scratch, xRAX+sib_reg, sib>>6, ret);
                     } else {
                         if(sib>>6) {
                             SLLI(ret, xRAX+sib_reg, (sib>>6));
@@ -77,11 +73,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop,
                 }
             } else {
                 if (sib_reg!=4) {
-                    if(sib>>6) {
-                        ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6);
-                    } else {
-                        ADD(ret, xRAX+sib_reg2, xRAX+sib_reg);
-                    }
+                    ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6, scratch);
                 } else {
                     ret = xRAX+sib_reg2;
                 }
@@ -136,11 +128,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop,
             *fixaddress = i64;
             if((nextop&7)==4) {
                 if (sib_reg!=4) {
-                    if(sib>>6) {
-                        ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6);
-                    } else {
-                        ADD(ret, xRAX+sib_reg2, xRAX+sib_reg);
-                    }
+                    ADDSL(ret, xRAX+sib_reg2, xRAX+sib_reg, sib>>6, scratch);
                 } else {
                     ret = xRAX+sib_reg2;
                 }
@@ -150,11 +138,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop,
             if(i64>=-2048 && i64<=2047) {
                 if((nextop&7)==4) {
                     if (sib_reg!=4) {
-                        if(sib>>6) {
-                            ADDSL(scratch, xRAX+sib_reg2, xRAX+sib_reg, sib>>6);
-                        } else {
-                            ADD(scratch, xRAX+sib_reg2, xRAX+sib_reg);
-                        }
+                        ADDSL(scratch, xRAX+sib_reg2, xRAX+sib_reg, sib>>6, scratch);
                     } else {
                         scratch = xRAX+sib_reg2;
                     }
@@ -166,11 +150,7 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop,
                 if((nextop&7)==4) {
                     if (sib_reg!=4) {
                         ADD(scratch, scratch, xRAX+sib_reg2);
-                        if(sib>>6) {
-                            ADDSL(ret, scratch, xRAX+sib_reg, sib>>6);
-                        } else {
-                            ADD(ret, scratch, xRAX+sib_reg);
-                        }
+                        ADDSL(ret, scratch, xRAX+sib_reg, sib>>6, ret);
                     } else {
                         PASS3(int tmp = xRAX+sib_reg2);
                         ADD(ret, tmp, scratch);
diff --git a/src/dynarec/rv64/rv64_emitter.h b/src/dynarec/rv64/rv64_emitter.h
index 2719a900..23f4f73d 100644
--- a/src/dynarec/rv64/rv64_emitter.h
+++ b/src/dynarec/rv64/rv64_emitter.h
@@ -310,15 +310,17 @@ f28–31  ft8–11  FP temporaries                  Caller
 // rd = rs1 + imm12
 #define ADDIz(rd, rs1, imm12)       EMIT(I_type((imm12)&0b111111111111, rs1, 0b000, rd, rex.is32bits?0b0011011:0b0010011))
 
-// rd = rs1 + (rs2 << imm2), rs2 might be used as scratch.
-#define ADDSL(rd, rs1, rs2, imm2) if (rv64_zba) {   \
-        SHxADD(rd, rs2, imm2, rs1);                 \
-    } else if (rv64_xtheadba) {                     \
-        TH_ADDSL(rd, rs1, rs2, imm2);               \
-    } else {                                        \
-        SLLI(rs2, rs2, imm2);                       \
-        ADD(rd, rs1, rs2);                          \
-    }                                               \
+// rd = rs1 + (rs2 << imm2)
+#define ADDSL(rd, rs1, rs2, imm2, scratch) if (!imm2) { \
+        ADD(rd, rs1, rs2);              \
+    } else if (rv64_zba) {              \
+        SHxADD(rd, rs2, imm2, rs1);     \
+    } else if (rv64_xtheadba) {         \
+        TH_ADDSL(rd, rs1, rs2, imm2);   \
+    } else {                            \
+        SLLI(scratch, rs2, imm2);       \
+        ADD(rd, rs1, scratch);          \
+    }                                   \
 
 #define SEXT_W(rd, rs1)             ADDIW(rd, rs1, 0)