Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Feb 2003 22:44:55 -0500
From:      Mike Barcroft <mike@FreeBSD.org>
To:        standards@FreeBSD.org
Cc:        Bruce Evans <bde@zeta.org.au>
Subject:   fpclassify() for review
Message-ID:  <20030206224455.B78590@espresso.q9media.com>

next in thread | raw e-mail | index | archive | help

--eJnRUKwClWJh1Khz
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline


I'd appreciate reviews of the attached patch which implements C99's
fpclassify().  David Schultz and I have been working on it for the
last few days.  I committed the regression test counterpart yesterday.
It's in src/tools/regression/lib/libc/gen.

Best regards,
Mike Barcroft

--eJnRUKwClWJh1Khz
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="fpclassify4.diff"

Implement fpclassify():
o Add a MD header private to libc called _fpmath.h; this header
  contains bitfield layouts of MD floating-point types.
o Add a MI header private to libc called fpmath.h; this header
  contains bitfield layouts of MI floating-point types.
o Add private libc variables for storing infinity and NaN values
  for `float' and `long double' to lib/libc/$arch/gen/infinity.c.
o Add __double_t and __float_t to <machine/_types.h>, and provide
  double_t and float_t typedefs in <math.h>.
o Add some C99 manifest constants (FP_ILOGB0, FP_ILOGBNAN, HUGE_VALF,
  HUGE_VALL, INFINITY, NAN, and return values for fpclassify()) to
  <math.h> and others (FLT_EVAL_METHOD, DECIMAL_DIG) to <float.h> via
  <machine/float.h>.
o Add C99 macro fpclassify() which calls __fpclassify{d,f,l}() based
  on the size of its argument.  __fpclassifyl() is never called on
  alpha because (sizeof(long double) == sizeof(double)), which is good
  since __fpclassifyl() can't deal with such a small `long double'.

This was developed by David Schultz and myself with input from bde and
fenner.

PR:		23103
Submitted by:	David Schultz <dschultz@uclink.Berkeley.EDU>
		(significant portions)

Index: lib/libc/Makefile
===================================================================
RCS file: /work/repo/src/lib/libc/Makefile,v
retrieving revision 1.37
diff -u -r1.37 Makefile
--- lib/libc/Makefile	18 Nov 2002 09:50:54 -0000	1.37
+++ lib/libc/Makefile	6 Feb 2003 16:56:21 -0000
@@ -10,8 +10,8 @@
 # system call stubs.
 LIB=c
 SHLIB_MAJOR= 5
-CFLAGS+=-I${.CURDIR}/include -I${.CURDIR}/../../include
 AINC=	-I${.CURDIR}/${MACHINE_ARCH}
+CFLAGS+=-I${.CURDIR}/include -I${.CURDIR}/../../include ${AINC}
 CLEANFILES+=tags
 INSTALL_PIC_ARCHIVE=	yes
 PRECIOUSLIB=	yes
Index: lib/libc/alpha/_fpmath.h
===================================================================
RCS file: lib/libc/alpha/_fpmath.h
diff -N lib/libc/alpha/_fpmath.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/alpha/_fpmath.h	5 Feb 2003 17:00:29 -0000
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+	long double e;
+	struct {
+		unsigned int manl : 32;
+		unsigned int manh : 20;
+		unsigned int exp  : 11;
+		unsigned int sign : 1;
+	} bits;
+};
Index: lib/libc/alpha/gen/infinity.c
===================================================================
RCS file: /work/repo/src/lib/libc/alpha/gen/infinity.c,v
retrieving revision 1.6
diff -u -r1.6 infinity.c
--- lib/libc/alpha/gen/infinity.c	31 Oct 2002 23:05:19 -0000	1.6
+++ lib/libc/alpha/gen/infinity.c	5 Feb 2003 16:21:55 -0000
@@ -34,3 +34,8 @@
 
 /* bytes for +Infinity on an Alpha (IEEE double format) */
 const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
