Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Oct 2011 06:40:36 +0000 (UTC)
From:      David Schultz <das@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   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
Message-ID:  <201110210640.p9L6eaeC010594@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110210640.p9L6eaeC010594>