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~