diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-01 11:59:32 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-01 11:59:32 +0000 |
| commit | a847f46edcde2bb1da714284506025de1542f2ec (patch) | |
| tree | 1c16081b53a6c2b48eeda4f952c4e879363eb327 /src | |
| parent | e710bbcec894882af9a6b4091f90120b8002c0d3 (diff) | |
| download | box64-a847f46edcde2bb1da714284506025de1542f2ec.tar.gz box64-a847f46edcde2bb1da714284506025de1542f2ec.zip | |
[RV64_DYNAREC] Fixed F0 83 opcode (LR/SC are tricky to use on RV64)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_printer.c | 2 |
2 files changed, 10 insertions, 4 deletions
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 |