about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-08-29 05:06:29 +0800
committerGitHub <noreply@github.com>2024-08-28 23:06:29 +0200
commit0450371e282bd5c4dbbceaeca590626304609036 (patch)
treed2e139298b46342973d288960a58ad9cbdcaa45c /src
parentd9e5f8183f78c5f3035d3abf12e367cf05a1d4b5 (diff)
downloadbox64-0450371e282bd5c4dbbceaeca590626304609036.tar.gz
box64-0450371e282bd5c4dbbceaeca590626304609036.zip
[RV64_DYNAREC] Fixed a falsy optimization, better EMIT macro (#1769)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_jmpnext.c8
-rw-r--r--src/dynarec/la64/dynarec_la64_jmpnext.c8
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_2.c5
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c21
-rw-r--r--src/dynarec/rv64/dynarec_rv64_jmpnext.c8
5 files changed, 36 insertions, 14 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_jmpnext.c b/src/dynarec/arm64/dynarec_arm64_jmpnext.c
index c40dfb1e..aac633e6 100644
--- a/src/dynarec/arm64/dynarec_arm64_jmpnext.c
+++ b/src/dynarec/arm64/dynarec_arm64_jmpnext.c
@@ -2,10 +2,14 @@
 
 #include "arm64_emitter.h"
 
-#define EMIT(A) *block = (A); ++block
+#define EMIT(A)       \
+    do {              \
+        *block = (A); \
+        ++block;      \
+    } while (0)
 void CreateJmpNext(void* addr, void* next)
 {
     uint32_t* block = (uint32_t*)addr;
     LDRx_literal(x2, (intptr_t)next - (intptr_t)addr);
     BR(x2);
-}
\ No newline at end of file
+}
diff --git a/src/dynarec/la64/dynarec_la64_jmpnext.c b/src/dynarec/la64/dynarec_la64_jmpnext.c
index 793eb729..abb49ff9 100644
--- a/src/dynarec/la64/dynarec_la64_jmpnext.c
+++ b/src/dynarec/la64/dynarec_la64_jmpnext.c
@@ -2,7 +2,11 @@
 
 #include "la64_emitter.h"
 
-#define EMIT(A) *block = (A); ++block;
+#define EMIT(A)       \
+    do {              \
+        *block = (A); \
+        ++block;      \
+    } while (0)
 void CreateJmpNext(void* addr, void* next)
 {
     uint32_t* block = (uint32_t*)addr;
@@ -10,4 +14,4 @@ void CreateJmpNext(void* addr, void* next)
     PCADDU12I(x2, SPLIT20(diff));
     LD_D(x2, x2, SPLIT12(diff));
     BR(x2);
-}
\ No newline at end of file
+}
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c
index e4eb7aa4..7339963f 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_2.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_2.c
@@ -423,7 +423,10 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 DEFAULT;
             } else {     // mem <= reg
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 0, 0);
-                if (gd != ed) MV(gd, ed);
+                if (gd != ed) { MV(gd, ed); }
+                if (!rex.w || rex.is32bits) {
+                    ZEROUP(gd); // truncate the higher 32bits as asked
+                }
             }
             break;
         case 0x8E:
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index f46a8690..5b9a04eb 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -195,8 +195,9 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                         if((sib>>6)) {
                             SLLI(ret, xRAX + sib_reg, sib >> 6);
                             ADDW(ret, ret, scratch);
-                        } else
+                        } else {
                             ADDW(ret, xRAX+sib_reg, scratch);
+                        }
                         ZEROUP(ret);
                     } else {
                         if(sib>>6)
@@ -217,8 +218,9 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                     if((sib>>6)) {
                         SLLI(ret, xRAX + sib_reg, (sib >> 6));
                         ADDW(ret, ret, xRAX + sib_reg2);
-                    } else
+                    } else {
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
+                    }
                     ZEROUP(ret);
                 } else {
                     ret = xRAX+sib_reg2;
@@ -257,8 +259,9 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
                     if(sib>>6) {
                         SLLI(ret, xRAX + sib_reg, (sib >> 6));
                         ADDW(ret, ret, xRAX + sib_reg2);
-                    } else
+                    } else {
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
+                    }
                     ZEROUP(ret);
                 } else {
                     ret = xRAX+sib_reg2;
@@ -337,8 +340,9 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                         if((sib>>6)) {
                             SLLI(ret, xRAX + sib_reg, sib >> 6);
                             ADDW(ret, ret, scratch);
-                        } else
+                        } else {
                             ADDW(ret, xRAX+sib_reg, scratch);
+                        }
                         ZEROUP(ret);
                     } else {
                         if(sib>>6)
@@ -359,8 +363,9 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                     if((sib>>6)) {
                         SLLI(ret, xRAX + sib_reg, (sib >> 6));
                         ADDW(ret, ret, xRAX + sib_reg2);
-                    } else
+                    } else {
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
+                    }
                     ZEROUP(ret);
                 } else {
                     ret = xRAX+sib_reg2;
@@ -402,8 +407,9 @@ uintptr_t geted32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop
                     if(sib>>6) {
                         SLLI(ret, xRAX + sib_reg, (sib >> 6));
                         ADDW(ret, ret, xRAX + sib_reg2);
-                    } else
+                    } else {
                         ADDW(ret, xRAX+sib_reg2, xRAX+sib_reg);
+                    }
                     ZEROUP(ret);
                 } else {
                     ret = xRAX+sib_reg2;
@@ -2455,8 +2461,9 @@ void rv64_move32(dynarec_rv64_t* dyn, int ninst, int reg, int32_t val, int zerou
         src = reg;
     }
     if (lo12 || !hi20) ADDIW(reg, src, lo12);
-    if (zeroup && (val & 0x80000000))
+    if (zeroup && (val & 0x80000000)) {
         ZEROUP(reg);
+    }
 }
 
 void rv64_move64(dynarec_rv64_t* dyn, int ninst, int reg, int64_t val)
diff --git a/src/dynarec/rv64/dynarec_rv64_jmpnext.c b/src/dynarec/rv64/dynarec_rv64_jmpnext.c
index 9150dd44..4c6d42a9 100644
--- a/src/dynarec/rv64/dynarec_rv64_jmpnext.c
+++ b/src/dynarec/rv64/dynarec_rv64_jmpnext.c
@@ -2,7 +2,11 @@
 
 #include "rv64_emitter.h"
 
-#define EMIT(A) *block = (A); ++block
+#define EMIT(A)       \
+    do {              \
+        *block = (A); \
+        ++block;      \
+    } while (0)
 void CreateJmpNext(void* addr, void* next)
 {
     uint32_t* block = (uint32_t*)addr;
@@ -16,4 +20,4 @@ void CreateJmpNext(void* addr, void* next)
     LR_D(x2, x2, 1, 1);
     #endif
     BR(x2);
-}
\ No newline at end of file
+}