diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-06-20 22:20:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-20 16:20:36 +0200 |
| commit | a945daf96dad09d7c7f72095435236b4c7768747 (patch) | |
| tree | 0ab4b57151b3fb60cdd595242be69340a9462e09 /src | |
| parent | 22116dabc3f7d0f67a56ea216359930c83ca673a (diff) | |
| download | box64-a945daf96dad09d7c7f72095435236b4c7768747.tar.gz box64-a945daf96dad09d7c7f72095435236b4c7768747.zip | |
[RV64_DYNAREC] Added unaligned support for F0 /5 LOCK SUB opcode (#1607)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index 06c0276d..190ce101 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -658,6 +658,9 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(opcode==0x81) i64 = F32S; else i64 = F8S; if (i64 <= -2048 || i64 > 2048) MOV64xw(x9, i64); + ANDI(x1, wback, (1 << (rex.w + 2)) - 1); + BNEZ_MARK3(x1); + // Aligned MARKLOCK; LRxw(x1, wback, 1, 1); if (i64 > -2048 && i64 <= 2048) { @@ -667,8 +670,25 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } SCxw(x3, x4, wback, 1, 1); BNEZ_MARKLOCK(x3); - IFX(X_ALL|X_PEND) + B_MARK_nocond; + MARK3; + // Unaligned + ANDI(x5, wback, -(1 << (rex.w + 2))); + MARK2; // Use MARK2 as a "MARKLOCK" since we're running out of marks. + LDxw(x6, wback, 0); + LRxw(x1, x5, 1, 1); + if (i64 > -2048 && i64 <= 2048) { + ADDIxw(x4, x6, -i64); + } else { + SUBxw(x4, x6, x9); + } + SCxw(x3, x1, x5, 1, 1); + BNEZ_MARK2(x3); + SDxw(x4, wback, 0); + MARK; + IFX (X_ALL | X_PEND) emit_sub32c(dyn, ninst, rex, x1, i64, x3, x4, x5, x6); + SMDMB(); } break; case 6: // XOR |