qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] Confusion regarding temporaries with branch conditional


From: Peter Maydell
Subject: Re: [Qemu-devel] Confusion regarding temporaries with branch conditional
Date: Wed, 30 Nov 2016 07:24:24 +0000

On 30 November 2016 at 07:00, Nikunj A Dadhania
<address@hidden> wrote:
>
> Hi,
>
> I was writing one instruction and hit following issue:
>
> [snip]/qemu/tcg/tcg.c:2039: tcg fatal error
> qemu-ppc64le: [snip]/qemu/translate-all.c:175: tb_lock: Assertion 
> `!have_tb_lock' failed.
> Segmentation fault (core dumped)
>
> Debugging deeper found that its something to do with the variable type:
>
>     TCGv nb = tcg_temp_new();
>     tcg_gen_andi_tl(nb, cpu_gpr[rB(ctx->opcode)], 0xFF);
>     tcg_gen_brcondi_tl(TCG_COND_EQ, nb, 0, l1);
>     [ Do something here]
>     gen_set_label(l1);
>     tcg_temp_free(nb);
>
> If I change the variable as "local temporary", the code works fine:
>
>     TCGv nb = tcg_temp_local_new();
>     tcg_gen_andi_tl(nb, cpu_gpr[rB(ctx->opcode)], 0xFF);
>     tcg_gen_brcondi_tl(TCG_COND_EQ, nb, 0, l1);
>     [ Do something here]
>     gen_set_label(l1);
>     tcg_temp_free(nb);
>
> I see lot of code that is using temporaries for similar operations,
> example target-ppc/translate.c:gen_check_align(). How is that working,
> is this a bug there as well?

You don't say what your "do something" code is doing, which
is the critical question for whether you need a plain
temporary or a local temporary. (See tcg/README.)
The plain temporary is only valid to the end of a basic
block, and brcond ends a basic block. So you can free
the temp after the brcond but you can't do anything
else with it. (This is what the PPC gen_check_align() does.)
If you want to use 'nb' in the "do something" code then
it must remain valid over the end of the basic block
and you need a local temporary.

thanks
-- PMM



reply via email to

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