+const union __infinity_f_un __infinity_f = { { 0, 0, 0x80, 0x7f } };
+const union __infinity_l_un __infinity_l = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
+
+/* bytes for NaN */
+const union __nan_un __nan = { { 0x01, 0, 0x80, 0x7f } };
Index: lib/libc/gen/Makefile.inc
===================================================================
RCS file: /work/repo/src/lib/libc/gen/Makefile.inc,v
retrieving revision 1.100
diff -u -r1.100 Makefile.inc
--- lib/libc/gen/Makefile.inc	30 Jan 2003 21:38:39 -0000	1.100
+++ lib/libc/gen/Makefile.inc	5 Feb 2003 17:31:29 -0000
@@ -9,7 +9,7 @@
 	clock.c closedir.c confstr.c \
 	crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \
 	dlfcn.c dlfunc.c drand48.c erand48.c err.c errlst.c errno.c \
-	exec.c fmtcheck.c fmtmsg.c fnmatch.c fstab.c ftok.c fts.c \
+	exec.c fmtcheck.c fmtmsg.c fnmatch.c fpclassify.c fstab.c ftok.c fts.c \
 	getbootfile.c getbsize.c \
 	getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \
 	gethostname.c getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \
@@ -40,7 +40,8 @@
 	basename.3 check_utility_compat.3 clock.3 \
 	confstr.3 ctermid.3 daemon.3 \
 	devname.3 directory.3 dirname.3 dladdr.3 dllockinit.3 dlopen.3 \
-	err.3 exec.3 fmtcheck.3 fmtmsg.3 fnmatch.3 frexp.3 ftok.3 fts.3 \
+	err.3 exec.3 fmtcheck.3 fmtmsg.3 fnmatch.3 fpclassify.3 frexp.3 \
+	ftok.3 fts.3 \
 	getbootfile.3 getbsize.3 getcap.3 getcontext.3 getcwd.3 \
 	getdiskbyname.3 getdomainname.3 getfsent.3 \
 	getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \
Index: lib/libc/gen/fpclassify.3
===================================================================
RCS file: lib/libc/gen/fpclassify.3
diff -N lib/libc/gen/fpclassify.3
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/gen/fpclassify.3	6 Feb 2003 22:03:28 -0000
@@ -0,0 +1,81 @@
+.\" Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd February 6, 2003
+.Dt FPCLASSIFY 3
+.Os
+.Sh NAME
+.Nm fpclassify
+.Nd "classify a floating-point number"
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In math.h
+.Ft int
+.Fn fpclassify "real-floating x"
+.Sh DESCRIPTION
+The
+.Fn fpclassify
+macro takes an argument of
+.Va x
+and returns one of the following manifest constants.
+.Bl -tag -width ".Dv FP_SUBNORMAL"
+.It Dv FP_INFINITE
+Indicates that
+.Va x
+is an infinite number.
+.It Dv FP_NAN
+Indicates that
+.Va x
+is not a number (NaN).
+.It Dv FP_NORMAL
+Indicates that
+.Va x
+is a normalized number.
+.It Dv FP_SUBNORMAL
+Indicates that
+.Va x
+is a denormalized number.
+.It Dv FP_ZERO
+Indicates that
+.Va x
+is zero (0 or -0).
+.El
+.Sh SEE ALSO
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn fpclassify
+macro conforms to
+.St -isoC-99 .
+.Sh HISTORY
+The
+.Fn fpclassify
+macro was added in
+.Fx 5.1 .
+.Sh BUGS
+By default, the DEC Alpha architecture does not support IEEE rounding.
+See compiler documentation for additional details.
Index: lib/libc/gen/fpclassify.c
===================================================================
RCS file: lib/libc/gen/fpclassify.c
diff -N lib/libc/gen/fpclassify.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/gen/fpclassify.c	5 Feb 2003 17:02:14 -0000
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+ * Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/endian.h>
+
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+int
+__fpclassifyf(float f)
+{
+	union IEEEf2bits u;
+
+	u.f = f;
+	if (u.bits.exp == 0) {
+		if (u.bits.man == 0)
+			return (FP_ZERO);
+		else
+			return (FP_SUBNORMAL);
+	} else if (u.bits.exp == 255) {
+		if (u.bits.man == 0)
+			return (FP_INFINITE);
+		else
+			return (FP_NAN);
+	} else
+		return (FP_NORMAL);
+}
+
+int
+__fpclassifyd(double d)
+{
+	union IEEEd2bits u;
+
+	u.d = d;
+	if (u.bits.exp == 0) {
+		if ((u.bits.manl | u.bits.manh) == 0)
+			return (FP_ZERO);
+		else
+			return (FP_SUBNORMAL);
+	} else if (u.bits.exp == 2047) {
+		if ((u.bits.manl | u.bits.manh) == 0)
+			return (FP_INFINITE);
+		else
+			return (FP_NAN);
+	} else
+		return (FP_NORMAL);
+}
+
+int
+__fpclassifyl(long double e)
+{
+	union IEEEl2bits u;
+
+	u.e = e;
+	if (u.bits.exp == 0) {
+		if ((u.bits.manl | u.bits.manh) == 0)
+			return (FP_ZERO);
+		else
+			return (FP_SUBNORMAL);
+	} else if (u.bits.exp == 32767) {
+		if ((u.bits.manl | u.bits.manh) == 0)
+			return (FP_INFINITE);
+		else
+			return (FP_NAN);
+	} else
+		return (FP_NORMAL);
+}
Index: lib/libc/i386/_fpmath.h
===================================================================
RCS file: lib/libc/i386/_fpmath.h
diff -N lib/libc/i386/_fpmath.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/i386/_fpmath.h	5 Feb 2003 17:02:46 -0000
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+	long double e;
+	struct {
+		unsigned int manl : 32;
+		unsigned int manh : 32;
+		unsigned int exp  : 15;
+		unsigned int sign : 1;
+		unsigned int junk : 16;
+	} bits;
+};
Index: lib/libc/i386/gen/infinity.c
===================================================================
RCS file: /work/repo/src/lib/libc/i386/gen/infinity.c,v
retrieving revision 1.9
diff -u -r1.9 infinity.c
--- lib/libc/i386/gen/infinity.c	31 Oct 2002 23:05:19 -0000	1.9
+++ lib/libc/i386/gen/infinity.c	6 Feb 2003 17:52:42 -0000
@@ -9,3 +9,9 @@
 
 /* bytes for +Infinity on a 387 */
 const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
