void BX_CPP_AttrRegparmN(1) BX_CPU_C::TEST_EqGqR(bxInstruction_c *i) { Bit64u op1_64, op2_64; op1_64 = BX_READ_64BIT_REG(i->rm()); op2_64 = BX_READ_64BIT_REG(i->nnn()); op1_64 &= op2_64; SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_GqEqR(bxInstruction_c *i) { Bit64u op1_64, op2_64; op1_64 = BX_READ_64BIT_REG(i->nnn()); op2_64 = BX_READ_64BIT_REG(i->rm()); op1_64 ^= op2_64; /* now write result back to destination */ BX_WRITE_64BIT_REG(i->nnn(), op1_64); SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
void BX_CPU_C::BSR_GqEq(bxInstruction_c *i) { /* for 64 bit operand size mode */ Bit64u op1_64, op2_64; /* op2_64 is a register or memory reference */ if (i->modC0()) { op2_64 = BX_READ_64BIT_REG(i->rm()); } else { /* pointer, segment address pair */ read_virtual_qword(i->seg(), RMAddr(i), &op2_64); } if (op2_64 == 0) { assert_ZF(); /* op1_64 undefined */ return; } op1_64 = 63; while ( (op2_64 & BX_CONST64(0x8000000000000000)) == 0 ) { op1_64--; op2_64 <<= 1; } SET_FLAGS_OSZAPC_RESULT_64(op1_64, BX_INSTR_BITSCAN64); /* now write result back to destination */ BX_WRITE_64BIT_REG(i->nnn(), op1_64); }
BX_CPU_C::Resolve64Mod1or2Base15(bxInstruction_c *i) { if (i->sibIndex() != 4) RMAddr(i) = R15 + (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()) + (Bit32s) i->displ32u(); else RMAddr(i) = R15 + (Bit32s) i->displ32u(); }
BX_CPU_C::Resolve64Mod0Base15(bxInstruction_c *i) { if (i->sibIndex() != 4) RMAddr(i) = R15 + (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()); else RMAddr(i) = R15; }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::BSWAP_RRX(bxInstruction_c *i) { Bit64u val64 = BX_READ_64BIT_REG(i->rm()); BX_WRITE_64BIT_REG(i->rm(), bx_bswap64(val64)); BX_NEXT_INSTR(i); }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOVBE_MqGq(bxInstruction_c *i) { Bit64u val64 = BX_READ_64BIT_REG(i->nnn()); bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); write_virtual_qword_64(i->seg(), eaddr, bx_bswap64(val64)); BX_NEXT_INSTR(i); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EqIdR(bxInstruction_c *i) { Bit64u op1_64, op2_64 = (Bit32s) i->Id(); op1_64 = BX_READ_64BIT_REG(i->rm()); op1_64 &= op2_64; BX_WRITE_64BIT_REG(i->rm(), op1_64); SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::TEST_EqGqM(bxInstruction_c *i) { Bit64u op1_64, op2_64; BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_64 = read_virtual_qword_64(i->seg(), RMAddr(i)); op2_64 = BX_READ_64BIT_REG(i->nnn()); op1_64 &= op2_64; SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_GqEqM(bxInstruction_c *i) { Bit64u op1_64, op2_64; BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_64 = BX_READ_64BIT_REG(i->nnn()); op2_64 = read_virtual_qword_64(i->seg(), RMAddr(i)); op1_64 ^= op2_64; /* now write result back to destination */ BX_WRITE_64BIT_REG(i->nnn(), op1_64); SET_FLAGS_OSZAPC_LOGIC_64(op1_64); }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::BEXTR_GqEqIdR(bxInstruction_c *i) { Bit16u control = (Bit16u) i->Id(); unsigned start = control & 0xff; unsigned len = control >> 8; Bit64u op1_64 = 0; if (start < 64 && len > 0) { op1_64 = BX_READ_64BIT_REG(i->rm()); op1_64 >>= start; if (len < 64) { Bit64u extract_mask = (BX_CONST64(1) << len) - 1; op1_64 &= extract_mask; } }
void BX_CPU_C::BSWAP_RRX(bxInstruction_c *i) { Bit64u val64, b0, b1, b2, b3, b4, b5, b6, b7; val64 = BX_READ_64BIT_REG(i->opcodeReg()); b0 = val64 & 0xff; val64 >>= 8; b1 = val64 & 0xff; val64 >>= 8; b2 = val64 & 0xff; val64 >>= 8; b3 = val64 & 0xff; val64 >>= 8; b4 = val64 & 0xff; val64 >>= 8; b5 = val64 & 0xff; val64 >>= 8; b6 = val64 & 0xff; val64 >>= 8; b7 = val64; val64 = (b0<<56) | (b1<<48) | (b2<<40) | (b3<<32) | (b4<<24) | (b4<<16) | (b4<<8) | b7; BX_WRITE_64BIT_REG(i->opcodeReg(), val64); }
BX_CPU_C::BxResolve64BaseIndex(bxInstruction_c *i) { return BX_READ_64BIT_REG(i->sibBase()) + (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()) + i->displ32s(); }
BX_CPU_C::BxResolve64Base(bxInstruction_c *i) { return BX_READ_64BIT_REG(i->sibBase()) + i->displ32s(); }
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH_RRX(bxInstruction_c *i) { push_64(BX_READ_64BIT_REG(i->rm())); BX_NEXT_INSTR(i); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::NOT_EqR(bxInstruction_c *i) { Bit64u op1_64 = BX_READ_64BIT_REG(i->rm()); op1_64 = ~op1_64; BX_WRITE_64BIT_REG(i->rm(), op1_64); }