svn commit: r209620 - head/lib/libc/gmon

Marcel Moolenaar marcel at FreeBSD.org
Thu Jul 1 00:48:00 UTC 2010


Author: marcel
Date: Thu Jul  1 00:48:00 2010
New Revision: 209620
URL: http://svn.freebsd.org/changeset/base/209620

Log:
  Simplify the calculation of s_scale by rewriting the FP expression to
  use uintmax_t instead of float and thereby eliminating the need for
  a non-FP version.
  
  Tested on: amd64, ia64 & powerpc (book-E)
  Suggested by:	bde
  MFC after:	1 month

Modified:
  head/lib/libc/gmon/gmon.c

Modified: head/lib/libc/gmon/gmon.c
==============================================================================
--- head/lib/libc/gmon/gmon.c	Thu Jul  1 00:33:50 2010	(r209619)
+++ head/lib/libc/gmon/gmon.c	Thu Jul  1 00:48:00 2010	(r209620)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
 
 #include <err.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -58,8 +59,8 @@ extern char *minbrk __asm ("minbrk");
 struct gmonparam _gmonparam = { GMON_PROF_OFF };
 
 static int	s_scale;
-/* see profil(2) where this is describe (incorrectly) */
-#define		SCALE_1_TO_1	0x10000L
+/* See profil(2) where this is described (incorrectly). */
+#define	SCALE_SHIFT	16
 
 #define ERR(s) _write(2, s, sizeof(s))
 
@@ -110,24 +111,8 @@ monstartup(lowpc, highpc)
 	p->tos[0].link = 0;
 
 	o = p->highpc - p->lowpc;
-	if (p->kcountsize < o) {
-#if !defined(__powerpc__)
-		s_scale = ((float)p->kcountsize / o ) * SCALE_1_TO_1;
-#else /* avoid floating point */
-		int quot = o / p->kcountsize;
-
-		if (quot >= 0x10000)
-			s_scale = 1;
-		else if (quot >= 0x100)
-			s_scale = 0x10000 / quot;
-		else if (o >= 0x800000)
-			s_scale = 0x1000000 / (o / (p->kcountsize >> 8));
-		else
-			s_scale = 0x1000000 / ((o << 8) / p->kcountsize);
-#endif
-	} else
-		s_scale = SCALE_1_TO_1;
-
+	s_scale = (p->kcountsize < o) ?
+	    ((uintmax_t)p->kcountsize << SCALE_SHIFT) / o : (1 << SCALE_SHIFT);
 	moncontrol(1);
 }
 


More information about the svn-src-all mailing list