+const union __infinity_f_un __infinity_f = { { 0, 0, 0x80, 0x7f } };
+const union __infinity_l_un __infinity_l =
+    { { 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0x7f, 0, 0 } };
+
+/* bytes for NaN */
+const union __nan_un __nan = { { 0x01, 0, 0x80, 0x7f } };
Index: lib/libc/ia64/_fpmath.h
===================================================================
RCS file: lib/libc/ia64/_fpmath.h
diff -N lib/libc/ia64/_fpmath.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/ia64/_fpmath.h	5 Feb 2003 17:03:31 -0000
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+ * Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+	long double e;
+	struct {
+		unsigned long manl : 64;
+		unsigned long manh : 48;
+		unsigned int exp   : 15;
+		unsigned int sign  : 1;
+	} bits;
+};
Index: lib/libc/ia64/gen/infinity.c
===================================================================
RCS file: /work/repo/src/lib/libc/ia64/gen/infinity.c,v
retrieving revision 1.5
diff -u -r1.5 infinity.c
--- lib/libc/ia64/gen/infinity.c	31 Oct 2002 23:05:19 -0000	1.5
+++ lib/libc/ia64/gen/infinity.c	5 Feb 2003 16:21:55 -0000
@@ -34,3 +34,9 @@
 
 /* bytes for +Infinity on an ia64 (IEEE double format) */
 const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
+const union __infinity_f_un __infinity_f = { { 0, 0, 0x80, 0x7f } };
+const union __infinity_l_un __infinity_l =
+    { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0x7f } };
+
+/* bytes for NaN */
+const union __nan_un __nan = { { 0x01, 0, 0x80, 0x7f } };
Index: lib/libc/powerpc/_fpmath.h
===================================================================
RCS file: lib/libc/powerpc/_fpmath.h
diff -N lib/libc/powerpc/_fpmath.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/powerpc/_fpmath.h	6 Feb 2003 21:56:47 -0000
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (c) 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+	long double e;
+	struct {
+		unsigned int sign  : 1;
+		unsigned int exp   : 15;
+		unsigned long manh : 48;
+		unsigned long manl : 64;
+	} bits;
+};
Index: lib/libc/powerpc/gen/infinity.c
===================================================================
RCS file: /work/repo/src/lib/libc/powerpc/gen/infinity.c,v
retrieving revision 1.1
diff -u -r1.1 infinity.c
--- lib/libc/powerpc/gen/infinity.c	4 Dec 2002 07:25:14 -0000	1.1
+++ lib/libc/powerpc/gen/infinity.c	5 Feb 2003 16:21:55 -0000
@@ -12,3 +12,9 @@
 
 /* bytes for +Infinity on powerpc */
 const union __infinity_un __infinity = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
