On 03/28/2013 09:05 AM, Peter Maydell wrote:
> On 28 March 2013 15:32, Richard Henderson <r...@twiddle.net> wrote:
>> The epilogue on ARM is one pop instruction, that pops the return
>> address into PC.  Avoid the jump to jump for this case.  Use the
>> standard movi32 routine for loading the return value if it's easy.
> 
>> @@ -2025,8 +2023,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
>>      tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]);
>>
>>      tcg_out_bx(s, COND_AL, tcg_target_call_iarg_regs[1]);
>> -    tb_ret_addr = s->code_ptr;
>>
>>      /* ldmia sp!, { r4 - r12, pc } */
>> -    tcg_out32(s, (COND_AL << 28) | 0x08bd9ff0);
>> +    tb_pop_ret = (COND_AL << 28) | 0x08bd9ff0;
>>  }
> 
> Why are we using a variable when it's always constant?

I just wanted the comments for the stmia and ldmia to be the same, and near one
another.  Would it be better if tcg_target_qemu_prologue was moved up in the
file, and tb_ret_addr made a static const (which the compiler should fold)?

E.g.

/* ldmia sp!, { r4 - r12, pc }  @ See the stmia definition below.  */
static const uint32_t tb_pop_ret = ...;

static void tcg_target_qemu_prologue(TCGContext *s)
{
   /* comment */
   /* stmia sp!, {r4-r12, lr} */
   tcg_out32(...);
   ...
}

> Also, please add a comment to the bottom of the qemu_prologue()
> saying something like
> 
> /* We never return here; we always return directly from generated
>  * code to our caller.
>  */

Sure.


r~


Reply via email to