|
|
@ -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; |
|
|
} |
|
|
} |
|
|
|