+const union __infinity_f_un __infinity_f = { { 0x7f, 0x80, 0, 0 } };
+const union __infinity_l_un __infinity_l =
+    { { 0x7f, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
+
+/* bytes for NaN */
+const union __nan_un __nan = { { 0x7f, 0x80, 0, 0x01 } };
Index: lib/libc/sparc64/_fpmath.h
===================================================================
RCS file: lib/libc/sparc64/_fpmath.h
diff -N lib/libc/sparc64/_fpmath.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/sparc64/_fpmath.h	5 Feb 2003 17:03:57 -0000
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+ * Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+	long double e;
+	struct {
+		unsigned int sign  : 1;
+		unsigned int exp   : 15;
+		unsigned long manh : 48;
+		unsigned long manl : 64;
+	} bits;
+};
Index: lib/libc/sparc64/gen/infinity.c
===================================================================
RCS file: /work/repo/src/lib/libc/sparc64/gen/infinity.c,v
retrieving revision 1.6
diff -u -r1.6 infinity.c
--- lib/libc/sparc64/gen/infinity.c	31 Oct 2002 23:05:19 -0000	1.6
+++ lib/libc/sparc64/gen/infinity.c	5 Feb 2003 16:21:55 -0000
@@ -12,3 +12,9 @@
 
 /* bytes for +Infinity on a sparc */
 const union __infinity_un __infinity = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
+const union __infinity_f_un __infinity_f = { { 0x7f, 0x80, 0, 0 } };
+const union __infinity_l_un __infinity_l =
+    { { 0x7f, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
+
+/* bytes for NaN */
+const union __nan_un __nan = { { 0x7f, 0x80, 0, 0x01 } };
Index: lib/msun/src/math.h
===================================================================
RCS file: /work/repo/src/lib/msun/src/math.h,v
retrieving revision 1.20
diff -u -r1.20 math.h
--- lib/msun/src/math.h	31 Oct 2002 23:05:20 -0000	1.20
+++ lib/msun/src/math.h	6 Feb 2003 18:04:20 -0000
@@ -17,6 +17,8 @@
 #ifndef _MATH_H_
 #define	_MATH_H_
 
+#include <sys/_types.h>
+
 /*
  * ANSI/POSIX
  */
@@ -24,7 +26,43 @@
 	unsigned char	__uc[8];
 	double		__ud;
 } __infinity;
+
+extern const union __infinity_f_un {
+	unsigned char	__uc[sizeof(float)];
+	float		__uf;
+} __infinity_f;
+
+extern const union __infinity_l_un {
+	unsigned char	__uc[sizeof(long double)];
+	long double	__ul;
+} __infinity_l;
+
+extern const union __nan_un {
+	unsigned char	__uc[sizeof(float)];
+	float		__uf;
+} __nan;
+
+#define	FP_ILOGB0	(-0x7fffffff - 1)	/* INT_MIN */
+#define	FP_ILOGBNAN	0x7fffffff		/* INT_MAX */
 #define HUGE_VAL	(__infinity.__ud)
+#define	HUGE_VALF	(__infinity_f.__uf)
+#define	HUGE_VALL	(__infinity_l.__ul)
+#define	INFINITY	HUGE_VALF
+#define	NAN		(__nan.__uf)
+
+/* Symbolic constants to classify floating point numbers */
+#define	FP_INFINITE	1
+#define	FP_NAN		2
+#define	FP_NORMAL	3
+#define	FP_SUBNORMAL	4
+#define	FP_ZERO		5
+#define	fpclassify(x) \
+    ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
+    : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
+    : __fpclassifyl(x))
+
+typedef	__double_t	double_t;
+typedef	__float_t	float_t;
 
 /*
  * XOPEN/SVID
@@ -116,6 +154,10 @@
 /*
  * ANSI/POSIX
  */
+int	__fpclassifyd(double);
+int	__fpclassifyf(float);
+int	__fpclassifyl(long double);
+
 double	acos(double);
 double	asin(double);
 double	atan(double);
Index: sys/alpha/include/_types.h
===================================================================
RCS file: /work/repo/src/sys/alpha/include/_types.h,v
retrieving revision 1.2
diff -u -r1.2 _types.h
--- sys/alpha/include/_types.h	23 Aug 2002 16:49:04 -0000	1.2
+++ sys/alpha/include/_types.h	5 Feb 2003 16:23:59 -0000
@@ -56,6 +56,8 @@
  */
 typedef	__int32_t	__clock_t;		/* clock()... */
 typedef	__int64_t	__critical_t;
+typedef	double		__double_t;
+typedef	float		__float_t;
 typedef	__int64_t	__intfptr_t;
 typedef	__int64_t	__intmax_t;
 typedef	__int64_t	__intptr_t;
Index: sys/alpha/include/float.h
===================================================================
RCS file: /work/repo/src/sys/alpha/include/float.h,v
retrieving revision 1.3
diff -u -r1.3 float.h
--- sys/alpha/include/float.h	20 Mar 2002 18:58:45 -0000	1.3
+++ sys/alpha/include/float.h	5 Feb 2003 16:58:15 -0000
@@ -45,6 +45,8 @@
 
 #define FLT_RADIX	2		/* b */
 #define FLT_ROUNDS	__flt_rounds()
+#define	FLT_EVAL_METHOD	0		/* no promotions */
+#define	DECIMAL_DIG	17		/* max precision in decimal digits */
 
 #define FLT_MANT_DIG	24		/* p */
 #define FLT_EPSILON	1.19209290E-07F	/* b**(1-p) */
Index: sys/i386/include/_types.h
===================================================================
RCS file: /work/repo/src/sys/i386/include/_types.h,v
retrieving revision 1.4
diff -u -r1.4 _types.h
--- sys/i386/include/_types.h	1 Oct 2002 14:07:18 -0000	1.4
+++ sys/i386/include/_types.h	5 Feb 2003 16:25:18 -0000
@@ -69,6 +69,8 @@
  */
 typedef	unsigned long	__clock_t;		/* clock()... */
 typedef	__int32_t	__critical_t;
+typedef	double		__double_t;
+typedef	double		__float_t;
 typedef	__int32_t	__intfptr_t;
 typedef	__int64_t	__intmax_t;
 typedef	__int32_t	__intptr_t;
Index: sys/i386/include/float.h
===================================================================
RCS file: /work/repo/src/sys/i386/include/float.h,v
retrieving revision 1.9
diff -u -r1.9 float.h
--- sys/i386/include/float.h	25 Oct 2002 07:02:52 -0000	1.9
+++ sys/i386/include/float.h	5 Feb 2003 16:59:10 -0000
@@ -39,6 +39,8 @@
 
 #define FLT_RADIX	2		/* b */
 #define FLT_ROUNDS	1		/* FP addition rounds to nearest */
+#define	FLT_EVAL_METHOD	(-1)		/* i387 semantics are...interesting */
+#define	DECIMAL_DIG	21		/* max precision in decimal digits */
 
 #define FLT_MANT_DIG	24		/* p */
 #define FLT_EPSILON	1.19209290E-07F	/* b**(1-p) */
Index: sys/ia64/include/_types.h
===================================================================
RCS file: /work/repo/src/sys/ia64/include/_types.h,v
retrieving revision 1.4
diff -u -r1.4 _types.h
--- sys/ia64/include/_types.h	15 Nov 2002 22:35:34 -0000	1.4
+++ sys/ia64/include/_types.h	5 Feb 2003 16:24:45 -0000
@@ -56,6 +56,8 @@
  */
 typedef	__int32_t	__clock_t;		/* clock()... */
 typedef	__int64_t	__critical_t;
+typedef	double		__double_t;
+typedef	float		__float_t;
 typedef	__int64_t	__intfptr_t;
 typedef	__int64_t	__intmax_t;
 typedef	__int64_t	__intptr_t;
Index: sys/ia64/include/float.h
===================================================================
RCS file: /work/repo/src/sys/ia64/include/float.h,v
retrieving revision 1.2
diff -u -r1.2 float.h
--- sys/ia64/include/float.h	6 Oct 2001 15:57:22 -0000	1.2
+++ sys/ia64/include/float.h	5 Feb 2003 16:58:36 -0000
@@ -41,6 +41,8 @@
 
 #define FLT_RADIX	2		/* b */
 #define FLT_ROUNDS	1		/* FP addition rounds to nearest */
+#define	FLT_EVAL_METHOD	0		/* no promotions */
+#define	DECIMAL_DIG	35		/* max precision in decimal digits */
 
 #define FLT_MANT_DIG	24		/* p */
 #define FLT_EPSILON	1.19209290E-07F	/* b**(1-p) */
Index: sys/powerpc/include/_types.h
===================================================================
RCS file: /work/repo/src/sys/powerpc/include/_types.h,v
retrieving revision 1.3
diff -u -r1.3 _types.h
--- sys/powerpc/include/_types.h	18 Jan 2003 11:18:42 -0000	1.3
+++ sys/powerpc/include/_types.h	6 Feb 2003 21:59:12 -0000
@@ -69,6 +69,8 @@
  */
 typedef	__uint32_t	__clock_t;		/* clock()... */
 typedef	__int32_t	__critical_t;
+typedef	double		__double_t;
+typedef	double		__float_t;
 typedef	__int32_t	__intfptr_t;
 typedef	__int64_t	__intmax_t;
 typedef	__int32_t	__intptr_t;
Index: sys/powerpc/include/float.h
===================================================================
RCS file: /work/repo/src/sys/powerpc/include/float.h,v
retrieving revision 1.1
diff -u -r1.1 float.h
--- sys/powerpc/include/float.h	15 May 2002 20:54:35 -0000	1.1
+++ sys/powerpc/include/float.h	6 Feb 2003 21:58:32 -0000
@@ -40,6 +40,8 @@
 
 #define FLT_RADIX	2		/* b */
 #define FLT_ROUNDS	1		/* FP addition rounds to nearest */
+#define	FLT_EVAL_METHOD	1		/* operands promoted to double */
+#define	DECIMAL_DIG	35		/* max precision in decimal digits */
 
 #define FLT_MANT_DIG	24		/* p */
 #define FLT_EPSILON	1.19209290E-07F	/* b**(1-p) */
Index: sys/sparc64/include/_types.h
===================================================================
RCS file: /work/repo/src/sys/sparc64/include/_types.h,v
retrieving revision 1.2
diff -u -r1.2 _types.h
--- sys/sparc64/include/_types.h	23 Aug 2002 16:49:06 -0000	1.2
+++ sys/sparc64/include/_types.h	5 Feb 2003 16:26:38 -0000
@@ -56,6 +56,8 @@
  */
 typedef	__int32_t	__clock_t;		/* clock()... */
 typedef	__int64_t	__critical_t;
+typedef	double		__double_t;
+typedef	float		__float_t;
 typedef	__int64_t	__intfptr_t;
 typedef	__int64_t	__intmax_t;
 typedef	__int64_t	__intptr_t;
Index: sys/sparc64/include/float.h
===================================================================
RCS file: /work/repo/src/sys/sparc64/include/float.h,v
retrieving revision 1.2
diff -u -r1.2 float.h
--- sys/sparc64/include/float.h	21 Mar 2002 00:06:55 -0000	1.2
+++ sys/sparc64/include/float.h	5 Feb 2003 16:59:21 -0000
@@ -55,6 +55,8 @@
 
 #define FLT_RADIX	2		/* b */
 #define FLT_ROUNDS	__flt_rounds()
+#define	FLT_EVAL_METHOD	0		/* no promotion */
+#define	DECIMAL_DIG	35		/* max precision in decimal digits */
 
 #define FLT_MANT_DIG	24		/* p */
 #define FLT_EPSILON	1.19209290E-7F	/* b**(1-p) */

--eJnRUKwClWJh1Khz--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message




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