Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libm/src commit long double SoC code from Stathis Kamperis



details:   https://anonhg.NetBSD.org/src/rev/9324f105053e
branches:  trunk
changeset: 757706:9324f105053e
user:      christos <christos%NetBSD.org@localhost>
date:      Wed Sep 15 16:12:05 2010 +0000

description:
commit long double SoC code from Stathis Kamperis

diffstat:

 lib/libm/src/s_copysignl.c  |  49 +++++++++++++++++++++++
 lib/libm/src/s_fabsl.c      |  47 ++++++++++++++++++++++
 lib/libm/src/s_nextafterl.c |  92 +++++++++++++++++++++++++++++++++++++++++++++
 lib/libm/src/s_nexttoward.c |  89 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 277 insertions(+), 0 deletions(-)

diffs (293 lines):

diff -r d644ac872385 -r 9324f105053e lib/libm/src/s_copysignl.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libm/src/s_copysignl.c        Wed Sep 15 16:12:05 2010 +0000
@@ -0,0 +1,49 @@
+/*     $NetBSD: s_copysignl.c,v 1.1 2010/09/15 16:12:05 christos Exp $ */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * 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 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>
+__RCSID("$NetBSD: s_copysignl.c,v 1.1 2010/09/15 16:12:05 christos Exp $");
+
+#include <math.h>
+#include <machine/ieee.h>
+
+/*
+ * copysignl(long double x, long double y)
+ * This function returns a value with the magnitude of x and the sign of y.
+ */
+long double
+copysignl(long double x, long double y)
+{
+       union ieee_ext_u ux, uy;
+
+       ux.extu_ld = x;
+       uy.extu_ld = y;
+
+       ux.extu_ext.ext_sign = uy.extu_ext.ext_sign;
+
+       return (ux.extu_ld);
+}
diff -r d644ac872385 -r 9324f105053e lib/libm/src/s_fabsl.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libm/src/s_fabsl.c    Wed Sep 15 16:12:05 2010 +0000
@@ -0,0 +1,47 @@
+/*     $NetBSD: s_fabsl.c,v 1.1 2010/09/15 16:12:05 christos Exp $     */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * 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 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>
+__RCSID("$NetBSD: s_fabsl.c,v 1.1 2010/09/15 16:12:05 christos Exp $");
+
+#include <math.h>
+#include <machine/ieee.h>
+
+/*
+ * fabsl(long double x)
+ * This function returns the absolute value of its argumetn x, |x|.
+ */
+long double
+fabsl(long double x)
+{
+       union ieee_ext_u ux;
+
+       ux.extu_ld = x;
+       ux.extu_ext.ext_sign = 0;
+
+       return (ux.extu_ld);
+}
diff -r d644ac872385 -r 9324f105053e lib/libm/src/s_nextafterl.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libm/src/s_nextafterl.c       Wed Sep 15 16:12:05 2010 +0000
@@ -0,0 +1,92 @@
+/*     $NetBSD: s_nextafterl.c,v 1.1 2010/09/15 16:12:05 christos Exp $        */
+
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_nextafterl.c,v 1.1 2010/09/15 16:12:05 christos Exp $");
+
+#include <float.h>
+#include <math.h>
+#include <machine/ieee.h>
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+/*
+ * IEEE functions
+ *      nextafterl(x,y)
+ *      return the next machine floating-point number of x in the
+ *      direction toward y.
+ *   Special cases:
+ *     If x == y, y shall be returned
+ *     If x or y is NaN, a NaN shall be returned
+ */
+long double
+nextafterl(long double x, long double y)
+{
+       volatile long double t;
+       union ieee_ext_u ux, uy;
+
+       ux.extu_ld = x;
+       uy.extu_ld = y;
+
+       if ((ux.extu_exp == EXT_EXP_NAN &&
+               ((ux.extu_frach &~ LDBL_NBIT)|ux.extu_fracl) != 0) ||
+           (uy.extu_exp == EXT_EXP_NAN &&
+               ((uy.extu_frach &~ LDBL_NBIT)|uy.extu_fracl) != 0))
+               return x+y;                     /* x or y is nan */
+
+       if (x == y) return y;                   /* x=y, return y */
+
+       if (x == 0.0) {
+               ux.extu_frach = 0;              /* return +-minsubnormal */
+               ux.extu_fracl = 1;
+               ux.extu_sign = uy.extu_sign;
+               t = ux.extu_ld * ux.extu_ld;
+               if (t == ux.extu_ld)
+                       return t;
+               else
+                       return ux.extu_ld;      /* raise underflow flag */
+       }
+
+       if ((x>0.0) ^ (x<y)) {                  /* x -= ulp */
+               if (ux.extu_fracl == 0) {
+                       if ((ux.extu_frach & ~LDBL_NBIT) == 0)
+                               ux.extu_exp -= 1;
+                       ux.extu_frach = (ux.extu_frach - 1) |
+                                       (ux.extu_frach & LDBL_NBIT);
+               }
+               ux.extu_fracl -= 1;
+       } else {                                /* x += ulp */
+               ux.extu_fracl += 1;
+               if (ux.extu_fracl == 0) {
+                       ux.extu_frach = (ux.extu_frach + 1) |
+                                       (ux.extu_frach & LDBL_NBIT);
+                       if ((ux.extu_frach & ~LDBL_NBIT) == 0)
+                               ux.extu_exp += 1;
+               }
+       }
+
+       if (ux.extu_exp == EXT_EXP_INF)
+               return x+x;                     /* overflow  */
+
+       if (ux.extu_exp == 0) {                 /* underflow */
+               mask_nbit_l(ux);
+               t = ux.extu_ld * ux.extu_ld;
+               if (t != ux.extu_ld)            /* raise underflow flag */
+                       return ux.extu_ld;
+       }
+
+       return ux.extu_ld;
+}
diff -r d644ac872385 -r 9324f105053e lib/libm/src/s_nexttoward.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libm/src/s_nexttoward.c       Wed Sep 15 16:12:05 2010 +0000
@@ -0,0 +1,89 @@
+/*     $NetBSD: s_nexttoward.c,v 1.1 2010/09/15 16:12:05 christos Exp $        */
+
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: s_nexttoward.c,v 1.1 2010/09/15 16:12:05 christos Exp $");
+
+/*
+ * We assume that a long double has a 15-bit exponent.  On systems
+ * where long double is the same as double, nexttoward() is an alias
+ * for nextafter(), so we don't use this routine.
+ */
+#include <float.h>
+
+#include <machine/ieee.h>
+#include "math.h"
+#include "math_private.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+/*
+ * The nexttoward() function is equivalent to nextafter() function,
+ * except that the second parameter shall have type long double and
+ * the functions shall return y converted to the type of the function
+ * if x equals y.
+ *
+ * Special cases: XXX
+ */
+double
+nexttoward(double x, long double y)
+{
+       union ieee_ext_u uy;
+       volatile double t;
+       int32_t hx, ix;
+       uint32_t lx;
+
+       EXTRACT_WORDS(hx, lx, x);
+       ix = hx & 0x7fffffff;                   /* |x| */
+       uy.extu_ld = y;
+
+       if (((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) ||
+           (uy.extu_exp == 0x7fff &&
+               ((uy.extu_frach & ~LDBL_NBIT) | uy.extu_fracl) != 0))
+               return x+y;                     /* x or y is nan */
+
+       if (x == y)
+               return (double)y;               /* x=y, return y */
+
+       if (x == 0.0) {
+               INSERT_WORDS(x, uy.extu_sign<<31, 1);   /* return +-minsubnormal */
+               t = x*x;
+               if (t == x)
+                       return t;
+               else
+                       return x;               /* raise underflow flag */
+       }
+
+       if ((hx > 0.0) ^ (x < y)) {             /* x -= ulp */
+               if (lx == 0) hx -= 1;
+               lx -= 1;
+       } else {                                /* x += ulp */
+               lx += 1;
+               if (lx == 0) hx += 1;
+       }
+       ix = hx & 0x7ff00000;
+       if (ix >= 0x7ff00000) return x+x;       /* overflow  */
+       if (ix <  0x00100000) {                 /* underflow */
+               t = x*x;
+               if (t != x) {                   /* raise underflow flag */
+                       INSERT_WORDS(y, hx, lx);
+                       return y;
+               }
+       }
+       INSERT_WORDS(x, hx, lx);
+
+       return x;
+}



Home | Main Index | Thread Index | Old Index