about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-28 15:40:47 +0800
committerGitHub <noreply@github.com>2025-04-28 09:40:47 +0200
commitebaea692046c8974679a66ace0701470d6bcb925 (patch)
treed39abd7b29f8277cb65d771190bba8e1c92a274e /src
parenta221d50c1712849f4435cb9937c58f51fa71066f (diff)
downloadbox64-ebaea692046c8974679a66ace0701470d6bcb925.tar.gz
box64-ebaea692046c8974679a66ace0701470d6bcb925.zip
[RV64_DYNAREC] Optimized rv64 printer for pseudo and jump instructions (#2581)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/rv64_printer.c62
1 files changed, 55 insertions, 7 deletions
diff --git a/src/dynarec/rv64/rv64_printer.c b/src/dynarec/rv64/rv64_printer.c
index f20d1026..3c922888 100644
--- a/src/dynarec/rv64/rv64_printer.c
+++ b/src/dynarec/rv64/rv64_printer.c
@@ -938,6 +938,46 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
     }
 
     /****************
+     * Hand-written pseudo instructions' printer
+     */
+
+    // NOP
+    if (opcode == 0x00000013) {
+        snprintf(buff, sizeof(buff), "%-15s", "NOP");
+        return buff;
+    }
+
+    // MV
+    if ((opcode & 0x0000007f) == 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]);
+        return buff;
+    }
+
+    // FMV.D
+    if ((opcode & 0xfe00707f) == 0x22000053) {
+        a.rd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        if (a.rs1 == a.rs2) {
+            snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.D", fpr[a.rd], fpr[a.rs1]);
+            return buff;
+        }
+    }
+
+    // FMV.S
+    if ((opcode & 0xfe00707f) == 0x20000053) {
+        a.rd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        if (a.rs1 == a.rs2) {
+            snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.S", fpr[a.rd], fpr[a.rs1]);
+            return buff;
+        }
+    }
+
+    /****************
      *  Generated by https://github.com/ksco/riscv-opcodes/tree/box64_printer
      *  Command: python parse.py -box64 rv_a rv_d rv_f rv_i rv_m rv_v rv_zba rv_zbb rv_zbc rv_zicsr rv_zbs rv64_a rv64_d rv64_f rv64_i rv64_m rv64_zba rv64_zbb rv64_zbs > code.c
      *  Please do NOT edit the following code manually.
@@ -1249,7 +1289,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 11, 8) << 1;
         a.imm = SIGN_EXTEND(a.imm, 13);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BEQ", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BEQ", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -1281,7 +1322,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 11, 8) << 1;
         a.imm = SIGN_EXTEND(a.imm, 13);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -1295,7 +1337,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 11, 8) << 1;
         a.imm = SIGN_EXTEND(a.imm, 13);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGEU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGEU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -1327,7 +1370,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 11, 8) << 1;
         a.imm = SIGN_EXTEND(a.imm, 13);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLT", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLT", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -1341,7 +1385,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 11, 8) << 1;
         a.imm = SIGN_EXTEND(a.imm, 13);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLTU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLTU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -1355,7 +1400,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 11, 8) << 1;
         a.imm = SIGN_EXTEND(a.imm, 13);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BNE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BNE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -2151,7 +2197,8 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         a.imm |= FX(opcode, 30, 21) << 1;
         a.imm = SIGN_EXTEND(a.imm, 21);
 
-        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "JAL", gpr[a.rd], SIGN_EXTEND(a.imm, 20), SIGN_EXTEND(a.imm, 20));
+        int len = snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "JAL", gpr[a.rd], a.imm, a.imm);
+        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
         return buff;
     }
 
@@ -6501,6 +6548,7 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr)
         return buff;
     }
 
+
     snprintf(buff, sizeof(buff), "%08X ???", __builtin_bswap32(opcode));
     return buff;
 }