svn commit: r223211 - head/sys/x86/x86

Jung-uk Kim jkim at FreeBSD.org
Fri Jun 17 21:41:06 UTC 2011


Author: jkim
Date: Fri Jun 17 21:41:06 2011
New Revision: 223211
URL: http://svn.freebsd.org/changeset/base/223211

Log:
  Teach the compiler how to shift TSC value efficiently.  As noted in r220631,
  some times compiler inserts redundant instructions to preserve unused upper
  32 bits even when it is casted to a 32-bit value.  Unfortunately, it seems
  the problem becomes more serious when it is shifted, especially on amd64.

Modified:
  head/sys/x86/x86/tsc.c

Modified: head/sys/x86/x86/tsc.c
==============================================================================
--- head/sys/x86/x86/tsc.c	Fri Jun 17 21:31:13 2011	(r223210)
+++ head/sys/x86/x86/tsc.c	Fri Jun 17 21:41:06 2011	(r223211)
@@ -461,7 +461,7 @@ init_TSC_tc(void)
 		tsc_timecounter.tc_quality = 1000;
 
 init:
-	for (shift = 0; shift < 32 && (tsc_freq >> shift) > max_freq; shift++)
+	for (shift = 0; shift < 31 && (tsc_freq >> shift) > max_freq; shift++)
 		;
 	if (shift > 0) {
 		tsc_timecounter.tc_get_timecount = tsc_get_timecount_low;
@@ -579,6 +579,9 @@ tsc_get_timecount(struct timecounter *tc
 static u_int
 tsc_get_timecount_low(struct timecounter *tc)
 {
+	uint32_t rv;
 
-	return (rdtsc() >> (int)(intptr_t)tc->tc_priv);
+	__asm __volatile("rdtsc; shrd %%cl, %%edx, %0"
+	: "=a" (rv) : "c" ((int)(intptr_t)tc->tc_priv) : "edx");
+	return (rv);
 }


More information about the svn-src-head mailing list