void mips_isa_SLTIU_impl(struct mips_ctx_t *ctx)
{
	if ((unsigned int)mips_gpr_get_value(ctx,RS) < (unsigned int)SEXT32(IMM,16))
		mips_gpr_set_value(ctx,RT, 1);
	else
		mips_gpr_set_value(ctx,RT, 0);
}
void mips_isa_SLTI_impl(struct mips_ctx_t *ctx)
{
	if ((int)(mips_gpr_get_value(ctx,RS)) < IMM)
		mips_gpr_set_value(ctx,RT, 1);
	else
		mips_gpr_set_value(ctx,RT, 0);
}
void mips_isa_LL_impl(struct mips_ctx_t *ctx)
{
	unsigned int temp;
	mem_read(ctx->mem, mips_gpr_get_value(ctx,RS) + IMM, sizeof(unsigned int), &temp);
	mips_gpr_set_value(ctx,RT, temp);
	// FIXME: add details from m2s-1.3/src/kernel/machine.def
}
void mips_isa_LHU_impl(struct mips_ctx_t *ctx)
{
	unsigned short int temp;
	unsigned int addr = mips_gpr_get_value(ctx,RS) + IMM;
	mem_read(ctx->mem, addr, sizeof(unsigned short int), &temp);
	mips_gpr_set_value(ctx,RT, temp);
}
void mips_isa_LB_impl(struct mips_ctx_t *ctx)
{
	unsigned char temp;
	unsigned int addr = mips_gpr_get_value(ctx,RS) + SEXT32(IMM,16);
	mem_read(ctx->mem, addr, sizeof(unsigned char), &temp);
	mips_gpr_set_value(ctx,RT, SEXT32(temp, 8));
}
Beispiel #6
0
void mips_isa_SC_impl(struct mips_ctx_t *ctx) {
  unsigned int temp = mips_gpr_get_value(ctx, RT);
  //	if()
  mem_write(ctx->mem, mips_gpr_get_value(ctx, RS) + IMM, 4, &temp);
  mips_gpr_set_value(ctx, RT, 1);
  // FIXME: revisit details in m2s-1.3/srs/kernel/machine.def
}
Beispiel #7
0
void mips_isa_LBU_impl(struct mips_ctx_t *ctx) {
  unsigned char temp;
  unsigned int addr = mips_gpr_get_value(ctx, RS) + SEXT32(IMM, 16);
  mem_read(ctx->mem, addr, sizeof(unsigned char), &temp);
  mips_gpr_set_value(ctx, RT, (unsigned)temp);
  mips_isa_inst_debug(" r%d=0x%x", RT, mips_gpr_get_value(ctx, RT));
}
Beispiel #8
0
void mips_isa_ADDI_impl(struct mips_ctx_t *ctx)
{
    int temp;
    temp = (int)mips_gpr_get_value(ctx,RS) + (int)(OFFSET);
    mips_gpr_set_value(ctx,RT, temp);
    mips_isa_inst_debug("  r%d -> 0x%x", RT, temp);
}
Beispiel #9
0
void mips_isa_JAL_impl(struct mips_ctx_t *ctx) {
  unsigned int reg_no = 31;
  unsigned int value = ctx->regs->pc + 8;
  unsigned int dest = (BITS32(ctx->regs->pc + 4, 31, 28) << 28) | (TARGET << 2);
  //	mips_gpr_set_value(ctx,31, ctx->regs->pc + 8);
  mips_gpr_set_value(ctx, reg_no, value);
  mips_isa_branch(ctx, dest);
}
void mips_isa_LW_impl(struct mips_ctx_t *ctx)
{
	unsigned int temp;
	unsigned int addr = mips_gpr_get_value(ctx,RS) + SEXT32((signed)IMM,16);
	if ((BITS32(addr, 1, 0) | 0) == 1 )
		fatal("LW: address error, effective address must be naturallty-aligned\n");
	mem_read(ctx->mem, addr, 4, &temp);
	mips_gpr_set_value(ctx,RT, temp);
	mips_isa_inst_debug("  $0x%x=>tmp0, tmp0+r%d=>tmp0, tmp0=>r%d\n", SEXT32(IMM,16), RS, RT);
	mips_isa_inst_debug("  value loaded: %x", temp);
}
void mips_isa_ADDIU_impl(struct mips_ctx_t *ctx)
{
	mips_gpr_set_value(ctx,RT, mips_gpr_get_value(ctx,RS) + SEXT32((signed)IMM, 16));
	mips_isa_inst_debug("  r%d -> r%d+0x%x", RT, RS, SEXT32(IMM, 16));
}
void mips_isa_SLL_impl(struct mips_ctx_t *ctx)
{
	mips_gpr_set_value(ctx,RD, (mips_gpr_get_value(ctx,RT) << SA));
	mips_isa_inst_debug("  %x=%x<<%x", mips_gpr_get_value(ctx,RD), mips_gpr_get_value(ctx,RT), SA);
}
void mips_isa_LUI_impl(struct mips_ctx_t *ctx)
{
	mips_gpr_set_value(ctx,RT, (int)(IMM << 16));
	mips_isa_inst_debug("  r%d: $0x%x", RT, mips_gpr_get_value(ctx,RT));

}
void mips_isa_XORI_impl(struct mips_ctx_t *ctx)
{
	mips_gpr_set_value(ctx,RT, mips_gpr_get_value(ctx,RS) ^ (unsigned int) IMM);
}
void mips_isa_ORI_impl(struct mips_ctx_t *ctx)
{
	mips_gpr_set_value(ctx,RT, mips_gpr_get_value(ctx,RS) | ((unsigned int) (IMM) & ((1U << (16)) - 1)));
		     // (unsigned int) IMM);
	mips_isa_inst_debug(" r%d=0x%x", RT, mips_gpr_get_value(ctx,RT));
}