void BX_CPP_AttrRegparmN(1) BX_CPU_C::NOT_EqM(bxInstruction_c *i) { Bit64u op1_64; BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_64 = read_RMW_virtual_qword_64(i->seg(), RMAddr(i)); op1_64 = ~op1_64; write_RMW_virtual_qword(op1_64); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EqIdM(bxInstruction_c *i) { Bit64u op1_64, op2_64 = (Bit32s) i->Id(); BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_64 = read_RMW_virtual_qword_64(i->seg(), RMAddr(i)); op1_64 &= op2_64; write_RMW_virtual_qword(op1_64); SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EqGqM(bxInstruction_c *i) { Bit64u op1_64, op2_64; BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_64 = read_RMW_virtual_qword_64(i->seg(), RMAddr(i)); op2_64 = BX_READ_64BIT_REG(i->nnn()); op1_64 ^= op2_64; write_RMW_virtual_qword(op1_64); SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::ENTER64_IwIb(bxInstruction_c *i) { Bit8u level = i->Ib2(); level &= 0x1F; Bit64u temp_RSP = RSP, temp_RBP = RBP; temp_RSP -= 8; write_virtual_qword_64(BX_SEG_REG_SS, temp_RSP, temp_RBP); Bit64u frame_ptr64 = temp_RSP; if (level > 0) { /* do level-1 times */ while (--level) { temp_RBP -= 8; Bit64u temp64 = read_virtual_qword_64(BX_SEG_REG_SS, temp_RBP); temp_RSP -= 8; write_virtual_qword_64(BX_SEG_REG_SS, temp_RSP, temp64); } /* while (--level) */ /* push(frame pointer) */ temp_RSP -= 8; write_virtual_qword_64(BX_SEG_REG_SS, temp_RSP, frame_ptr64); } /* if (level > 0) ... */ temp_RSP -= i->Iw(); // ENTER finishes with memory write check on the final stack pointer // the memory is touched but no write actually occurs // emulate it by doing RMW read access from SS:RSP read_RMW_virtual_qword_64(BX_SEG_REG_SS, temp_RSP); RBP = frame_ptr64; RSP = temp_RSP; BX_NEXT_INSTR(i); }