Revision fcc803d1 target-xtensa/translate.c

b/target-xtensa/translate.c
99 99
    [ITLBCFG] = "ITLBCFG",
100 100
    [DTLBCFG] = "DTLBCFG",
101 101
    [IBREAKENABLE] = "IBREAKENABLE",
102
    [ATOMCTL] = "ATOMCTL",
102 103
    [IBREAKA] = "IBREAKA0",
103 104
    [IBREAKA + 1] = "IBREAKA1",
104 105
    [DBREAKA] = "DBREAKA0",
......
556 557
    gen_jumpi_check_loop_end(dc, 0);
557 558
}
558 559

  
560
static void gen_wsr_atomctl(DisasContext *dc, uint32_t sr, TCGv_i32 v)
561
{
562
    tcg_gen_andi_i32(cpu_SR[sr], v, 0x3f);
563
}
564

  
559 565
static void gen_wsr_ibreaka(DisasContext *dc, uint32_t sr, TCGv_i32 v)
560 566
{
561 567
    unsigned id = sr - IBREAKA;
......
693 699
        [ITLBCFG] = gen_wsr_tlbcfg,
694 700
        [DTLBCFG] = gen_wsr_tlbcfg,
695 701
        [IBREAKENABLE] = gen_wsr_ibreakenable,
702
        [ATOMCTL] = gen_wsr_atomctl,
696 703
        [IBREAKA] = gen_wsr_ibreaka,
697 704
        [IBREAKA + 1] = gen_wsr_ibreaka,
698 705
        [DBREAKA] = gen_wsr_dbreaka,
......
2317 2324
                int label = gen_new_label();
2318 2325
                TCGv_i32 tmp = tcg_temp_local_new_i32();
2319 2326
                TCGv_i32 addr = tcg_temp_local_new_i32();
2327
                TCGv_i32 tpc;
2320 2328

  
2321 2329
                tcg_gen_mov_i32(tmp, cpu_R[RRI8_T]);
2322 2330
                tcg_gen_addi_i32(addr, cpu_R[RRI8_S], RRI8_IMM8 << 2);
2323 2331
                gen_load_store_alignment(dc, 2, addr, true);
2332

  
2333
                gen_advance_ccount(dc);
2334
                tpc = tcg_const_i32(dc->pc);
2335
                gen_helper_check_atomctl(cpu_env, tpc, addr);
2324 2336
                tcg_gen_qemu_ld32u(cpu_R[RRI8_T], addr, dc->cring);
2325 2337
                tcg_gen_brcond_i32(TCG_COND_NE, cpu_R[RRI8_T],
2326 2338
                        cpu_SR[SCOMPARE1], label);
......
2328 2340
                tcg_gen_qemu_st32(tmp, addr, dc->cring);
2329 2341

  
2330 2342
                gen_set_label(label);
2343
                tcg_temp_free(tpc);
2331 2344
                tcg_temp_free(addr);
2332 2345
                tcg_temp_free(tmp);
2333 2346
            }

Also available in: Unified diff