qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 19/26] target-xtensa: implement loop option


From: Max Filippov
Subject: Re: [Qemu-devel] [PATCH 19/26] target-xtensa: implement loop option
Date: Fri, 20 May 2011 11:25:16 +0400
User-agent: KMail/1.13.6 (Linux/2.6.34.8-68.fc13.x86_64; KDE/4.5.5; x86_64; ; )

> > +    if (env->sregs[LEND] != v) {
> > +        tb_invalidate_phys_page_range(
> > +                env->sregs[LEND] - 1, env->sregs[LEND], 0);
> > +        env->sregs[LEND] = v;
> > +        tb_invalidate_phys_page_range(
> > +                env->sregs[LEND] - 1, env->sregs[LEND], 0);
> > +    }
> 
> Why are you invalidating twice?

TB at the old LEND and at the new. Although it will work correctly without 
first invalidation.

> > +static void gen_check_loop_end(DisasContext *dc, int slot)
> > +{
> > +    if (option_enabled(dc, XTENSA_OPTION_LOOP) &&
> > +            !(dc->tb->flags & XTENSA_TBFLAG_EXCM) &&
> > +            dc->next_pc == dc->lend) {
> > +        int label = gen_new_label();
> > +
> > +        tcg_gen_brcondi_i32(TCG_COND_NE, cpu_SR[LEND], dc->next_pc, label);
> > +        tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
> > +        tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
> > +        gen_jump(dc, cpu_SR[LBEG]);
> > +        gen_set_label(label);
> > +        gen_jumpi(dc, dc->next_pc, slot);
> 
> If you're going to pretend that LEND is a constant, you might as well
> pretend that LBEG is also a constant, so that you get to chain the TB's
> around the loop.

But there may be three exits from TB at the LEND if its last command is a 
branch: to the LBEG, to the branch target and to the next insn.

Thanks.
-- Max



reply via email to

[Prev in Thread] Current Thread [Next in Thread]