diff options
author | Martynas Venckus <martynas@cvs.openbsd.org> | 2009-04-19 16:42:07 +0000 |
---|---|---|
committer | Martynas Venckus <martynas@cvs.openbsd.org> | 2009-04-19 16:42:07 +0000 |
commit | 96b4e1796d2cb7605b65d985063a6fb9490658cb (patch) | |
tree | d404964e5769cd93de29f14903d8e22c8588ec51 /lib/libc/arch/sparc64 | |
parent | 152844f11645837cb5948c638f34c527438267ab (diff) |
- ldexp implementation has issues. switch to the one from libm
- remove frexp in hppa64, cloned from hppa
- move generic ieee754 implementations of modf and ldexp to gen
ok kettenis@, "looks good" millert@
Diffstat (limited to 'lib/libc/arch/sparc64')
-rw-r--r-- | lib/libc/arch/sparc64/gen/Makefile.inc | 4 | ||||
-rw-r--r-- | lib/libc/arch/sparc64/gen/ldexp.c | 145 |
2 files changed, 2 insertions, 147 deletions
diff --git a/lib/libc/arch/sparc64/gen/Makefile.inc b/lib/libc/arch/sparc64/gen/Makefile.inc index 5ae927d7383..95bc28135ac 100644 --- a/lib/libc/arch/sparc64/gen/Makefile.inc +++ b/lib/libc/arch/sparc64/gen/Makefile.inc @@ -1,6 +1,6 @@ -# $OpenBSD: Makefile.inc,v 1.7 2008/12/09 19:52:34 martynas Exp $ +# $OpenBSD: Makefile.inc,v 1.8 2009/04/19 16:42:06 martynas Exp $ -SRCS+= _setjmp.S fabs.S infinity.c ldexp.c modf.S nan.c +SRCS+= _setjmp.S fabs.S infinity.c modf.S nan.c SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \ fpsetround.c fpsetsticky.c SRCS+= fpclassifyl.c isfinitel.c isinfl.c isnanl.c isnormall.c signbitl.c diff --git a/lib/libc/arch/sparc64/gen/ldexp.c b/lib/libc/arch/sparc64/gen/ldexp.c deleted file mode 100644 index aa7ea600734..00000000000 --- a/lib/libc/arch/sparc64/gen/ldexp.c +++ /dev/null @@ -1,145 +0,0 @@ -/* $OpenBSD: ldexp.c,v 1.2 2008/06/26 05:42:05 ray Exp $ */ -/* $NetBSD: ldexp.c,v 1.8 1999/08/30 18:28:26 mycroft Exp $ */ - -/*- - * Copyright (c) 1999 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum. - * - * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -#include <sys/cdefs.h> - -#include <sys/types.h> -#include <machine/ieee.h> -#include <errno.h> -#include <math.h> - -/* - * Multiply the given value by 2^exp. - */ -double -ldexp(val, exp) - double val; - int exp; -{ - register int oldexp, newexp; - union { - double v; - struct ieee_double s; - } u, mul; - - u.v = val; - oldexp = u.s.dbl_exp; - - /* - * If input is zero, Inf or NaN, just return it. - */ - if (u.v == 0.0 || oldexp == DBL_EXP_INFNAN) - return (val); - - if (oldexp == 0) { - /* - * u.v is denormal. We must adjust it so that the exponent - * arithmetic below will work. - */ - if (exp <= DBL_EXP_BIAS) { - /* - * Optimization: if the scaling can be done in a single - * multiply, or underflows, just do it now. - */ - if (exp <= -DBL_FRACBITS) { - errno = ERANGE; - return (0.0); - } - mul.v = 0.0; - mul.s.dbl_exp = exp + DBL_EXP_BIAS; - u.v *= mul.v; - if (u.v == 0.0) { - errno = ERANGE; - return (0.0); - } - return (u.v); - } else { - /* - * We know that exp is very large, and therefore the - * result cannot be denormal (though it may be Inf). - * Shift u.v by just enough to make it normal. - */ - mul.v = 0.0; - mul.s.dbl_exp = DBL_FRACBITS + DBL_EXP_BIAS; - u.v *= mul.v; - exp -= DBL_FRACBITS; - oldexp = u.s.dbl_exp; - } - } - - /* - * u.v is now normalized and oldexp has been adjusted if necessary. - * Calculate the new exponent and check for underflow and overflow. - */ - newexp = oldexp + exp; - - if (newexp <= 0) { - /* - * The output number is either denormal or underflows (see - * comments in machine/ieee.h). - */ - if (newexp <= -DBL_FRACBITS) { - errno = ERANGE; - return (0.0); - } - /* - * Denormalize the result. We do this with a multiply. If exp - * is very large, it won't fit in a double, so we have to - * adjust the exponent first. This is safe because we know - * that u.v is normal at this point. - */ - if (exp <= -DBL_EXP_BIAS) { - u.s.dbl_exp = 1; - exp += oldexp - 1; - } - mul.v = 0.0; - mul.s.dbl_exp = exp + DBL_EXP_BIAS; - u.v *= mul.v; - return (u.v); - } else if (newexp >= DBL_EXP_INFNAN) { - /* - * The result overflowed; return +/-Inf. - */ - u.s.dbl_exp = DBL_EXP_INFNAN; - u.s.dbl_frach = 0; - u.s.dbl_fracl = 0; - errno = ERANGE; - return (u.v); - } else { - /* - * The result is normal; just replace the old exponent with the - * new one. - */ - u.s.dbl_exp = newexp; - return (u.v); - } -} |