fix cmpxchg16b

This commit is contained in:
lizzie 2026-02-10 03:14:48 +00:00
parent 3842242c0a
commit eb306381c8
2 changed files with 12 additions and 12 deletions

View File

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

View File

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