Revision 774d5c5b target-cris/translate_v10.c

b/target-cris/translate_v10.c
62 62
    t_gen_raise_exception(EXCP_BREAK);
63 63
}
64 64

  
65
static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val,
66
                       unsigned int size, int mem_index)
67
{
68
    int l1 = gen_new_label();
69
    TCGv taddr = tcg_temp_local_new();
70
    TCGv tval = tcg_temp_local_new();
71
    TCGv t1 = tcg_temp_local_new();
72
    dc->postinc = 0;
73
    cris_evaluate_flags(dc);
74

  
75
    tcg_gen_mov_tl(taddr, addr);
76
    tcg_gen_mov_tl(tval, val);
77

  
78
    /* Store only if F flag isn't set */
79
    tcg_gen_andi_tl(t1, cpu_PR[PR_CCS], F_FLAG_V10);
80
    tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
81
    if (size == 1) {
82
        tcg_gen_qemu_st8(tval, taddr, mem_index);
83
    } else if (size == 2) {
84
        tcg_gen_qemu_st16(tval, taddr, mem_index);
85
    } else {
86
        tcg_gen_qemu_st32(tval, taddr, mem_index);
87
    }
88
    gen_set_label(l1);
89
    tcg_gen_shri_tl(t1, t1, 1);  /* shift F to P position */
90
    tcg_gen_or_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], t1); /*P=F*/
91
    tcg_temp_free(t1);
92
    tcg_temp_free(tval);
93
    tcg_temp_free(taddr);
94
}
95

  
96
static void gen_store_v10(DisasContext *dc, TCGv addr, TCGv val,
97
                       unsigned int size)
98
{
99
    int mem_index = cpu_mmu_index(dc->env);
100

  
101
    /* If we get a fault on a delayslot we must keep the jmp state in
102
       the cpu-state to be able to re-execute the jmp.  */
103
    if (dc->delayed_branch == 1) {
104
        cris_store_direct_jmp(dc);
105
    }
106

  
107
    /* Conditional writes. We only support the kind were X is known
108
       at translation time.  */
109
    if (dc->flagx_known && dc->flags_x) {
110
        gen_store_v10_conditional(dc, addr, val, size, mem_index);
111
        return;
112
    }
113

  
114
    if (size == 1) {
115
        tcg_gen_qemu_st8(val, addr, mem_index);
116
    } else if (size == 2) {
117
        tcg_gen_qemu_st16(val, addr, mem_index);
118
    } else {
119
        tcg_gen_qemu_st32(val, addr, mem_index);
120
    }
121
}
122

  
123

  
65 124
/* Prefix flag and register are used to handle the more complex
66 125
   addressing modes.  */
67 126
static void cris_set_prefix(DisasContext *dc)
......
313 372
    if (set) {
314 373
        tcg_gen_ori_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], flags);
315 374
    } else {
316
        tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~flags);
375
        tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS],
376
                        ~(flags|F_FLAG_V10|P_FLAG_V10));
317 377
    }
318 378

  
319 379
    dc->flags_uptodate = 1;
......
723 783
    LOG_DIS("move.%d $r%d, [$r%d]\n", dc->size, dc->src, dc->dst);
724 784
    addr = tcg_temp_new();
725 785
    crisv10_prepare_memaddr(dc, addr, size);
726
    gen_store(dc, addr, cpu_R[dc->dst], size);
786
    gen_store_v10(dc, addr, cpu_R[dc->dst], size);
727 787
    insn_len += crisv10_post_memaddr(dc, size);
728 788

  
729 789
    return insn_len;
......
767 827
        t0 = tcg_temp_new();
768 828
        cris_evaluate_flags(dc);
769 829
        tcg_gen_andi_tl(t0, cpu_PR[PR_CCS], ~PFIX_FLAG);
770
        gen_store(dc, addr, t0, size);
830
        gen_store_v10(dc, addr, t0, size);
771 831
        tcg_temp_free(t0);
772 832
    } else {
773
        gen_store(dc, addr, cpu_PR[dc->dst], size);
833
        gen_store_v10(dc, addr, cpu_PR[dc->dst], size);
774 834
    }
775 835
    t0 = tcg_temp_new();
776 836
    insn_len += crisv10_post_memaddr(dc, size);
......
793 853
    tcg_gen_mov_tl(t0, addr);
794 854
    for (i = dc->dst; i >= 0; i--) {
795 855
        if ((pfix && dc->mode == CRISV10_MODE_AUTOINC) && dc->src == i) {
796
            gen_store(dc, addr, t0, 4);
856
            gen_store_v10(dc, addr, t0, 4);
797 857
        } else {
798
            gen_store(dc, addr, cpu_R[i], 4);
858
            gen_store_v10(dc, addr, cpu_R[i], 4);
799 859
        }
800 860
        tcg_gen_addi_tl(addr, addr, 4);
801 861
    }

Also available in: Unified diff