Make this work for NetBSD
This commit is contained in:
parent
80388058ff
commit
ee48b743e7
@ -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 @@ COMMON_SRCS+= fenv.c
|
||||
.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 @@ ARCH_SRCS = e_acos.S e_asin.S e_atan2.S e_exp.S e_expf.S e_fmod.S e_log.S \
|
||||
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
|
||||
|
||||
|
@ -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 @@ __RCSID("$NetBSD: s_nan.c,v 1.1 2013/02/09 19:37:48 christos Exp $");
|
||||
* 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
|
||||
|
@ -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 @@ nexttowardf(float x, long double y)
|
||||
SET_FLOAT_WORD(x,hx);
|
||||
return x;
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user