void bx_cpu_c::XOR_EdGd(BxInstruction_t *i) { /* for 32 bit operand size mode */ Bit32u op2_32, op1_32, result_32; /* op2_32 is a register, op2_addr is an index of a register */ op2_32 = BX_READ_32BIT_REG(i->nnn); /* op1_32 is a register or memory reference */ if (i->mod == 0xc0) { op1_32 = BX_READ_32BIT_REG(i->rm); } else { /* pointer, segment address pair */ read_RMW_virtual_dword(i->seg, i->rm_addr, &op1_32); } result_32 = op1_32 ^ op2_32; /* now write result back to destination */ if (i->mod == 0xc0) { BX_WRITE_32BIT_REG(i->rm, result_32); } else { write_RMW_virtual_dword(result_32); } SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_XOR32); }
void bx_cpu_c::AND_EdId(BxInstruction_t *i) { Bit32u op2_32, op1_32, result_32; op2_32 = i->Id; /* op1_32 is a register or memory reference */ if (i->mod == 0xc0) { op1_32 = BX_READ_32BIT_REG(i->rm); } else { /* pointer, segment address pair */ read_RMW_virtual_dword(i->seg, i->rm_addr, &op1_32); } result_32 = op1_32 & op2_32; /* now write result back to destination */ if (i->mod == 0xc0) { BX_WRITE_32BIT_REG(i->rm, result_32); } else { write_RMW_virtual_dword(result_32); } SET_FLAGS_OSZAPC_32(op1_32, op2_32, result_32, BX_INSTR_AND32); }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::NOT_EdM(bxInstruction_c *i) { bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); Bit32u op1_32 = read_RMW_virtual_dword(i->seg(), eaddr); op1_32 = ~op1_32; write_RMW_virtual_dword(op1_32); BX_NEXT_INSTR(i); }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::OR_EdIdM(bxInstruction_c *i) { Bit32u op1_32; bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_32 = read_RMW_virtual_dword(i->seg(), eaddr); op1_32 |= i->Id(); write_RMW_virtual_dword(op1_32); SET_FLAGS_OSZAPC_LOGIC_32(op1_32); BX_NEXT_INSTR(i); }
void BX_CPU_C::NOT_Ed(bxInstruction_c *i) { Bit32u op1_32, result_32; if (i->modC0()) { op1_32 = BX_READ_32BIT_REG(i->rm()); result_32 = ~op1_32; BX_WRITE_32BIT_REGZ(i->rm(), result_32); } else { read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32); result_32 = ~op1_32; write_RMW_virtual_dword(result_32); } }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EdGdM(bxInstruction_c *i) { Bit32u op1_32, op2_32; bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_32 = read_RMW_virtual_dword(i->seg(), eaddr); op2_32 = BX_READ_32BIT_REG(i->nnn()); op1_32 ^= op2_32; write_RMW_virtual_dword(op1_32); SET_FLAGS_OSZAPC_LOGIC_32(op1_32); BX_NEXT_INSTR(i); }
void BX_CPU_C::XOR_EdId(bxInstruction_c *i) { Bit32u op2_32, op1_32, result_32; op2_32 = i->Id(); if (i->modC0()) { op1_32 = BX_READ_32BIT_REG(i->rm()); result_32 = op1_32 ^ op2_32; BX_WRITE_32BIT_REGZ(i->rm(), result_32); } else { read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32); result_32 = op1_32 ^ op2_32; write_RMW_virtual_dword(result_32); } SET_FLAGS_OSZAPC_RESULT_32(result_32, BX_INSTR_LOGIC32); }
void BX_CPU_C::XCHG_EdGd(bxInstruction_c *i) { Bit32u op2_32, op1_32; op2_32 = BX_READ_32BIT_REG(i->nnn()); /* op1_32 is a register or memory reference */ if (i->modC0()) { op1_32 = BX_READ_32BIT_REG(i->rm()); BX_WRITE_32BIT_REGZ(i->rm(), op2_32); } else { /* pointer, segment address pair */ read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32); write_RMW_virtual_dword(op2_32); } BX_WRITE_32BIT_REGZ(i->nnn(), op1_32); }
void BX_CPU_C::AND_EdId(bxInstruction_c *i) { Bit32u op2_32, op1_32, result_32; op2_32 = i->Id(); if (i->modC0()) { op1_32 = BX_READ_32BIT_REG(i->rm()); #if defined(BX_HostAsm_And32) Bit32u flags32; asmAnd32(result_32, op1_32, op2_32, flags32); setEFlagsOSZAPC(flags32); #else result_32 = op1_32 & op2_32; #endif BX_WRITE_32BIT_REGZ(i->rm(), result_32); } else { read_RMW_virtual_dword(i->seg(), RMAddr(i), &op1_32); #if defined(BX_HostAsm_And32) Bit32u flags32; asmAnd32(result_32, op1_32, op2_32, flags32); setEFlagsOSZAPC(flags32); #else result_32 = op1_32 & op2_32; #endif write_RMW_virtual_dword(result_32); } #if !defined(BX_HostAsm_And32) SET_FLAGS_OSZAPC_RESULT_32(result_32, BX_INSTR_LOGIC32); #endif }
void bx_cpu_c::NOT_Ed(BxInstruction_t *i) { Bit32u op1_32, result_32; /* op1 is a register or memory reference */ if (i->mod == 0xc0) { op1_32 = BX_READ_32BIT_REG(i->rm); } else { /* pointer, segment address pair */ read_RMW_virtual_dword(i->seg, i->rm_addr, &op1_32); } result_32 = ~op1_32; /* now write result back to destination */ if (i->mod == 0xc0) { BX_WRITE_32BIT_REG(i->rm, result_32); } else { write_RMW_virtual_dword(result_32); } }