about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-04-01 11:59:32 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-04-01 11:59:32 +0000
commita847f46edcde2bb1da714284506025de1542f2ec (patch)
tree1c16081b53a6c2b48eeda4f952c4e879363eb327 /src
parente710bbcec894882af9a6b4091f90120b8002c0d3 (diff)
downloadbox64-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.c12
-rw-r--r--src/dynarec/rv64/rv64_printer.c2
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