fixed MASKMOVDQU SSE instruction to match hardware

This commit is contained in:
Stanislav Shwartsman 2012-06-23 16:25:52 +00:00
parent 9189105a0b
commit 48ae41a2fd

View File

@ -630,8 +630,9 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MASKMOVDQU_VdqUdq(bxInstruction_c
BxPackedXmmRegister op = BX_READ_XMM_REG(i->nnn()),
mask = BX_READ_XMM_REG(i->rm()), temp;
/* implement as read-modify-write for efficiency */
read_virtual_dqword(i->seg(), rdi, (Bit8u *) &temp);
// check for write permissions before writing even if mask is all 0s
temp.xmm64u(0) = read_RMW_virtual_qword(i->seg(), rdi);
temp.xmm64u(1) = read_RMW_virtual_qword(i->seg(), (rdi + 8) & i->asize_mask());
/* no data will be written to memory if mask is all 0s */
if ((mask.xmm64u(0) | mask.xmm64u(1)) == 0) {
@ -642,8 +643,10 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MASKMOVDQU_VdqUdq(bxInstruction_c
if(mask.xmmubyte(j) & 0x80) temp.xmmubyte(j) = op.xmmubyte(j);
}
/* and write result back to the memory */
write_virtual_dqword(i->seg(), rdi, (Bit8u *) &temp);
// and write result back to the memory
write_RMW_virtual_qword(temp.xmm64u(1));
// write permissions already checked by read_RMW_virtual_qword_64
write_virtual_qword(i->seg(), rdi, temp.xmm64u(0));
#endif
BX_NEXT_INSTR(i);