On 01/07/2011 22:22, Scott Wood wrote: > On Fri, 1 Jul 2011 16:13:41 +0200 > Fabien Chouteau <chout...@adacore.com> wrote: >> +static void booke_update_fixed_timer(CPUState *env, >> + uint8_t target_bit, >> + uint64_t *next, >> + struct QEMUTimer *timer) >> +{ >> + ppc_tb_t *tb_env = env->tb_env; >> + uint64_t lapse; >> + uint64_t tb; >> + uint64_t period = 1 << (target_bit + 1); >> + uint64_t now; >> + >> + now = qemu_get_clock_ns(vm_clock); >> + tb = cpu_ppc_get_tb(tb_env, now, tb_env->tb_offset); >> + >> + if (tb <= (1 << target_bit)) { >> + lapse = (1 << target_bit) - tb; >> + } else { >> + lapse = period - ((tb - (1 << target_bit)) % period); > > We know period is a power of two, so just do "& (period - 1)". > > That should let you get rid of the special case for > "tb <= (1 << target_bit)" as well. >
Do you mean "lapse = period - ((tb - (1 << target_bit)) & (period - 1));" ? I don't see how this solves the "tb <= (1 << target_bit)" case. -- Fabien Chouteau