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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to