Source-Changes-HG archive

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

[src/trunk]: src/lib/libm Make this work for NetBSD



details:   https://anonhg.NetBSD.org/src/rev/5c1ff9457577
branches:  trunk
changeset: 784791:5c1ff9457577
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Feb 09 20:19:13 2013 +0000

description:
Make this work for NetBSD

diffstat:

 lib/libm/Makefile            |   7 ++++---
 lib/libm/src/s_nan.c         |  24 +++++++++++++++++-------
 lib/libm/src/s_nexttowardf.c |  24 ++++++++++++++----------
 3 files changed, 35 insertions(+), 20 deletions(-)

diffs (155 lines):

diff -r 39284be1e4d5 -r 5c1ff9457577 lib/libm/Makefile
--- a/lib/libm/Makefile Sat Feb 09 19:39:01 2013 +0000
+++ b/lib/libm/Makefile Sat Feb 09 20:19:13 2013 +0000
@@ -1,4 +1,4 @@
-#  $NetBSD: Makefile,v 1.126 2013/02/03 07:13:07 matt Exp $
+#  $NetBSD: Makefile,v 1.127 2013/02/09 20:19:13 christos Exp $
 #
 #  @(#)Makefile 5.1beta 93/09/24
 #
@@ -66,7 +66,8 @@
 .endif
 .PATH: ${.CURDIR}/arch/i387
 
-COMMON_SRCS+= fenv.c s_nextafterl.c s_nexttoward.c
+COMMON_SRCS+= fenv.c s_nextafterl.c s_nexttoward.c s_nexttowardf.c \
+       s_nearbyint.c # s_nan.c
 ARCH_SRCS = e_acos.S e_asin.S e_atan2.S e_exp.S e_expf.S e_fmod.S e_log.S \
            e_logf.S e_log10.S e_log10f.S e_log2.S e_log2f.S e_remainder.S \
            e_remainderf.S e_scalb.S e_scalbf.S e_sqrt.S e_sqrtf.S s_atan.S \
@@ -75,7 +76,7 @@
            s_ilogb.S s_ilogbf.S s_ilogbl.S s_log1p.S s_log1pf.S \
            s_logb.S s_logbf.S s_logbl.S \
            s_rint.S s_rintf.S s_scalbn.S s_scalbnf.S s_significand.S \
-           s_significandf.S s_sin.S s_sinf.S s_tan.S s_tanf.S lrint.S
+           s_significandf.S s_sin.S s_sinf.S s_tan.S s_tanf.S lrint.S 
 # do not pick up the i387 asm version, it is incorrect
 s_modf.o s_modf.pico s_modf.po s_modf.d: s_modf.c
 
diff -r 39284be1e4d5 -r 5c1ff9457577 lib/libm/src/s_nan.c
--- a/lib/libm/src/s_nan.c      Sat Feb 09 19:39:01 2013 +0000
+++ b/lib/libm/src/s_nan.c      Sat Feb 09 20:19:13 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: s_nan.c,v 1.1 2013/02/09 19:37:48 christos Exp $       */
+/*     $NetBSD: s_nan.c,v 1.2 2013/02/09 20:19:13 christos Exp $       */
 
 /*-
  * Copyright (c) 2007 David Schultz
@@ -28,17 +28,27 @@
  * $FreeBSD: src/lib/msun/src/s_nan.c,v 1.2 2007/12/18 23:46:32 das Exp $
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: s_nan.c,v 1.1 2013/02/09 19:37:48 christos Exp $");
+__RCSID("$NetBSD: s_nan.c,v 1.2 2013/02/09 20:19:13 christos Exp $");
 
 #include <sys/endian.h>
 #include <ctype.h>
 #include <float.h>
 #include <math.h>
 #include <stdint.h>
-#include <strings.h>
+#include <string.h>
 
 #include "math_private.h"
 
+/* XXX: Locale? not here? in <ctype.h>? */
+static int
+digittoint(char s) {
+       if (isdigit((unsigned char)s))
+               return s - '0';
+       if (islower((unsigned char)s))
+               return s - 'a' + 10;
+       return s - 'A' + 10;
+}
+
 /*
  * Scan a string of hexadecimal digits (the format nan(3) expects) and
  * make a bit array (using the local endianness). We stop when we
@@ -51,21 +61,21 @@
  * consider valid, so we might be violating the C standard. But it's
  * impossible to use nan(3) portably anyway, so this seems good enough.
  */
