On Mon, 4 Jul 2011 17:06:54 +0200
Fabien Chouteau <chout...@adacore.com> wrote:

> 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));" ?

Yes.

Or more simply:

lapse = period - ((tb - period) & (period - 1));

> I don't see how this solves the "tb <= (1 << target_bit)" case.

Actually, since everything is unsigned the special case shouldn't be needed
regardless.

-Scott


Reply via email to