Messages in this thread | | | Date | Fri, 9 Dec 2016 06:26:38 +0100 | From | Peter Zijlstra <> | Subject | Re: [patch 5/6] [RFD] timekeeping: Provide optional 128bit math |
| |
On Thu, Dec 08, 2016 at 08:49:39PM -0000, Thomas Gleixner wrote:
> +static inline u64 timekeeping_delta_to_ns(struct tk_read_base *tkr, u64 delta) > +{ > + u32 dh, dl; > + u64 nsec; > + > + dl = delta; > + dh = delta >> 32; > + > + nsec = ((u64)dl * tkr->mult) + tkr->xtime_nsec; > + nsec >>= tkr->shift; > + if (unlikely(dh)) > + nsec += ((u64)dh * tkr->mult) << (32 - tkr->shift); > + return nsec; > +}
Just for giggles, on tilegx the branch is actually slower than doing the mult unconditionally.
The problem is that the two multiplies would otherwise completely pipeline, whereas with the conditional you serialize them.
(came to light while talking about why the mul_u64_u32_shr() fallback didn't work right for them, which was a combination of the above issue and the fact that their compiler 'lost' the fact that these are 32x32->64 mults and did 64x64 ones instead).
| |