Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}
Exemple #4
0
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();
}
Exemple #5
0
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;
}
Exemple #6
0
Fichier : bit.cpp Projet : iver6/BA
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);
}
Exemple #7
0
Fichier : bit.cpp Projet : iver6/BA
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);
}
Exemple #8
0
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);
}
Exemple #9
0
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);
}
Exemple #10
0
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);
}
Exemple #11
0
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;
        }
    }
Exemple #12
0
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);
}
Exemple #13
0
BX_CPU_C::BxResolve64BaseIndex(bxInstruction_c *i)
{
  return BX_READ_64BIT_REG(i->sibBase()) + (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()) + i->displ32s();
}
Exemple #14
0
BX_CPU_C::BxResolve64Base(bxInstruction_c *i)
{
  return BX_READ_64BIT_REG(i->sibBase()) + i->displ32s();
}
Exemple #15
0
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);
}
Exemple #16
0
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);
}