about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-28 18:31:15 +0800
committerGitHub <noreply@github.com>2025-04-28 12:31:15 +0200
commit25de8bd35cb594944afeee3762bc1a11fa3eeebf (patch)
tree8b1d5b01b72c63e3a4f04149cd258b108da1858b
parent5c9dc159d2531cd04df2e79a843fa6c0fd44f52f (diff)
downloadbox64-25de8bd35cb594944afeee3762bc1a11fa3eeebf.tar.gz
box64-25de8bd35cb594944afeee3762bc1a11fa3eeebf.zip
[RV64_DYNAREC] Small optimization to LEA opcode (#2582)
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_2.c7
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c8
-rw-r--r--src/dynarec/rv64/rv64_printer.c2
3 files changed, 9 insertions, 8 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c
index 71a93184..f8103fa3 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_2.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_2.c
@@ -486,9 +486,10 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             if (MODREG) { // reg <= reg? that's an invalid operation
                 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 (!rex.w || rex.is32bits) {
+                addr = geted(dyn, addr, ninst, nextop, &ed, gd, x1, &fixedaddress, rex, NULL, 0, 0);
+                if (gd != ed) {
+                    MVxw(gd, ed);
+                } else if (!rex.w && !rex.is32bits) {
                     ZEROUP(gd); // truncate the higher 32bits as asked
                 }
             }
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index 361844bb..f436ea18 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -223,8 +223,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
             } else {
                 if (sib_reg != 4) {
                     if ((sib >> 6)) {
-                        SLLI(ret, TO_NAT(sib_reg), (sib >> 6));
-                        ADDW(ret, ret, TO_NAT(sib_reg2));
+                        SLLI(scratch, TO_NAT(sib_reg), (sib >> 6));
+                        ADDW(ret, scratch, TO_NAT(sib_reg2));
                     } else {
                         ADDW(ret, TO_NAT(sib_reg2), TO_NAT(sib_reg));
                     }
@@ -266,8 +266,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_
             if ((nextop & 7) == 4) {
                 if (sib_reg != 4) {
                     if (sib >> 6) {
-                        SLLI(ret, TO_NAT(sib_reg), (sib >> 6));
-                        ADDW(ret, ret, TO_NAT(sib_reg2));
+                        SLLI(scratch, TO_NAT(sib_reg), (sib >> 6));
+                        ADDW(ret, scratch, TO_NAT(sib_reg2));
                     } else {
                         ADDW(ret, TO_NAT(sib_reg2), TO_NAT(sib_reg));
                     }
diff --git a/src/dynarec/rv64/rv64_printer.c b/src/dynarec/rv64/rv64_printer.c
index 3c922888..69722783 100644
--- a/src/dynarec/rv64/rv64_printer.c
+++ b/src/dynarec/rv64/rv64_printer.c
@@ -948,7 +948,7 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
     }
 
     // MV
-    if ((opcode & 0x0000007f) == 0x00000013) {
+    if ((opcode & 0xfff0707f) == 0x00000013) {
         a.rd = FX(opcode, 11, 7);
         a.rs1 = FX(opcode, 19, 15);
         snprintf(buff, sizeof(buff), "%-15s %s, %s", "MV", gpr[a.rd], gpr[a.rs1]);