[PATCH] Time: optimize out some mults, since gcc can't avoid them

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Newsflash: GCC not as smart as once hoped.

This patch removes some mults since GCC can't figure out how.

Pointed out by Roman Zippel.

Signed-off-by: John Stultz <[email protected]>

diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index 585789f..5f4a7f7 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -236,7 +236,6 @@ static inline int error_aproximation(u64
  *
  * Where mult_delta is the adjustment value made to mult
  *
- * XXX - Hopefully gcc is smart enough to avoid the multiplies.
  */
 static inline s64 make_ntp_adj(struct clocksource *clock,
 				cycles_t cycles_delta, s64* error)
@@ -244,27 +243,27 @@ static inline s64 make_ntp_adj(struct cl
 	s64 ret = 0;
 	if (*error  > ((s64)clock->interval_cycles+1)/2) {
 		/* calculate adjustment value */
-		int adjustment = 1 << error_aproximation(*error,
+		int adjustment = error_aproximation(*error,
 						clock->interval_cycles);
 		/* adjust clock */
-		clock->mult += adjustment;
-		clock->interval_snsecs += clock->interval_cycles * adjustment;
+		clock->mult += 1 << adjustment;
+		clock->interval_snsecs += clock->interval_cycles << adjustment;
 
 		/* adjust the base and error for the adjustment */
-		ret =  -(cycles_delta * adjustment);
-		*error -= clock->interval_cycles * adjustment;
+		ret =  -(cycles_delta << adjustment);
+		*error -= clock->interval_cycles << adjustment;
 		/* XXX adj error for cycle_delta offset? */
 	} else if ((-(*error))  > ((s64)clock->interval_cycles+1)/2) {
 		/* calculate adjustment value */
-		int adjustment = 1 << error_aproximation(-(*error),
+		int adjustment = error_aproximation(-(*error),
 						clock->interval_cycles);
 		/* adjust clock */
-		clock->mult -= adjustment;
-		clock->interval_snsecs -= clock->interval_cycles * adjustment;
+		clock->mult -= 1 << adjustment;
+		clock->interval_snsecs -= clock->interval_cycles << adjustment;
 
 		/* adjust the base and error for the adjustment */
-		ret =  cycles_delta * adjustment;
-		*error += clock->interval_cycles * adjustment;
+		ret =  cycles_delta << adjustment;
+		*error += clock->interval_cycles << adjustment;
 		/* XXX adj error for cycle_delta offset? */
 	}
 	return ret;


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux