From a847f46edcde2bb1da714284506025de1542f2ec Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 1 Apr 2023 11:59:32 +0000 Subject: [RV64_DYNAREC] Fixed F0 83 opcode (LR/SC are tricky to use on RV64) --- src/dynarec/rv64/dynarec_rv64_f0.c | 12 +++++++++--- src/dynarec/rv64/rv64_printer.c | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index 77fdc60b..a14b4b18 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -156,11 +156,17 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(opcode==0x81) i64 = F32S; else i64 = F8S; MARKLOCK; LRxw(x1, wback, 1, 1); - emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5, x6); - SCxw(x3, x1, wback, 1, 1); + if(i64>-2048 && i64<2047) + ADDI(x4, x1, i64); + else { + MOV64xw(x4, i64); + ADD(x4, x1, x4); + } + SCxw(x3, x4, wback, 1, 1); BNEZ_MARKLOCK(x3); + IFX(X_ALL|X_PEND) + emit_add32c(dyn, ninst, rex, x1, i64, x3, x4, x5, x6); } - SMDMB(); break; default: DEFAULT; diff --git a/src/dynarec/rv64/rv64_printer.c b/src/dynarec/rv64/rv64_printer.c index 68c2832f..ed6167ba 100644 --- a/src/dynarec/rv64/rv64_printer.c +++ b/src/dynarec/rv64/rv64_printer.c @@ -427,7 +427,7 @@ static inline insn_t insn_ciwtype_read(uint16_t data) #define PRINT_fd_xs1() snprintf(buff, sizeof(buff), "%s\t%s, %s", insn.name, fpnames[insn.rd], gpnames[insn.rs1]); return buff #define PRINT_rd_fs1_fs2() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s", insn.name, gpnames[insn.rd], RN(rs1), RN(rs2)); return buff #define PRINT_rd_rs1_aqrl() snprintf(buff, sizeof(buff), "%s%s%s\t%s, (%s)", insn.name, aq?".aq":"", rl?".rl":"", gpnames[insn.rd], gpnames[insn.rs1]); return buff -#define PRINT_rd_rs1_rs2_aqrl() snprintf(buff, sizeof(buff), "%s%s%s\t%s, %s, (%s)", insn.name, aq?".aq":"", rl?".rl":"", gpnames[insn.rd], gpnames[insn.rs1], gpnames[insn.rs2]); return buff +#define PRINT_rd_rs1_rs2_aqrl() snprintf(buff, sizeof(buff), "%s%s%s\t%s, %s, (%s)", insn.name, aq?".aq":"", rl?".rl":"", gpnames[insn.rd], gpnames[insn.rs2], gpnames[insn.rs1]); return buff // TODO: display csr name #define PRINT_rd_csr_rs1() snprintf(buff, sizeof(buff), "%s\t%s, %d, %s", insn.name, RN(rd), insn.csr, RN(rs1)); return buff -- cgit 1.4.1