diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp index 6e5cad760..e8a12f63b 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp @@ -74,7 +74,6 @@ DEF_OP(CAS) { Xbyak::Reg MemReg = GetSrc(Op->Header.Args[2].ID()); - mov(rdx, GetSrc(Op->Header.Args[1].ID())); mov(rax, GetSrc(Op->Header.Args[0].ID())); // RCX now contains pointer @@ -82,31 +81,31 @@ DEF_OP(CAS) { // RDX contains our desired lock(); - switch (OpSize) { case 1: { - cmpxchg(byte [MemReg], dl); - movzx(rax, al); + cmpxchg(byte [MemReg], GetSrc(Op->Header.Args[1].ID())); + movzx(GetDst(Node), al); break; } case 2: { - cmpxchg(word [MemReg], dx); - movzx(rax, ax); + cmpxchg(word [MemReg], GetSrc(Op->Header.Args[1].ID())); + movzx(GetDst(Node), ax); break; } case 4: { - cmpxchg(dword [MemReg], edx); + cmpxchg(dword [MemReg], GetSrc(Op->Header.Args[1].ID())); + // RAX now contains the result + mov (GetDst(Node), eax); break; } case 8: { - cmpxchg(qword [MemReg], rdx); + cmpxchg(qword [MemReg], GetSrc(Op->Header.Args[1].ID())); + // RAX now contains the result + mov (GetDst(Node), rax); break; } default: LogMan::Msg::A("Unsupported: %d", OpSize); } - - // RAX now contains the result - mov (GetDst(Node), rax); } DEF_OP(AtomicAdd) { @@ -228,17 +227,17 @@ DEF_OP(AtomicSwap) { switch (Op->Size) { case 1: - mov(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); + movzx(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); lock(); xchg(byte [MemReg], GetDst(Node)); break; case 2: - mov(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); + movzx(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); lock(); xchg(word [MemReg], GetDst(Node)); break; case 4: - mov(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); + mov(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); lock(); xchg(dword [MemReg], GetDst(Node)); break; @@ -257,13 +256,13 @@ DEF_OP(AtomicFetchAdd) { Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); switch (Op->Size) { case 1: - mov(cl, GetSrc(Op->Header.Args[1].ID())); + movzx(rcx, GetSrc(Op->Header.Args[1].ID())); lock(); xadd(byte [MemReg], cl); movzx(GetDst(Node), cl); break; case 2: - mov(cx, GetSrc(Op->Header.Args[1].ID())); + movzx(rcx, GetSrc(Op->Header.Args[1].ID())); lock(); xadd(word [MemReg], cx); movzx(GetDst(Node), cx); @@ -272,7 +271,7 @@ DEF_OP(AtomicFetchAdd) { mov(ecx, GetSrc(Op->Header.Args[1].ID())); lock(); xadd(dword [MemReg], ecx); - mov(GetDst(Node), ecx); + mov(GetDst(Node), ecx); break; case 8: mov(rcx, GetSrc(Op->Header.Args[1].ID()));