static void gen_store_v10(DisasContext *dc, TCGv addr, TCGv val, unsigned int size) { int mem_index = cpu_mmu_index(dc->env); /* If we get a fault on a delayslot we must keep the jmp state in the cpu-state to be able to re-execute the jmp. */ if (dc->delayed_branch == 1) { cris_store_direct_jmp(dc); } /* Conditional writes. We only support the kind were X is known at translation time. */ if (dc->flagx_known && dc->flags_x) { gen_store_v10_conditional(dc, addr, val, size, mem_index); return; } if (size == 1) { tcg_gen_qemu_st8(val, addr, mem_index); } else if (size == 2) { tcg_gen_qemu_st16(val, addr, mem_index); } else { tcg_gen_qemu_st32(val, addr, mem_index); } }
static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val, unsigned int size, int mem_index) { int l1 = gen_new_label(); TCGv taddr = tcg_temp_local_new(); TCGv tval = tcg_temp_local_new(); TCGv t1 = tcg_temp_local_new(); dc->postinc = 0; cris_evaluate_flags(dc); tcg_gen_mov_tl(taddr, addr); tcg_gen_mov_tl(tval, val); /* Store only if F flag isn't set */ tcg_gen_andi_tl(t1, cpu_PR[PR_CCS], F_FLAG_V10); tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1); if (size == 1) { tcg_gen_qemu_st8(tval, taddr, mem_index); } else if (size == 2) { tcg_gen_qemu_st16(tval, taddr, mem_index); } else { tcg_gen_qemu_st32(tval, taddr, mem_index); } gen_set_label(l1); tcg_gen_shri_tl(t1, t1, 1); /* shift F to P position */ tcg_gen_or_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], t1); /*P=F*/ tcg_temp_free(t1); tcg_temp_free(tval); tcg_temp_free(taddr); }
static void dec_sb(DisasContext *dc) { TCGv t0; LOG_DIS("sb (r%d+%d), r%d\n", dc->r0, dc->imm16, dc->r1); t0 = tcg_temp_new(); tcg_gen_addi_tl(t0, cpu_R[dc->r0], sign_extend(dc->imm16, 16)); tcg_gen_qemu_st8(cpu_R[dc->r1], t0, MEM_INDEX); tcg_temp_free(t0); }