diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-28 15:40:47 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-28 09:40:47 +0200 |
| commit | ebaea692046c8974679a66ace0701470d6bcb925 (patch) | |
| tree | d39abd7b29f8277cb65d771190bba8e1c92a274e /src | |
| parent | a221d50c1712849f4435cb9937c58f51fa71066f (diff) | |
| download | box64-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.c | 62 |
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; } |