From 877d31fefb8a8d7afadd45ab5de9dc12decd8201 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Mon, 15 May 2023 13:07:10 +0800 Subject: [RV64_DYNAREC] Use the new x9 scratch register (#784) --- src/dynarec/rv64/dynarec_rv64_64.c | 12 +++--------- src/dynarec/rv64/dynarec_rv64_f0.c | 8 ++++---- 2 files changed, 7 insertions(+), 13 deletions(-) (limited to 'src') 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);} -- cgit 1.4.1