Commit d03bd045 authored by Martin Schwidefsky's avatar Martin Schwidefsky

s390/timex: micro optimization for tod_to_ns

The conversion of a TOD value to nano-seconds currently uses a 32/32 bit
split with the calculation for "nsecs = (TOD * 125) >> 9". Using a
55/9 bit split saves an instruction.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent e53051e7
...@@ -206,20 +206,16 @@ static inline unsigned long long get_tod_clock_monotonic(void) ...@@ -206,20 +206,16 @@ static inline unsigned long long get_tod_clock_monotonic(void)
* ns = (todval * 125) >> 9; * ns = (todval * 125) >> 9;
* *
* In order to avoid an overflow with the multiplication we can rewrite this. * In order to avoid an overflow with the multiplication we can rewrite this.
* With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits) * With a split todval == 2^9 * th + tl (th upper 55 bits, tl lower 9 bits)
* we end up with * we end up with
* *
* ns = ((2^32 * th + tl) * 125 ) >> 9; * ns = ((2^9 * th + tl) * 125 ) >> 9;
* -> ns = (2^23 * th * 125) + ((tl * 125) >> 9); * -> ns = (th * 125) + ((tl * 125) >> 9);
* *
*/ */
static inline unsigned long long tod_to_ns(unsigned long long todval) static inline unsigned long long tod_to_ns(unsigned long long todval)
{ {
unsigned long long ns; return ((todval >> 9) * 125) + (((todval & 0x1ff) * 125) >> 9);
ns = ((todval >> 32) << 23) * 125;
ns += ((todval & 0xffffffff) * 125) >> 9;
return ns;
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment