fixed MASKMOVDQU SSE instruction to match hardware
This commit is contained in:
parent
9189105a0b
commit
48ae41a2fd
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user