-void
+static void
 _scan_nan(uint32_t *words, int num_words, const char *s)
 {
        int si;         /* index into s */
        int bitpos;     /* index into words (in bits) */
 
-       bzero(words, num_words * sizeof(uint32_t));
+       memset(words, 0, num_words * sizeof(*words));
 
        /* Allow a leading '0x'. (It's expected, but redundant.) */
        if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
                s += 2;
 
        /* Scan forwards in the string, looking for the end of the sequence. */
-       for (si = 0; isxdigit(s[si]); si++)
-               ;
+       for (si = 0; isxdigit((unsigned char)s[si]); si++)
+               continue;
 
        /* Scan backwards, filling in the bits in words[] as we go. */
 #if _BYTE_ORDER == _LITTLE_ENDIAN
diff -r 39284be1e4d5 -r 5c1ff9457577 lib/libm/src/s_nexttowardf.c
--- a/lib/libm/src/s_nexttowardf.c      Sat Feb 09 19:39:01 2013 +0000
+++ b/lib/libm/src/s_nexttowardf.c      Sat Feb 09 20:19:13 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: s_nexttowardf.c,v 1.1 2013/02/09 19:39:01 christos Exp $       */
+/*     $NetBSD: s_nexttowardf.c,v 1.2 2013/02/09 20:19:13 christos Exp $       */
 
 /*
  * ====================================================
@@ -15,35 +15,38 @@
 #if 0
 __FBSDID("$FreeBSD: src/lib/msun/src/s_nexttowardf.c,v 1.3 2011/02/10 07:38:38 das Exp $");
 #else
-__RCSID("$NetBSD: s_nexttowardf.c,v 1.1 2013/02/09 19:39:01 christos Exp $");
+__RCSID("$NetBSD: s_nexttowardf.c,v 1.2 2013/02/09 20:19:13 christos Exp $");
 #endif
 
 #include <float.h>
 
-#include "fpmath.h"
 #include "math.h"
 #include "math_private.h"
 
-#define        LDBL_INFNAN_EXP (LDBL_MAX_EXP * 2 - 1)
-
+#ifdef EXT_EXP_INFNAN
 float
 nexttowardf(float x, long double y)
 {
-       union IEEEl2bits uy;
        volatile float t;
        int32_t hx,ix;
+       union ieee_ext_u uy;
 
        GET_FLOAT_WORD(hx,x);
        ix = hx&0x7fffffff;             /* |x| */
-       uy.e = y;
+
+       memset(&u, 0, sizeof u);
+       uy.extu_ld = y;
+       uy.extu_ext.ext_frach &= ~0x80000000;
+
+        union ieee_single_u u[2];
 
        if((ix>0x7f800000) ||
-          (uy.bits.exp == LDBL_INFNAN_EXP &&
-           ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+          (uy.extu_ext.ext_exp == EXT_EXP_INFNAN &&
+           (uy.extu_ext.ext_frach | uy.extu_ext.ext_fracl) != 0)
           return x+y;  /* x or y is nan */
        if(x==y) return (float)y;               /* x=y, return y */
        if(ix==0) {                             /* x == 0 */
-           SET_FLOAT_WORD(x,(uy.bits.sign<<31)|1);/* return +-minsubnormal */
+           SET_FLOAT_WORD(x,(uy.extu_ext.ext_sign<<31)|1);/* return +-minsubnormal */
            t = x*x;
            if(t==x) return t; else return x;   /* raise underflow flag */
        }
@@ -63,3 +66,4 @@
        SET_FLOAT_WORD(x,hx);
        return x;
 }
+#endif



Home | Main Index | Thread Index | Old Index