diff options
| author | Yang Liu <numbksco@gmail.com> | 2023-05-15 13:07:10 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-15 07:07:10 +0200 |
| commit | 877d31fefb8a8d7afadd45ab5de9dc12decd8201 (patch) | |
| tree | 862e7b9ed64817be4e4aee488cb9dcb03b33a716 /src | |
| parent | 0d77c7f9a77f51e1283b794f9859b90fc183d1ba (diff) | |
| download | box64-877d31fefb8a8d7afadd45ab5de9dc12decd8201.tar.gz box64-877d31fefb8a8d7afadd45ab5de9dc12decd8201.zip | |
[RV64_DYNAREC] Use the new x9 scratch register (#784)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 8 |
2 files changed, 7 insertions, 13 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index 9ab951e4..96fe8288 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -191,9 +191,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1, x5); if(opcode==0x81) i64 = F32S; else i64 = F8S; - SD(x6, xEmu, offsetof(x64emu_t, scratch)); - emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5, x6); - LD(x6, xEmu, offsetof(x64emu_t, scratch)); + emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5, x9); WBACKO(x6); break; case 1: // OR @@ -223,9 +221,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETEDO(x6, (opcode==0x81)?4:1, x5); if(opcode==0x81) i64 = F32S; else i64 = F8S; MOV64xw(x5, i64); - SD(x6, xEmu, offsetof(x64emu_t, scratch)); - emit_sbb32(dyn, ninst, rex, ed, x5, x3, x4, x6); - LD(x6, xEmu, offsetof(x64emu_t, scratch)); + emit_sbb32(dyn, ninst, rex, ed, x5, x3, x4, x9); WBACKO(x6); break; case 4: // AND @@ -241,9 +237,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1, x5); if(opcode==0x81) i64 = F32S; else i64 = F8S; - SD(x6, xEmu, offsetof(x64emu_t, scratch)); - emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5, x6); - LD(x6, xEmu, offsetof(x64emu_t, scratch)); + emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5, x9); WBACKO(x6); break; case 6: // XOR diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index 617b8df1..9e184343 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -160,10 +160,10 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni gb1 = xRAX+(gd&3); } addr = geted(dyn, addr, ninst, nextop, &wback, x3, x2, &fixedaddress, rex, LOCK_LOCK, 0, 0); - MARKLOCK; - ANDI(x2, wback, ~0b11); // align to 32bit ANDI(x5, wback, 0b11); SLLI(x5, x5, 3); // shamt + MARKLOCK; + ANDI(x2, wback, ~0b11); // align to 32bit LWU(x1, x2, 0); LR_W(x4, x2, 1, 1); SRL(x4, x4, x5); @@ -184,8 +184,8 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SLL(x1, x1, x5); OR(x1, x1, x2); ANDI(x2, wback, ~0b11); // align to 32bit again - SC_W(x5, x1, x2, 1, 1); - BNEZ_MARKLOCK(x5); + SC_W(x9, x1, x2, 1, 1); + BNEZ_MARKLOCK(x9); // done MARK; UFLAG_IF {emit_cmp8(dyn, ninst, x6, x4, x1, x2, x3, x5);} |