From 932f2bbceb47b0a587f79b004b938b5d65465a1e Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Mon, 21 Aug 2023 04:50:02 +0200 Subject: [PATCH] ppcopcodes: fix stwcx. emulation. --- cpu/ppc/ppcopcodes.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cpu/ppc/ppcopcodes.cpp b/cpu/ppc/ppcopcodes.cpp index 07eeabf..6ddb505 100644 --- a/cpu/ppc/ppcopcodes.cpp +++ b/cpu/ppc/ppcopcodes.cpp @@ -1687,19 +1687,17 @@ void dppc_interpreter::ppc_stwcx() { #ifdef CPU_PROFILING num_int_stores++; #endif - // PLACEHOLDER CODE FOR STWCX - We need to check for reserve memory if (rc_flag == 0) { ppc_illegalop(); } else { ppc_grab_regssab(); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); + ppc_state.cr &= 0x0FFFFFFFUL; // clear CR0 + ppc_state.cr |= (ppc_state.spr[SPR::XER] & 0x80000000UL) >> 3; // copy XER[SO] to CR0[SO] if (ppc_state.reserve) { mmu_write_vmem(ppc_effective_address, ppc_result_d); - //mem_write_dword(ppc_effective_address, ppc_result_d); - ppc_state.cr |= (ppc_state.spr[SPR::XER] & 0x80000000) ? 0x30000000 : 0x20000000; ppc_state.reserve = false; - } else { - ppc_state.cr |= (ppc_state.spr[SPR::XER] & 0x80000000) ? 0x10000000 : 0; + ppc_state.cr |= 0x20000000UL; // set CR0[EQ] } } }