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-head
mailing list