diff options
author | das <das@FreeBSD.org> | 2004-07-09 03:32:40 +0000 |
---|---|---|
committer | das <das@FreeBSD.org> | 2004-07-09 03:32:40 +0000 |
commit | 65d8d759b1ed37f98e49000925a5e89487cf95fd (patch) | |
tree | 5275f48bb8c8196ab5e9ffc78ef28924e9a8a56f /lib/libc/i386/gen | |
parent | 5ef7c3d0ff72cc97a9a5ed0935c3a12630e46b1b (diff) | |
download | FreeBSD-src-65d8d759b1ed37f98e49000925a5e89487cf95fd.zip FreeBSD-src-65d8d759b1ed37f98e49000925a5e89487cf95fd.tar.gz |
Implement the classification macros isfinite(), isinf(), isnan(), and
isnormal() the hard way, rather than relying on fpclassify(). This is
a lose in the sense that we need a total of 12 functions, but it is
necessary for binary compatibility because we have never bumped libm's
major version number. In particular, isinf(), isnan(), and isnanf()
were BSD libc functions before they were C99 macros, so we can't
reimplement them in terms of fpclassify() without adding a dependency
on libc.so.5. I have tried to arrange things so that programs that
could be compiled in FreeBSD 4.X will generate the same external
references when compiled in 5.X. At the same time, the new macros
should remain C99-compliant.
The isinf() and isnan() functions remain in libc for historical
reasons; however, I have moved the functions that implement the macros
isfinite() and isnormal() to libm where they belong. Moreover,
half a dozen MD versions of isinf() and isnan() have been replaced
with MI versions that work equally well.
Prodded by: kris
Diffstat (limited to 'lib/libc/i386/gen')
-rw-r--r-- | lib/libc/i386/gen/Makefile.inc | 2 | ||||
-rw-r--r-- | lib/libc/i386/gen/isinf.c | 75 |
2 files changed, 1 insertions, 76 deletions
diff --git a/lib/libc/i386/gen/Makefile.inc b/lib/libc/i386/gen/Makefile.inc index 2761608..624ec54 100644 --- a/lib/libc/i386/gen/Makefile.inc +++ b/lib/libc/i386/gen/Makefile.inc @@ -2,5 +2,5 @@ # $FreeBSD$ SRCS+= _ctx_start.S _setjmp.S alloca.S fabs.S frexp.c \ - infinity.c isinf.c ldexp.c makecontext.c modf.S \ + infinity.c ldexp.c makecontext.c modf.S \ rfork_thread.S setjmp.S signalcontext.c sigsetjmp.S diff --git a/lib/libc/i386/gen/isinf.c b/lib/libc/i386/gen/isinf.c deleted file mode 100644 index 0d9cd86..0000000 --- a/lib/libc/i386/gen/isinf.c +++ /dev/null @@ -1,75 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. - */ - -/* For binary compat; to be removed in FreeBSD 6.0. */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> - -struct IEEEdp { - u_int manl : 32; - u_int manh : 20; - u_int exp : 11; - u_int sign : 1; -}; - -int -isnan(d) - double d; -{ - union { - double v; - struct IEEEdp s; - } u; - - u.v = d; - return (u.s.exp == 2047 && (u.s.manh || u.s.manl)); -} - -int -isinf(d) - double d; -{ - union { - double v; - struct IEEEdp s; - } u; - - u.v = d; - return (u.s.exp == 2047 && !u.s.manh && !u.s.manl); -} |