Browse Source

fix cmpxchg16b

pull/3505/head
lizzie 4 weeks ago
parent
commit
eb306381c8
  1. 8
      src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc
  2. 16
      src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h

8
src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc

@ -473,19 +473,19 @@ void AxxEmitX64::EmitExclusiveWriteMemoryInline(AxxEmitContext& ctx, IR::Inst* i
break; break;
case 16: case 16:
code.lock(); code.lock();
code.cmpxchg(word[dest_ptr], value.cvt16());
code.cmpxchg(code.word[dest_ptr], value.cvt16());
break; break;
case 32: case 32:
code.lock(); code.lock();
code.cmpxchg(dword[dest_ptr], value.cvt32());
code.cmpxchg(code.dword[dest_ptr], value.cvt32());
break; break;
case 64: case 64:
code.lock(); code.lock();
code.cmpxchg(qword[dest_ptr], value.cvt64());
code.cmpxchg(code.qword[dest_ptr], value.cvt64());
break; break;
case 128: case 128:
code.lock(); code.lock();
code.cmpxchg16b(ptr[dest_ptr]);
code.cmpxchg16b(code.ptr[dest_ptr]); //#226 bug with xbyak
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();

16
src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h

@ -222,19 +222,19 @@ const void* EmitReadMemoryMov(BlockOfCode& code, int value_idx, const Xbyak::Reg
break; break;
case 16: case 16:
code.lock(); code.lock();
code.xadd(word[addr], Xbyak::Reg64(value_idx).cvt16());
code.xadd(code.word[addr], Xbyak::Reg64(value_idx).cvt16());
break; break;
case 32: case 32:
code.lock(); code.lock();
code.xadd(dword[addr], Xbyak::Reg64(value_idx).cvt32());
code.xadd(code.dword[addr], Xbyak::Reg64(value_idx).cvt32());
break; break;
case 64: case 64:
code.lock(); code.lock();
code.xadd(qword[addr], Xbyak::Reg64(value_idx));
code.xadd(code.qword[addr], Xbyak::Reg64(value_idx));
break; break;
case 128: case 128:
code.lock(); code.lock();
code.cmpxchg16b(xword[addr]);
code.cmpxchg16b(code.ptr[addr]); //#226 bug with xbyak
if (code.HasHostFeature(HostFeature::SSE41)) { if (code.HasHostFeature(HostFeature::SSE41)) {
code.movq(Xbyak::Xmm(value_idx), rax); code.movq(Xbyak::Xmm(value_idx), rax);
code.pinsrq(Xbyak::Xmm(value_idx), rdx, 1); code.pinsrq(Xbyak::Xmm(value_idx), rdx, 1);
@ -296,19 +296,19 @@ const void* EmitWriteMemoryMov(BlockOfCode& code, const Xbyak::RegExp& addr, int
code.xchg(code.byte[addr], Xbyak::Reg64(value_idx).cvt8()); code.xchg(code.byte[addr], Xbyak::Reg64(value_idx).cvt8());
break; break;
case 16: case 16:
code.xchg(word[addr], Xbyak::Reg64(value_idx).cvt16());
code.xchg(code.word[addr], Xbyak::Reg64(value_idx).cvt16());
break; break;
case 32: case 32:
code.xchg(dword[addr], Xbyak::Reg64(value_idx).cvt32());
code.xchg(code.dword[addr], Xbyak::Reg64(value_idx).cvt32());
break; break;
case 64: case 64:
code.xchg(qword[addr], Xbyak::Reg64(value_idx));
code.xchg(code.qword[addr], Xbyak::Reg64(value_idx));
break; break;
case 128: { case 128: {
Xbyak::Label loop; Xbyak::Label loop;
code.L(loop); code.L(loop);
code.lock(); code.lock();
code.cmpxchg16b(xword[addr]);
code.cmpxchg16b(code.ptr[addr]); //#226 bug with xbyak
code.jnz(loop, code.T_NEAR); code.jnz(loop, code.T_NEAR);
break; break;
} }

Loading…
Cancel
Save