diff --git a/src/xenia/cpu/backend/a64/a64_seq_memory.cc b/src/xenia/cpu/backend/a64/a64_seq_memory.cc index e12bb9fd7..46003ab7c 100644 --- a/src/xenia/cpu/backend/a64/a64_seq_memory.cc +++ b/src/xenia/cpu/backend/a64/a64_seq_memory.cc @@ -115,57 +115,63 @@ XReg ComputeMemoryAddress(A64Emitter& e, const T& guest, // ============================================================================ // Note that the address we use here is a real, host address! // This is weird, and should be fixed. -template -void EmitAtomicExchangeXX(A64Emitter& e, const ARGS& i) { +template +void EmitAtomicExchangeXX(A64Emitter& e, const ARGS& i, const FN& fn) { if (i.dest == i.src1) { - // e.mov(e.rax, i.src1); + e.MOV(X0, i.src1); if (i.dest != i.src2) { if (i.src2.is_constant) { - // e.mov(i.dest, i.src2.constant()); + e.MOV(i.dest, i.src2.constant()); } else { - // e.mov(i.dest, i.src2); + e.MOV(i.dest, i.src2); } } - // e.lock(); - // e.xchg(e.dword[e.rax], i.dest); + fn(e, i.dest, X0); } else { if (i.dest != i.src2) { if (i.src2.is_constant) { - // e.mov(i.dest, i.src2.constant()); + e.MOV(i.dest, i.src2.constant()); } else { - // e.mov(i.dest, i.src2); + e.MOV(i.dest, i.src2); } } - // e.lock(); - // e.xchg(e.dword[i.src1.reg()], i.dest); + fn(e, i.dest, i.src1); } } struct ATOMIC_EXCHANGE_I8 : Sequence> { static void Emit(A64Emitter& e, const EmitArgType& i) { - EmitAtomicExchangeXX(e, i); + EmitAtomicExchangeXX( + e, i, + [](A64Emitter& e, WReg dest, XReg src) { e.SWPALB(dest, dest, src); }); } }; struct ATOMIC_EXCHANGE_I16 : Sequence> { static void Emit(A64Emitter& e, const EmitArgType& i) { - EmitAtomicExchangeXX(e, i); + EmitAtomicExchangeXX( + e, i, + [](A64Emitter& e, WReg dest, XReg src) { e.SWPALH(dest, dest, src); }); } }; struct ATOMIC_EXCHANGE_I32 : Sequence> { static void Emit(A64Emitter& e, const EmitArgType& i) { - EmitAtomicExchangeXX(e, i); + EmitAtomicExchangeXX( + e, i, + [](A64Emitter& e, WReg dest, XReg src) { e.SWPAL(dest, dest, src); }); } }; struct ATOMIC_EXCHANGE_I64 : Sequence> { static void Emit(A64Emitter& e, const EmitArgType& i) { - EmitAtomicExchangeXX(e, i); + EmitAtomicExchangeXX( + e, i, + [](A64Emitter& e, XReg dest, XReg src) { e.SWPAL(dest, dest, src); }); } }; EMITTER_OPCODE_TABLE(OPCODE_ATOMIC_EXCHANGE, ATOMIC_EXCHANGE_I8,