static unsigned int dec10_setclrf(DisasContext *dc) { uint32_t flags; unsigned int set = ~dc->opcode & 1; flags = EXTRACT_FIELD(dc->ir, 0, 3) | (EXTRACT_FIELD(dc->ir, 12, 15) << 4); LOG_DIS("%s set=%d flags=%x\n", __func__, set, flags); if (flags & X_FLAG) { dc->flagx_known = 1; if (set) dc->flags_x = X_FLAG; else dc->flags_x = 0; } cris_evaluate_flags (dc); cris_update_cc_op(dc, CC_OP_FLAGS, 4); cris_update_cc_x(dc); tcg_gen_movi_tl(cc_op, dc->cc_op); if (set) { tcg_gen_ori_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], flags); } else { tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~(flags|F_FLAG_V10|P_FLAG_V10)); } dc->flags_uptodate = 1; dc->clear_x = 0; cris_lock_irq(dc); return 2; }
static void dec_orhi(DisasContext *dc) { if (dc->r0 == R_R0) { LOG_DIS("mvhi r%d, %d\n", dc->r1, dc->imm16); } else { LOG_DIS("orhi r%d, r%d, %d\n", dc->r1, dc->r0, dc->imm16); } tcg_gen_ori_tl(cpu_R[dc->r1], cpu_R[dc->r0], (dc->imm16 << 16)); }
/* Prefix flag and register are used to handle the more complex addressing modes. */ static void cris_set_prefix(DisasContext *dc) { dc->clear_prefix = 0; dc->tb_flags |= PFIX_FLAG; tcg_gen_ori_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], PFIX_FLAG); /* prefix insns dont clear the x flag. */ dc->clear_x = 0; cris_lock_irq(dc); }
static void dec_b(DisasContext *dc) { if (dc->r0 == R_RA) { LOG_DIS("ret\n"); } else if (dc->r0 == R_EA) { LOG_DIS("eret\n"); } else if (dc->r0 == R_BA) { LOG_DIS("bret\n"); } else { LOG_DIS("b r%d\n", dc->r0); } /* restore IE.IE in case of an eret */ if (dc->r0 == R_EA) { TCGv t0 = tcg_temp_new(); TCGLabel *l1 = gen_new_label(); tcg_gen_andi_tl(t0, cpu_ie, IE_EIE); tcg_gen_ori_tl(cpu_ie, cpu_ie, IE_IE); tcg_gen_brcondi_tl(TCG_COND_EQ, t0, IE_EIE, l1); tcg_gen_andi_tl(cpu_ie, cpu_ie, ~IE_IE); gen_set_label(l1); tcg_temp_free(t0); } else if (dc->r0 == R_BA) { TCGv t0 = tcg_temp_new(); TCGLabel *l1 = gen_new_label(); tcg_gen_andi_tl(t0, cpu_ie, IE_BIE); tcg_gen_ori_tl(cpu_ie, cpu_ie, IE_IE); tcg_gen_brcondi_tl(TCG_COND_EQ, t0, IE_BIE, l1); tcg_gen_andi_tl(cpu_ie, cpu_ie, ~IE_IE); gen_set_label(l1); tcg_temp_free(t0); } tcg_gen_mov_tl(cpu_pc, cpu_R[dc->r0]); dc->is_jmp = DISAS_JUMP; }
static void dec_or(DisasContext *dc) { if (dc->format == OP_FMT_RI) { LOG_DIS("ori r%d, r%d, %d\n", dc->r1, dc->r0, zero_extend(dc->imm16, 16)); } else { if (dc->r1 == R_R0) { LOG_DIS("mv r%d, r%d\n", dc->r2, dc->r0); } else { LOG_DIS("or r%d, r%d, r%d\n", dc->r2, dc->r0, dc->r1); } } if (dc->format == OP_FMT_RI) { tcg_gen_ori_tl(cpu_R[dc->r1], cpu_R[dc->r0], zero_extend(dc->imm16, 16)); } else { tcg_gen_or_tl(cpu_R[dc->r2], cpu_R[dc->r0], cpu_R[dc->r1]); } }