Richard Henderson <r...@twiddle.net> writes:

> On 09/15/2016 07:38 AM, Alex Bennée wrote:
>>> +    lab_fail = gen_new_label();
>>> > +    lab_done = gen_new_label();
>>> > +    tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_lock_addr, lab_fail);
>>> > +    tcg_temp_free_i64(addr);
>>> >
>>> > -        lab_fail = gen_new_label();
>>> > -        lab_done = gen_new_label();
>>> > -        tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_lock_addr, lab_fail);
>>> > +    val = tcg_temp_new_i64();
>>> > +    tcg_gen_atomic_cmpxchg_i64(val, cpu_lock_addr, cpu_lock_value,
>>> > +                               load_gpr(ctx, ra), mem_idx, op);
>>> > +    free_context_temps(ctx);
>> I don't quite follow what free_context_temps() is doing and why it needs
>> to be done twice during the building of this instructions TCGOps?
>>
>
> It's releasing the zero, sink, imm TCGv temporaries from DisasContext, as
> they're going out of scope within each basic block.  Since they're freed,
> they'll be re-created as necessary in the next basic block.
>
> The two (unlikely) relevant events are: (1) address register = zero register,
> so the zero temp becomes invalid, and (2) dest register = zero register, so 
> the
> zero/sink temps become invalid.

Ahh ok. The ARM code just allocates temps on demand including for its
zero register which I guess means multiple ones could be assigned. There
is also temp allocation logic to free them at the end of the block.

I wonder if this is something that should be more of a feature of the
core TCG code because let's face it temp tracking is a pain.

>
> It's the kind of thing that really shouldn't ever happen for non-malicious
> code, but you don't want qemu to abort when invalid temps are used.  Perhaps a
> comment is warranted here...

Does the code generator suffer if temps aren't freed as soon as
possible?  Is there a reason why we don't just do a general free all
temps at the end of the block?

--
Alex Bennée

Reply via email to