svn commit: r226606 - in head/lib/libc: amd64 amd64/gen arm arm/gen
gen i386 i386/gen ia64 ia64/gen mips mips/gen powerpc
powerpc/gen powerpc64 powerpc64/gen sparc64 sparc64/gen
David Schultz
das at FreeBSD.org
Fri Oct 21 06:40:37 UTC 2011
Author: das
Date: Fri Oct 21 06:40:36 2011
New Revision: 226606
URL: http://svn.freebsd.org/changeset/base/226606
Log:
Replace a proliferation of buggy MD implementations of modf() with a
working MI one. The MI one only needs to be overridden on machines
with non-IEEE754 arithmetic. (The last supported one was the VAX.)
It can also be overridden if someone comes up with a faster one that
actually passes the regression tests -- but this is harder than it sounds.
Added:
head/lib/libc/gen/modf.c
- copied, changed from r226410, head/lib/msun/src/s_modf.c
Deleted:
head/lib/libc/amd64/gen/modf.S
head/lib/libc/arm/gen/modf.c
head/lib/libc/i386/gen/modf.S
head/lib/libc/ia64/gen/modf.c
head/lib/libc/mips/gen/modf.S
head/lib/libc/mips/gen/modf.c
head/lib/libc/powerpc/gen/modf.c
head/lib/libc/powerpc64/gen/modf.c
head/lib/libc/sparc64/gen/modf.S
Modified:
head/lib/libc/amd64/Symbol.map
head/lib/libc/amd64/gen/Makefile.inc
head/lib/libc/arm/Symbol.map
head/lib/libc/arm/gen/Makefile.inc
head/lib/libc/gen/Makefile.inc
head/lib/libc/gen/Symbol.map
head/lib/libc/i386/Symbol.map
head/lib/libc/i386/gen/Makefile.inc
head/lib/libc/ia64/Symbol.map
head/lib/libc/ia64/gen/Makefile.inc
head/lib/libc/mips/Symbol.map
head/lib/libc/mips/gen/Makefile.inc
head/lib/libc/powerpc/Symbol.map
head/lib/libc/powerpc/gen/Makefile.inc
head/lib/libc/powerpc64/Symbol.map
head/lib/libc/powerpc64/gen/Makefile.inc
head/lib/libc/sparc64/Symbol.map
head/lib/libc/sparc64/gen/Makefile.inc
Modified: head/lib/libc/amd64/Symbol.map
==============================================================================
--- head/lib/libc/amd64/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/amd64/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -26,7 +26,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
rfork_thread;
setjmp;
longjmp;
Modified: head/lib/libc/amd64/gen/Makefile.inc
==============================================================================
--- head/lib/libc/amd64/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/amd64/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -2,7 +2,7 @@
# $FreeBSD$
SRCS+= _setjmp.S _set_tp.c rfork_thread.S setjmp.S sigsetjmp.S \
- fabs.S modf.S \
+ fabs.S \
infinity.c ldexp.c makecontext.c signalcontext.c \
flt_rounds.c fpgetmask.c fpsetmask.c fpgetprec.c fpsetprec.c \
fpgetround.c fpsetround.c fpgetsticky.c
Modified: head/lib/libc/arm/Symbol.map
==============================================================================
--- head/lib/libc/arm/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/arm/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -19,7 +19,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
setjmp;
longjmp;
sigsetjmp;
Modified: head/lib/libc/arm/gen/Makefile.inc
==============================================================================
--- head/lib/libc/arm/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/arm/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -2,5 +2,5 @@
# $FreeBSD$
SRCS+= _ctx_start.S _setjmp.S _set_tp.c alloca.S fabs.c \
- infinity.c ldexp.c makecontext.c modf.c \
+ infinity.c ldexp.c makecontext.c \
setjmp.S signalcontext.c sigsetjmp.S divsi3.S
Modified: head/lib/libc/gen/Makefile.inc
==============================================================================
--- head/lib/libc/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -35,6 +35,8 @@ SRCS+= __getosreldate.c __xuname.c \
usleep.c utime.c utxdb.c valloc.c vis.c wait.c wait3.c waitpid.c \
wordexp.c
+MISRCS+=modf.c
+
CANCELPOINTS_SRCS=sem.c sem_new.c
.for src in ${CANCELPOINTS_SRCS}
SRCS+=cancelpoints_${src}
Modified: head/lib/libc/gen/Symbol.map
==============================================================================
--- head/lib/libc/gen/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/gen/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -213,6 +213,7 @@ FBSD_1.0 {
ldexp;
lockf;
lrand48;
+ modf;
mrand48;
nftw;
nice;
Copied and modified: head/lib/libc/gen/modf.c (from r226410, head/lib/msun/src/s_modf.c)
==============================================================================
--- head/lib/msun/src/s_modf.c Sat Oct 15 23:15:55 2011 (r226410, copy source)
+++ head/lib/libc/gen/modf.c Fri Oct 21 06:40:36 2011 (r226606)
@@ -10,9 +10,8 @@
* ====================================================
*/
-#ifndef lint
-static char rcsid[] = "$FreeBSD$";
-#endif
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
/*
* modf(double x, double *iptr)
@@ -24,8 +23,68 @@ static char rcsid[] = "$FreeBSD$";
* No exception.
*/
-#include "math.h"
-#include "math_private.h"
+#include <sys/types.h>
+#include <machine/endian.h>
+#include <math.h>
+
+/* Bit fiddling routines copied from msun/src/math_private.h,v 1.15 */
+
+#if BYTE_ORDER == BIG_ENDIAN
+
+typedef union
+{
+ double value;
+ struct
+ {
+ u_int32_t msw;
+ u_int32_t lsw;
+ } parts;
+} ieee_double_shape_type;
+
+#endif
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+ double value;
+ struct
+ {
+ u_int32_t lsw;
+ u_int32_t msw;
+ } parts;
+} ieee_double_shape_type;
+
+#endif
+
+/* Get two 32 bit ints from a double. */
+
+#define EXTRACT_WORDS(ix0,ix1,d) \
+do { \
+ ieee_double_shape_type ew_u; \
+ ew_u.value = (d); \
+ (ix0) = ew_u.parts.msw; \
+ (ix1) = ew_u.parts.lsw; \
+} while (0)
+
+/* Get the more significant 32 bit int from a double. */
+
+#define GET_HIGH_WORD(i,d) \
+do { \
+ ieee_double_shape_type gh_u; \
+ gh_u.value = (d); \
+ (i) = gh_u.parts.msw; \
+} while (0)
+
+/* Set a double from two 32 bit ints. */
+
+#define INSERT_WORDS(d,ix0,ix1) \
+do { \
+ ieee_double_shape_type iw_u; \
+ iw_u.parts.msw = (ix0); \
+ iw_u.parts.lsw = (ix1); \
+ (d) = iw_u.value; \
+} while (0)
static const double one = 1.0;
Modified: head/lib/libc/i386/Symbol.map
==============================================================================
--- head/lib/libc/i386/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/i386/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -20,7 +20,6 @@ FBSD_1.0 {
__nan;
__infinity;
makecontext;
- modf;
rfork_thread;
setjmp;
longjmp;
Modified: head/lib/libc/i386/gen/Makefile.inc
==============================================================================
--- head/lib/libc/i386/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/i386/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -2,5 +2,5 @@
# $FreeBSD$
SRCS+= _ctx_start.S _setjmp.S _set_tp.c fabs.S \
- flt_rounds.c infinity.c ldexp.c makecontext.c modf.S \
+ flt_rounds.c infinity.c ldexp.c makecontext.c \
rfork_thread.S setjmp.S signalcontext.c sigsetjmp.S
Modified: head/lib/libc/ia64/Symbol.map
==============================================================================
--- head/lib/libc/ia64/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/ia64/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -23,7 +23,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
setjmp;
longjmp;
sigsetjmp;
Modified: head/lib/libc/ia64/gen/Makefile.inc
==============================================================================
--- head/lib/libc/ia64/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/ia64/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -3,7 +3,7 @@
SRCS+= __divdf3.S __divdi3.S __divsf3.S __divsi3.S __moddi3.S __modsi3.S \
__udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S _mcount.S _set_tp.c \
_setjmp.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c fpsetmask.c \
- fpsetround.c infinity.c ldexp.c makecontext.c modf.c setjmp.S \
+ fpsetround.c infinity.c ldexp.c makecontext.c setjmp.S \
signalcontext.c sigsetjmp.S
# The following may go away if function _Unwind_FindTableEntry()
Modified: head/lib/libc/mips/Symbol.map
==============================================================================
--- head/lib/libc/mips/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/mips/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -18,7 +18,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
setjmp;
longjmp;
sigsetjmp;
Modified: head/lib/libc/mips/gen/Makefile.inc
==============================================================================
--- head/lib/libc/mips/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/mips/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -1,7 +1,7 @@
# $NetBSD: Makefile.inc,v 1.27 2005/10/07 17:16:40 tsutsui Exp $
# $FreeBSD$
-SRCS+= infinity.c fabs.c ldexp.c modf.c
+SRCS+= infinity.c fabs.c ldexp.c
# SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
# fpsetround.c fpsetsticky.c
Modified: head/lib/libc/powerpc/Symbol.map
==============================================================================
--- head/lib/libc/powerpc/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/powerpc/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -24,7 +24,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
setjmp;
longjmp;
sigsetjmp;
Modified: head/lib/libc/powerpc/gen/Makefile.inc
==============================================================================
--- head/lib/libc/powerpc/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/powerpc/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -2,7 +2,7 @@
SRCS += _ctx_start.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
fpgetsticky.c fpsetmask.c fpsetround.c \
- infinity.c ldexp.c makecontext.c modf.c _setjmp.S \
+ infinity.c ldexp.c makecontext.c _setjmp.S \
setjmp.S sigsetjmp.S signalcontext.c syncicache.c \
_set_tp.c
Modified: head/lib/libc/powerpc64/Symbol.map
==============================================================================
--- head/lib/libc/powerpc64/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/powerpc64/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -24,7 +24,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
setjmp;
longjmp;
sigsetjmp;
Modified: head/lib/libc/powerpc64/gen/Makefile.inc
==============================================================================
--- head/lib/libc/powerpc64/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/powerpc64/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -2,7 +2,7 @@
SRCS += _ctx_start.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
fpgetsticky.c fpsetmask.c fpsetround.c \
- infinity.c ldexp.c makecontext.c modf.c _setjmp.S \
+ infinity.c ldexp.c makecontext.c _setjmp.S \
setjmp.S sigsetjmp.S signalcontext.c syncicache.c \
_set_tp.c
Modified: head/lib/libc/sparc64/Symbol.map
==============================================================================
--- head/lib/libc/sparc64/Symbol.map Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/sparc64/Symbol.map Fri Oct 21 06:40:36 2011 (r226606)
@@ -24,7 +24,6 @@ FBSD_1.0 {
__infinity;
__nan;
makecontext;
- modf;
setjmp;
longjmp;
sigsetjmp;
Modified: head/lib/libc/sparc64/gen/Makefile.inc
==============================================================================
--- head/lib/libc/sparc64/gen/Makefile.inc Fri Oct 21 06:36:40 2011 (r226605)
+++ head/lib/libc/sparc64/gen/Makefile.inc Fri Oct 21 06:40:36 2011 (r226606)
@@ -2,5 +2,5 @@
SRCS+= _ctx_start.S _setjmp.S fabs.S fixunsdfsi.S flt_rounds.c fpgetmask.c \
fpgetround.c fpgetsticky.c fpsetmask.c fpsetround.c \
- infinity.c ldexp.c makecontext.c modf.S \
+ infinity.c ldexp.c makecontext.c \
signalcontext.c setjmp.S sigsetjmp.S _set_tp.c
More information about the svn-src-all
mailing list