added missing wrappers from glibc 2.3.6

hopefully fix bug 


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16391 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval 2006-02-14 13:06:48 +00:00
parent 3648c6cea4
commit 162972f5f2
53 changed files with 2742 additions and 1 deletions

@ -0,0 +1,30 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include "math_private.h"
double
__ieee754_exp10 (double arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_exp (M_LN10 * arg);
}

@ -0,0 +1,30 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include "math_private.h"
float
__ieee754_exp10f (float arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_expf (M_LN10 * arg);
}

@ -0,0 +1,30 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include "math_private.h"
long double
__ieee754_exp10l (long double arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_expl (M_LN10l * arg);
}

@ -0,0 +1,130 @@
/* Double-precision floating point 2^x.
Copyright (C) 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <geoffk@ozemail.com.au>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/* The basic design here is from
Shmuel Gal and Boris Bachelis, "An Accurate Elementary Mathematical
Library for the IEEE Floating Point Standard", ACM Trans. Math. Soft.,
17 (1), March 1991, pp. 26-45.
It has been slightly modified to compute 2^x instead of e^x.
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>
#include "t_exp2.h"
static const volatile double TWO1023 = 8.988465674311579539e+307;
static const volatile double TWOM1000 = 9.3326361850321887899e-302;
double
__ieee754_exp2 (double x)
{
static const double himark = (double) DBL_MAX_EXP;
static const double lomark = (double) (DBL_MIN_EXP - DBL_MANT_DIG - 1);
/* Check for usual case. */
if (isless (x, himark) && isgreaterequal (x, lomark))
{
static const double THREEp42 = 13194139533312.0;
int tval, unsafe;
double rx, x22, result;
union ieee754_double ex2_u, scale_u;
fenv_t oldenv;
feholdexcept (&oldenv);
#ifdef FE_TONEAREST
/* If we don't have this, it's too bad. */
fesetround (FE_TONEAREST);
#endif
/* 1. Argument reduction.
Choose integers ex, -256 <= t < 256, and some real
-1/1024 <= x1 <= 1024 so that
x = ex + t/512 + x1.
First, calculate rx = ex + t/512. */
rx = x + THREEp42;
rx -= THREEp42;
x -= rx; /* Compute x=x1. */
/* Compute tval = (ex*512 + t)+256.
Now, t = (tval mod 512)-256 and ex=tval/512 [that's mod, NOT %; and
/-round-to-nearest not the usual c integer /]. */
tval = (int) (rx * 512.0 + 256.0);
/* 2. Adjust for accurate table entry.
Find e so that
x = ex + t/512 + e + x2
where -1e6 < e < 1e6, and
(double)(2^(t/512+e))
is accurate to one part in 2^-64. */
/* 'tval & 511' is the same as 'tval%512' except that it's always
positive.
Compute x = x2. */
x -= exp2_deltatable[tval & 511];
/* 3. Compute ex2 = 2^(t/512+e+ex). */
ex2_u.d = exp2_accuratetable[tval & 511];
tval >>= 9;
unsafe = abs(tval) >= -DBL_MIN_EXP - 1;
ex2_u.ieee.exponent += tval >> unsafe;
scale_u.d = 1.0;
scale_u.ieee.exponent += tval - (tval >> unsafe);
/* 4. Approximate 2^x2 - 1, using a fourth-degree polynomial,
with maximum error in [-2^-10-2^-30,2^-10+2^-30]
less than 10^-19. */
x22 = (((.0096181293647031180
* x + .055504110254308625)
* x + .240226506959100583)
* x + .69314718055994495) * ex2_u.d;
/* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */
fesetenv (&oldenv);
result = x22 * x + ex2_u.d;
if (!unsafe)
return result;
else
return result * scale_u.d;
}
/* Exceptional cases: */
else if (isless (x, himark))
{
if (__isinf (x))
/* e^-inf == 0, with no error. */
return 0;
else
/* Underflow */
return TWOM1000 * TWOM1000;
}
else
/* Return x, if x is a NaN or Inf; or overflow, otherwise. */
return TWO1023*x;
}

@ -0,0 +1,128 @@
/* Single-precision floating point 2^x.
Copyright (C) 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Geoffrey Keating <geoffk@ozemail.com.au>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/* The basic design here is from
Shmuel Gal and Boris Bachelis, "An Accurate Elementary Mathematical
Library for the IEEE Floating Point Standard", ACM Trans. Math. Soft.,
17 (1), March 1991, pp. 26-45.
It has been slightly modified to compute 2^x instead of e^x, and for
single-precision.
*/
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>
#include "t_exp2f.h"
static const volatile float TWOM100 = 7.88860905e-31;
static const volatile float TWO127 = 1.7014118346e+38;
float
__ieee754_exp2f (float x)
{
static const float himark = (float) FLT_MAX_EXP;
static const float lomark = (float) (FLT_MIN_EXP - FLT_MANT_DIG - 1);
/* Check for usual case. */
if (isless (x, himark) && isgreaterequal (x, lomark))
{
static const float THREEp14 = 49152.0;
int tval, unsafe;
float rx, x22, result;
union ieee754_float ex2_u, scale_u;
fenv_t oldenv;
feholdexcept (&oldenv);
#ifdef FE_TONEAREST
/* If we don't have this, it's too bad. */
fesetround (FE_TONEAREST);
#endif
/* 1. Argument reduction.
Choose integers ex, -128 <= t < 128, and some real
-1/512 <= x1 <= 1/512 so that
x = ex + t/512 + x1.
First, calculate rx = ex + t/256. */
rx = x + THREEp14;
rx -= THREEp14;
x -= rx; /* Compute x=x1. */
/* Compute tval = (ex*256 + t)+128.
Now, t = (tval mod 256)-128 and ex=tval/256 [that's mod, NOT %; and
/-round-to-nearest not the usual c integer /]. */
tval = (int) (rx * 256.0f + 128.0f);
/* 2. Adjust for accurate table entry.
Find e so that
x = ex + t/256 + e + x2
where -7e-4 < e < 7e-4, and
(float)(2^(t/256+e))
is accurate to one part in 2^-64. */
/* 'tval & 255' is the same as 'tval%256' except that it's always
positive.
Compute x = x2. */
x -= __exp2f_deltatable[tval & 255];
/* 3. Compute ex2 = 2^(t/255+e+ex). */
ex2_u.f = __exp2f_atable[tval & 255];
tval >>= 8;
unsafe = abs(tval) >= -FLT_MIN_EXP - 1;
ex2_u.ieee.exponent += tval >> unsafe;
scale_u.f = 1.0;
scale_u.ieee.exponent += tval - (tval >> unsafe);
/* 4. Approximate 2^x2 - 1, using a second-degree polynomial,
with maximum error in [-2^-9 - 2^-14, 2^-9 + 2^-14]
less than 1.3e-10. */
x22 = (.24022656679f * x + .69314736128f) * ex2_u.f;
/* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */
fesetenv (&oldenv);
result = x22 * x + ex2_u.f;
if (!unsafe)
return result;
else
return result * scale_u.f;
}
/* Exceptional cases: */
else if (isless (x, himark))
{
if (__isinff (x))
/* e^-inf == 0, with no error. */
return 0;
else
/* Underflow */
return TWOM100 * TWOM100;
}
else
/* Return x, if x is a NaN or Inf; or overflow, otherwise. */
return TWO127*x;
}

@ -0,0 +1,130 @@
/* Adapted for log2 by Ulrich Drepper <drepper@cygnus.com>. */
/*
* ====================================================
* 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.
* ====================================================
*/
/* __ieee754_log2(x)
* Return the logarithm to base 2 of x
*
* Method :
* 1. Argument Reduction: find k and f such that
* x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* 2. Approximation of log(1+f).
* Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
* = 2s + 2/3 s**3 + 2/5 s**5 + .....,
* = 2s + s*R
* We use a special Reme algorithm on [0,0.1716] to generate
* a polynomial of degree 14 to approximate R The maximum error
* of this polynomial approximation is bounded by 2**-58.45. In
* other words,
* 2 4 6 8 10 12 14
* R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s
* (the values of Lg1 to Lg7 are listed in the program)
* and
* | 2 14 | -58.45
* | Lg1*s +...+Lg7*s - R(z) | <= 2
* | |
* Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
* In order to guarantee error in log below 1ulp, we compute log
* by
* log(1+f) = f - s*(f - R) (if f is not too large)
* log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)
*
* 3. Finally, log(x) = k + log(1+f).
* = k+(f-(hfsq-(s*(hfsq+R))))
*
* Special cases:
* log2(x) is NaN with signal if x < 0 (including -INF) ;
* log2(+INF) is +INF; log(0) is -INF with signal;
* log2(NaN) is that NaN with no signal.
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
static const double
#else
static double
#endif
ln2 = 0.69314718055994530942,
two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */
Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
#ifdef __STDC__
static const double zero = 0.0;
#else
static double zero = 0.0;
#endif
#ifdef __STDC__
double __ieee754_log2(double x)
#else
double __ieee754_log2(x)
double x;
#endif
{
double hfsq,f,s,z,R,w,t1,t2,dk;
int32_t k,hx,i,j;
u_int32_t lx;
EXTRACT_WORDS(hx,lx,x);
k=0;
if (hx < 0x00100000) { /* x < 2**-1022 */
if (((hx&0x7fffffff)|lx)==0)
return -two54/(x-x); /* log(+-0)=-inf */
if (hx<0) return (x-x)/(x-x); /* log(-#) = NaN */
k -= 54; x *= two54; /* subnormal number, scale up x */
GET_HIGH_WORD(hx,x);
}
if (hx >= 0x7ff00000) return x+x;
k += (hx>>20)-1023;
hx &= 0x000fffff;
i = (hx+0x95f64)&0x100000;
SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */
k += (i>>20);
dk = (double) k;
f = x-1.0;
if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */
if(f==zero) return dk;
R = f*f*(0.5-0.33333333333333333*f);
return dk-(R-f)/ln2;
}
s = f/(2.0+f);
z = s*s;
i = hx-0x6147a;
w = z*z;
j = 0x6b851-hx;
t1= w*(Lg2+w*(Lg4+w*Lg6));
t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
i |= j;
R = t2+t1;
if(i>0) {
hfsq=0.5*f*f;
return dk-((hfsq-(s*(hfsq+R)))-f)/ln2;
} else {
return dk-((s*(f-R))-f)/ln2;
}
}

@ -0,0 +1,90 @@
/* e_logf.c -- float version of e_log.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
* adapted for log2 by Ulrich Drepper <drepper@cygnus.com>
*/
/*
* ====================================================
* 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 "math.h"
#include "math_private.h"
#ifdef __STDC__
static const float
#else
static float
#endif
ln2 = 0.69314718055994530942,
two25 = 3.355443200e+07, /* 0x4c000000 */
Lg1 = 6.6666668653e-01, /* 3F2AAAAB */
Lg2 = 4.0000000596e-01, /* 3ECCCCCD */
Lg3 = 2.8571429849e-01, /* 3E924925 */
Lg4 = 2.2222198546e-01, /* 3E638E29 */
Lg5 = 1.8183572590e-01, /* 3E3A3325 */
Lg6 = 1.5313838422e-01, /* 3E1CD04F */
Lg7 = 1.4798198640e-01; /* 3E178897 */
#ifdef __STDC__
static const float zero = 0.0;
#else
static float zero = 0.0;
#endif
#ifdef __STDC__
float __ieee754_log2f(float x)
#else
float __ieee754_log2f(x)
float x;
#endif
{
float hfsq,f,s,z,R,w,t1,t2,dk;
int32_t k,ix,i,j;
GET_FLOAT_WORD(ix,x);
k=0;
if (ix < 0x00800000) { /* x < 2**-126 */
if ((ix&0x7fffffff)==0)
return -two25/(x-x); /* log(+-0)=-inf */
if (ix<0) return (x-x)/(x-x); /* log(-#) = NaN */
k -= 25; x *= two25; /* subnormal number, scale up x */
GET_FLOAT_WORD(ix,x);
}
if (ix >= 0x7f800000) return x+x;
k += (ix>>23)-127;
ix &= 0x007fffff;
i = (ix+(0x95f64<<3))&0x800000;
SET_FLOAT_WORD(x,ix|(i^0x3f800000)); /* normalize x or x/2 */
k += (i>>23);
dk = (float)k;
f = x-(float)1.0;
if((0x007fffff&(15+ix))<16) { /* |f| < 2**-20 */
if(f==zero) return dk;
R = f*f*((float)0.5-(float)0.33333333333333333*f);
return dk-(R-f)/ln2;
}
s = f/((float)2.0+f);
z = s*s;
i = ix-(0x6147a<<3);
w = z*z;
j = (0x6b851<<3)-ix;
t1= w*(Lg2+w*(Lg4+w*Lg6));
t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
i |= j;
R = t2+t1;
if(i>0) {
hfsq=(float)0.5*f*f;
return dk-((hfsq-(s*(hfsq+R)))-f)/ln2;
} else {
return dk-((s*(f-R))-f)/ln2;
}
}

@ -0,0 +1,47 @@
/* w_acoshl.c -- long double version of w_acosh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper acoshl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __acoshl(long double x) /* wrapper acosh */
#else
long double __acoshl(x) /* wrapper acosh */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_acoshl(x);
#else
long double z;
z = __ieee754_acoshl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(x<1.0) {
return __kernel_standard(x,x,229); /* acoshl(x<1) */
} else
return z;
#endif
}
weak_alias (__acoshl, acoshl)

@ -0,0 +1,48 @@
/* w_acosl.c -- long double version of w_acos.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrap_acosl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __acosl(long double x) /* wrapper acos */
#else
long double __acosl(x) /* wrapper acos */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_acosl(x);
#else
long double z;
z = __ieee754_acosl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>1.0) {
return __kernel_standard(x,x,201); /* acosl(|x|>1) */
} else
return z;
#endif
}
weak_alias (__acosl, acosl)

@ -0,0 +1,49 @@
/* @(#)w_asin.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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: w_asin.c,v 1.6 1995/05/10 20:48:35 jtc Exp $";
#endif
/*
* wrapper asin(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
double __asin(double x) /* wrapper asin */
#else
double __asin(x) /* wrapper asin */
double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_asin(x);
#else
double z;
z = __ieee754_asin(x);
if(_LIB_VERSION == _IEEE_ || __isnan(x)) return z;
if(fabs(x)>1.0) {
return __kernel_standard(x,x,2); /* asin(|x|>1) */
} else
return z;
#endif
}
weak_alias (__asin, asin)
#ifdef NO_LONG_DOUBLE
strong_alias (__asin, __asinl)
weak_alias (__asin, asinl)
#endif

@ -0,0 +1,49 @@
/* w_asinf.c -- float version of w_asin.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: w_asinf.c,v 1.3 1995/05/10 20:48:37 jtc Exp $";
#endif
/*
* wrapper asinf(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
float __asinf(float x) /* wrapper asinf */
#else
float __asinf(x) /* wrapper asinf */
float x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_asinf(x);
#else
float z;
z = __ieee754_asinf(x);
if(_LIB_VERSION == _IEEE_ || __isnanf(x)) return z;
if(fabsf(x)>(float)1.0) {
/* asinf(|x|>1) */
return (float)__kernel_standard((double)x,(double)x,102);
} else
return z;
#endif
}
weak_alias (__asinf, asinf)

@ -0,0 +1,49 @@
/* w_asinl.c -- long double version of w_asin.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper asinl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __asinl(long double x) /* wrapper asinl */
#else
long double __asinl(x) /* wrapper asinl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_asinl(x);
#else
long double z;
z = __ieee754_asinl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>1.0) {
return __kernel_standard(x,x,202); /* asinl(|x|>1) */
} else
return z;
#endif
}
weak_alias (__asinl, asinl)

@ -0,0 +1,47 @@
/* w_atan2l.c -- long double version of w_atan2.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper atan2l(y,x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __atan2l(long double y, long double x) /* wrapper atan2l */
#else
long double __atan2l(y,x) /* wrapper atan2l */
long double y,x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_atan2l(y,x);
#else
long double z;
z = __ieee754_atan2l(y,x);
if(_LIB_VERSION != _SVID_||__isnanl(x)||__isnanl(y)) return z;
if(x==0.0&&y==0.0)
return __kernel_standard(y,x,203); /* atan2(+-0,+-0) */
return z;
#endif
}
weak_alias (__atan2l, atan2l)

@ -0,0 +1,52 @@
/* w_atanhl.c -- long double version of w_atanh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper atanhl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __atanhl(long double x) /* wrapper atanhl */
#else
long double __atanhl(x) /* wrapper atanhl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_atanhl(x);
#else
long double z,y;
z = __ieee754_atanhl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
y = fabsl(x);
if(y>=1.0) {
if(y>1.0)
return __kernel_standard(x,x,230); /* atanhl(|x|>1) */
else
return __kernel_standard(x,x,231); /* atanhl(|x|==1) */
} else
return z;
#endif
}
weak_alias (__atanhl, atanhl)

@ -0,0 +1,47 @@
/* w_acoshl.c -- long double version of w_acosh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper coshl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __coshl(long double x) /* wrapper coshl */
#else
long double __coshl(x) /* wrapper coshl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_coshl(x);
#else
long double z;
z = __ieee754_coshl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(!__finite(z) && __finite(x)) {
return __kernel_standard(x,x,205); /* cosh overflow */
} else
return z;
#endif
}
weak_alias (__coshl, coshl)

@ -0,0 +1,18 @@
/*
* dreml() wrapper for remainderl().
*
* Written by J.T. Conklin, <jtc@wimsey.com>
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
* Placed into the Public Domain, 1994.
*/
#include <math.h>
long double
__dreml(x, y)
long double x, y;
{
return __remainderl(x, y);
}
weak_alias (__dreml, dreml)

@ -0,0 +1,51 @@
/* @(#)w_exp10.c
* Conversion to exp10 by Ulrich Drepper <drepper@cygnus.com>.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
/*
* wrapper exp10(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
double __exp10(double x) /* wrapper exp10 */
#else
double __exp10(x) /* wrapper exp10 */
double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_exp10(x);
#else
double z;
z = __ieee754_exp10(x);
if(_LIB_VERSION == _IEEE_) return z;
if(!__finite(z) && __finite(x)) {
/* exp10 overflow (46) if x > 0, underflow (47) if x < 0. */
return __kernel_standard(x,x,46+!!__signbit(x));
}
return z;
#endif
}
weak_alias (__exp10, exp10)
strong_alias (__exp10, __pow10)
weak_alias (__pow10, pow10)
#ifdef NO_LONG_DOUBLE
strong_alias (__exp10, __exp10l)
weak_alias (__exp10, exp10l)
strong_alias (__exp10l, __pow10l)
weak_alias (__pow10l, pow10l)
#endif

@ -0,0 +1,46 @@
/* w_exp10f.c -- float version of w_exp10.c.
* Conversion to exp10 by Ulrich Drepper <drepper@cygnus.com>.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
/*
* wrapper expf10(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
float __exp10f(float x) /* wrapper exp10f */
#else
float __exp10f(x) /* wrapper exp10f */
float x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_exp10f(x);
#else
float z;
z = __ieee754_exp10f(x);
if(_LIB_VERSION == _IEEE_) return z;
if(!__finitef(z) && __finitef(x)) {
/* exp10f overflow (146) if x > 0, underflow (147) if x < 0. */
return (float)__kernel_standard((double) x, (double) x,
146+!!__signbitf(x));
}
return z;
#endif
}
weak_alias (__exp10f, exp10f)
strong_alias (__exp10f, __pow10f)
weak_alias (__pow10f, pow10f)

@ -0,0 +1,46 @@
/* w_exp10l.c -- long double version of w_exp10.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
/*
* wrapper exp10l(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __exp10l(long double x) /* wrapper exp10 */
#else
long double __exp10l(x) /* wrapper exp10 */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_exp10l(x);
#else
long double z;
z = __ieee754_exp10l(x);
if(_LIB_VERSION == _IEEE_) return z;
if(!__finitel(z) && __finitel(x)) {
/* exp10 overflow (246) if x > 0, underflow (247) if x < 0. */
return __kernel_standard(x,x,246+__signbitl(x));
}
return z;
#endif
}
weak_alias (__exp10l, exp10l)
strong_alias (__exp10l, __pow10l)
weak_alias (__pow10l, pow10l)

@ -0,0 +1,36 @@
/*
* wrapper exp2(x)
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const double o_threshold= (double) DBL_MAX_EXP;
static const double u_threshold= (double) (DBL_MIN_EXP - DBL_MANT_DIG - 1);
double
__exp2 (double x) /* wrapper exp2 */
{
#ifdef _IEEE_LIBM
return __ieee754_exp2 (x);
#else
double z;
z = __ieee754_exp2 (x);
if (_LIB_VERSION != _IEEE_ && __finite (x))
{
if (x > o_threshold)
/* exp2 overflow */
return __kernel_standard (x, x, 44);
else if (x <= u_threshold)
/* exp2 underflow */
return __kernel_standard (x, x, 45);
}
return z;
#endif
}
weak_alias (__exp2, exp2)
#ifdef NO_LONG_DOUBLE
strong_alias (__exp2, __expl2)
weak_alias (__exp2, expl2)
#endif

@ -0,0 +1,32 @@
/*
* wrapper exp2f(x)
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const float o_threshold= (float) FLT_MAX_EXP;
static const float u_threshold= (float) (FLT_MIN_EXP - FLT_MANT_DIG - 1);
float
__exp2f (float x) /* wrapper exp2f */
{
#ifdef _IEEE_LIBM
return __ieee754_exp2f (x);
#else
float z;
z = __ieee754_exp2f (x);
if (_LIB_VERSION != _IEEE_ && __finitef (x))
{
if (x > o_threshold)
/* exp2 overflow */
return (float) __kernel_standard ((double) x, (double) x, 144);
else if (x <= u_threshold)
/* exp2 underflow */
return (float) __kernel_standard ((double) x, (double) x, 145);
}
return z;
#endif
}
weak_alias (__exp2f, exp2f)

@ -0,0 +1,31 @@
/*
* wrapper exp2l(x)
*/
#include <float.h>
#include "math.h"
#include "math_private.h"
static const long double o_threshold = (long double) LDBL_MAX_EXP;
static const long double u_threshold
= (long double) (LDBL_MIN_EXP - LDBL_MANT_DIG - 1);
long double
__exp2l (long double x) /* wrapper exp2l */
{
#ifdef _IEEE_LIBM
return __ieee754_exp2l (x);
#else
long double z;
z = __ieee754_exp2l (x);
if (_LIB_VERSION != _IEEE_ && __finitel (x))
{
if (x > o_threshold)
return __kernel_standard (x, x, 244); /* exp2l overflow */
else if (x <= u_threshold)
return __kernel_standard (x, x, 245); /* exp2l underflow */
}
return z;
#endif
}
weak_alias (__exp2l, exp2l)

@ -0,0 +1,13 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__expl(long double x)
{
fputs ("__expl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
weak_alias (__expl, expl)

@ -0,0 +1,48 @@
/* w_fmodl.c -- long double version of w_fmod.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper fmodl(x,y)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __fmodl(long double x, long double y)/* wrapper fmodl */
#else
long double __fmodl(x,y) /* wrapper fmodl */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_fmodl(x,y);
#else
long double z;
z = __ieee754_fmodl(x,y);
if(_LIB_VERSION == _IEEE_ ||__isnanl(y)||__isnanl(x)) return z;
if(y==0.0) {
return __kernel_standard(x,y,227); /* fmod(x,0) */
} else
return z;
#endif
}
weak_alias (__fmodl, fmodl)

@ -0,0 +1,48 @@
/* w_hypotl.c -- long double version of w_hypot.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper hypotl(x,y)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __hypotl(long double x, long double y)/* wrapper hypotl */
#else
long double __hypotl(x,y) /* wrapper hypotl */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_hypotl(x,y);
#else
long double z;
z = __ieee754_hypotl(x,y);
if(_LIB_VERSION == _IEEE_) return z;
if((!__finitel(z))&&__finitel(x)&&__finitel(y))
return __kernel_standard(x,y,204); /* hypot overflow */
else
return z;
#endif
}
weak_alias (__hypotl, hypotl)

@ -0,0 +1,73 @@
/* w_j0l.c -- long double version of w_j0.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper j0l(long double x), y0l(long double x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double j0l(long double x) /* wrapper j0l */
#else
long double j0l(x) /* wrapper j0 */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_j0l(x);
#else
long double z = __ieee754_j0l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>X_TLOSS) {
return __kernel_standard(x,x,234); /* j0(|x|>X_TLOSS) */
} else
return z;
#endif
}
#ifdef __STDC__
long double y0l(long double x) /* wrapper y0l */
#else
long double y0l(x) /* wrapper y0 */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_y0l(x);
#else
long double z;
z = __ieee754_y0l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard(x,x,208);
else
/* d = zero/(x-x); */
return __kernel_standard(x,x,209);
}
if(x>X_TLOSS) {
return __kernel_standard(x,x,235); /* y0(x>X_TLOSS) */
} else
return z;
#endif
}

@ -0,0 +1,74 @@
/* w_j1l.c -- long double version of w_j1.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper of j1l,y1l
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double j1l(long double x) /* wrapper j1l */
#else
long double j1l(x) /* wrapper j1l */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_j1l(x);
#else
long double z;
z = __ieee754_j1l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(fabsl(x)>X_TLOSS) {
return __kernel_standard(x,x,236); /* j1(|x|>X_TLOSS) */
} else
return z;
#endif
}
#ifdef __STDC__
long double y1l(long double x) /* wrapper y1l */
#else
long double y1l(x) /* wrapper y1l */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_y1l(x);
#else
long double z;
z = __ieee754_y1l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard(x,x,210);
else
/* d = zero/(x-x); */
return __kernel_standard(x,x,211);
}
if(x>X_TLOSS) {
return __kernel_standard(x,x,237); /* y1(x>X_TLOSS) */
} else
return z;
#endif
}

@ -0,0 +1,96 @@
/* w_jnl.c -- long double version of w_jn.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper jn(int n, double x), yn(int n, double x)
* floating point Bessel's function of the 1st and 2nd kind
* of order n
*
* Special cases:
* y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
*
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double jnl(int n, long double x) /* wrapper jnl */
#else
long double jnl(n,x) /* wrapper jnl */
long double x; int n;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_jnl(n,x);
#else
long double z;
z = __ieee754_jnl(n,x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(fabsl(x)>X_TLOSS) {
return __kernel_standard((double)n,x,238); /* jn(|x|>X_TLOSS,n) */
} else
return z;
#endif
}
#ifdef __STDC__
long double ynl(int n, long double x) /* wrapper ynl */
#else
long double ynl(n,x) /* wrapper ynl */
long double x; int n;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_ynl(n,x);
#else
long double z;
z = __ieee754_ynl(n,x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard((double)n,x,212);
else
/* d = zero/(x-x); */
return __kernel_standard((double)n,x,213);
}
if(x>X_TLOSS) {
return __kernel_standard((double)n,x,239); /* yn(x>X_TLOSS,n) */
} else
return z;
#endif
}

@ -0,0 +1,58 @@
/* w_lgammal.c -- long double version of w_lgamma.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/* long double lgammal(long double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __ieee754_lgammal_r
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __lgammal(long double x)
#else
long double __lgammal(x)
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,&signgam);
#else
long double y;
int local_signgam = 0;
y = __ieee754_lgammal_r(x,&local_signgam);
if (_LIB_VERSION != _ISOC_)
/* ISO C99 does not define the global variable. */
signgam = local_signgam;
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,215); /* lgamma pole */
else
return __kernel_standard(x,x,214); /* lgamma overflow */
} else
return y;
#endif
}
weak_alias (__lgammal, lgammal)
strong_alias (__lgammal, __gammal)
weak_alias (__gammal, gammal)

@ -0,0 +1,52 @@
/* w_lgammal_r.c -- long double version of w_lgamma_r.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper long double lgammal_r(long double x, int *signgamp)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __lgammal_r(long double x, int *signgamp)
/* wrapper lgamma_r */
#else
long double __lgammal_r(x,signgamp) /* wrapper lgamma_r */
long double x; int *signgamp;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,signgamp);
#else
long double y;
y = __ieee754_lgammal_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,215); /* lgamma pole */
else
return __kernel_standard(x,x,214); /* lgamma overflow */
} else
return y;
#endif
}
weak_alias (__lgammal_r, lgammal_r)

@ -0,0 +1,51 @@
/* w_log10l.c -- long double version of w_log10.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper log10l(X)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __log10l(long double x) /* wrapper log10l */
#else
long double __log10l(x) /* wrapper log10l */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_log10l(x);
#else
long double z;
z = __ieee754_log10l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(x<=0.0) {
if(x==0.0)
return __kernel_standard(x,x,218); /* log10(0) */
else
return __kernel_standard(x,x,219); /* log10(x<0) */
} else
return z;
#endif
}
weak_alias (__log10l, log10l)

@ -0,0 +1,32 @@
/*
* wrapper log2(X)
*/
#include "math.h"
#include "math_private.h"
double
__log2 (double x) /* wrapper log2 */
{
#ifdef _IEEE_LIBM
return __ieee754_log2 (x);
#else
double z;
z = __ieee754_log2 (x);
if (_LIB_VERSION == _IEEE_ || __isnan (x)) return z;
if (x <= 0.0)
{
if (x == 0.0)
return __kernel_standard (x, x, 48); /* log2 (0) */
else
return __kernel_standard (x, x, 49); /* log2 (x < 0) */
}
else
return z;
#endif
}
weak_alias (__log2, log2)
#ifdef NO_LONG_DOUBLE
strong_alias (__log2, __log2l)
weak_alias (__log2, log2l)
#endif

@ -0,0 +1,30 @@
/*
* wrapper log2(X)
*/
#include "math.h"
#include "math_private.h"
float
__log2f (float x) /* wrapper log2f */
{
#ifdef _IEEE_LIBM
return __ieee754_log2f (x);
#else
float z;
z = __ieee754_log2f (x);
if (_LIB_VERSION == _IEEE_ || __isnanf (x)) return z;
if (x <= 0.0f)
{
if (x == 0.0f)
/* log2f (0) */
return __kernel_standard ((double) x, (double) x, 148);
else
/* log2f (x < 0) */
return __kernel_standard ((double) x, (double) x, 149);
}
else
return z;
#endif
}
weak_alias (__log2f, log2f)

@ -0,0 +1,28 @@
/*
* wrapper log2l(X)
*/
#include "math.h"
#include "math_private.h"
long double
__log2l (long double x) /* wrapper log2l */
{
#ifdef _IEEE_LIBM
return __ieee754_log2l (x);
#else
long double z;
z = __ieee754_log2l (x);
if (_LIB_VERSION == _IEEE_ || __isnanl (x)) return z;
if (x <= 0.0)
{
if (x == 0.0)
return __kernel_standard (x, x, 248); /* log2l (0) */
else
return __kernel_standard (x, x, 249); /* log2l (x < 0) */
}
else
return z;
#endif
}
weak_alias (__log2l, log2l)

@ -0,0 +1,48 @@
/* w_logl.c -- long double version of w_log.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper logl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __logl(long double x) /* wrapper logl */
#else
long double __logl(x) /* wrapper logl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_logl(x);
#else
long double z;
z = __ieee754_logl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) || x > 0.0) return z;
if(x==0.0)
return __kernel_standard(x,x,216); /* log(0) */
else
return __kernel_standard(x,x,217); /* log(x<0) */
#endif
}
weak_alias (__logl, logl)

@ -0,0 +1,68 @@
/* w_powl.c -- long double version of w_pow.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
/*
* wrapper powl(x,y) return x**y
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __powl(long double x, long double y)/* wrapper powl */
#else
long double __powl(x,y) /* wrapper powl */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_powl(x,y);
#else
long double z;
z=__ieee754_powl(x,y);
if(_LIB_VERSION == _IEEE_|| __isnanl(y)) return z;
if(__isnanl(x)) {
if(y==0.0)
return __kernel_standard(x,y,242); /* pow(NaN,0.0) */
else
return z;
}
if(x==0.0) {
if(y==0.0)
return __kernel_standard(x,y,220); /* pow(0.0,0.0) */
if(__finitel(y)&&y<0.0) {
if (signbit (x) && signbit (z))
return __kernel_standard(x,y,223); /* pow(-0.0,negative) */
else
return __kernel_standard(x,y,243); /* pow(+0.0,negative) */
}
return z;
}
if(!__finitel(z)) {
if(__finitel(x)&&__finitel(y)) {
if(__isnanl(z))
return __kernel_standard(x,y,224); /* pow neg**non-int */
else
return __kernel_standard(x,y,221); /* pow overflow */
}
}
if(z==0.0&&__finitel(x)&&__finitel(y))
return __kernel_standard(x,y,222); /* pow underflow */
return z;
#endif
}
weak_alias (__powl, powl)

@ -0,0 +1,48 @@
/* w_remainderl.c -- long double version of w_remainder.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper remainderl(x,p)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __remainderl(long double x, long double y)
/* wrapper remainderl */
#else
long double __remainderl(x,y) /* wrapper remainder */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_remainderl(x,y);
#else
long double z;
z = __ieee754_remainderl(x,y);
if(_LIB_VERSION == _IEEE_ || __isnanl(y)) return z;
if(y==0.0)
return __kernel_standard(x,y,228); /* remainder(x,0) */
else
return z;
#endif
}
weak_alias (__remainderl, remainderl)

@ -0,0 +1,65 @@
/* w_scalbl.c -- long double version of w_scalb.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper scalbl(long double x, long double fn) is provide for
* passing various standard test suite. One
* should use scalbnl() instead.
*/
#include "math.h"
#include "math_private.h"
#include <errno.h>
#ifdef __STDC__
#ifdef _SCALB_INT
long double __scalbl(long double x, int fn) /* wrapper scalbl */
#else
long double __scalbl(long double x, long double fn)/* wrapper scalbl */
#endif
#else
long double __scalbl(x,fn) /* wrapper scalbl */
#ifdef _SCALB_INT
long double x; int fn;
#else
long double x,fn;
#endif
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_scalbl(x,fn);
#else
long double z;
z = __ieee754_scalbl(x,fn);
if(_LIB_VERSION != _SVID_) return z;
if(!(__finitel(z)||__isnanl(z))&&__finitel(x)) {
return __kernel_standard(x,(double)fn,232); /* scalb overflow */
}
if(z==0.0&&z!=x) {
return __kernel_standard(x,(double)fn,233); /* scalb underflow */
}
#ifndef _SCALB_INT
if(!__finitel(fn)) __set_errno (ERANGE);
#endif
return z;
#endif
}
weak_alias (__scalbl, scalbl)

@ -0,0 +1,47 @@
/* w_sinhl.c -- long double version of w_sinh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper sinhl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __sinhl(long double x) /* wrapper sinhl */
#else
long double __sinhl(x) /* wrapper sinhl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_sinhl(x);
#else
long double z;
z = __ieee754_sinhl(x);
if(_LIB_VERSION == _IEEE_) return z;
if(!__finitel(z)&&__finitel(x)) {
return __kernel_standard(x,x,225); /* sinh overflow */
} else
return z;
#endif
}
weak_alias (__sinhl, sinhl)

@ -0,0 +1,47 @@
/* w_sqrtl.c -- long double version of w_sqrt.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper sqrtl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __sqrtl(long double x) /* wrapper sqrtl */
#else
long double __sqrtl(x) /* wrapper sqrtl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_sqrtl(x);
#else
long double z;
z = __ieee754_sqrtl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(x<0.0) {
return __kernel_standard(x,x,226); /* sqrt(negative) */
} else
return z;
#endif
}
weak_alias (__sqrtl, sqrtl)

@ -0,0 +1,56 @@
/* @(#)w_gamma.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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
#endif
/* double gamma(double x)
* Return the logarithm of the Gamma function of x or the Gamma function of x,
* depending on the library mode.
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
double __tgamma(double x)
#else
double __tgamma(x)
double x;
#endif
{
double y;
int local_signgam;
y = __ieee754_gamma_r(x,&local_signgam);
if (local_signgam < 0) y = -y;
#ifdef _IEEE_LIBM
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
if(!__finite(y)&&__finite(x)) {
if (x == 0.0)
return __kernel_standard(x,x,50); /* tgamma pole */
else if(__floor(x)==x&&x<0.0)
return __kernel_standard(x,x,41); /* tgamma domain */
else
return __kernel_standard(x,x,40); /* tgamma overflow */
}
return y;
#endif
}
weak_alias (__tgamma, tgamma)
#ifdef NO_LONG_DOUBLE
strong_alias (__tgamma, __tgammal)
weak_alias (__tgamma, tgammal)
#endif

@ -0,0 +1,53 @@
/* w_gammaf.c -- float version of w_gamma.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
#endif
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
float __tgammaf(float x)
#else
float __tgammaf(x)
float x;
#endif
{
float y;
int local_signgam;
y = __ieee754_gammaf_r(x,&local_signgam);
if (local_signgam < 0) y = -y;
#ifdef _IEEE_LIBM
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitef(y)&&__finitef(x)) {
if (x == (float)0.0)
/* tgammaf pole */
return (float)__kernel_standard((double)x,(double)x,150);
else if(__floorf(x)==x&&x<(float)0.0)
/* tgammaf domain */
return (float)__kernel_standard((double)x,(double)x,141);
else
/* tgammaf overflow */
return (float)__kernel_standard((double)x,(double)x,140);
}
return y;
#endif
}
weak_alias (__tgammaf, tgammaf)

@ -0,0 +1,55 @@
/* w_gammal.c -- long double version of w_gamma.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* 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.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/* long double gammal(double x)
* Return the Gamma function of x.
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __tgammal(long double x)
#else
long double __tgammal(x)
long double x;
#endif
{
long double y;
int local_signgam;
y = __ieee754_gammal_r(x,&local_signgam);
if (local_signgam < 0) y = -y;
#ifdef _IEEE_LIBM
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(x==0.0)
return __kernel_standard(x,x,250); /* tgamma pole */
else if(__floorl(x)==x&&x<0.0)
return __kernel_standard(x,x,241); /* tgamma domain */
else
return __kernel_standard(x,x,240); /* tgamma overflow */
}
return y;
#endif
}
weak_alias (__tgammal, tgammal)

@ -40,14 +40,17 @@ local genericSources =
s_round.c s_roundf.c # s_roundl.c
s_signgam.c
s_tanh.c s_tanhf.c
w_acos.c w_acosf.c # w_acosl.c
w_acosh.c w_acoshf.c # w_acoshl.c
w_asin.c w_asinf.c # w_asinl.c
w_atan2.c w_atan2f.c # w_atan2l.c
w_atanh.c w_atanhf.c # w_atanhl.c
w_cosh.c w_coshf.c # w_coshl.c
w_drem.c w_dremf.c # w_dreml.c
w_exp.c w_expf.c # w_expl.c
w_exp10.c w_exp10f.c # w_exp10l.c
w_exp2.c w_exp2f.c # w_exp2l.c
w_fmod.c w_fmodf.c # w_fmodl.c
w_hypot.c w_hypotf.c # w_hypotl.c
w_j0.c w_j0f.c
@ -57,10 +60,13 @@ local genericSources =
w_lgamma_r.c w_lgammaf_r.c
w_log.c w_logf.c # w_logl.c
w_log10.c w_log10f.c # w_log10l.c
w_log2.c w_log2f.c # w_log2l.c
w_pow.c w_powf.c # w_powl.c
w_remainder.c w_remainderf.c # w_remainderl.c
w_scalb.c w_scalbf.c # w_scalbl.c
w_sinh.c w_sinhf.c # w_sinhl.c
w_sqrt.c w_sqrtf.c # w_sqrtl.c
w_tgamma.c w_tgammaf.c # w_tgammal.c
;
MergeObject posix_gnu_arch_$(TARGET_ARCH)_other.o :
@ -84,9 +90,12 @@ MergeObject posix_gnu_arch_$(TARGET_ARCH)_e.o :
e_atan2.S e_atan2f.S e_atan2l.c
e_atanh.S e_atanhf.S e_atanhl.S
e_exp.S e_expf.S e_expl.c
e_exp2.S e_exp2f.S e_exp2l.S
e_exp10.S e_exp10f.S e_exp10l.S
e_fmod.S e_fmodf.S e_fmodl.c
e_hypot.S e_hypotf.S
e_log.S e_logf.S e_logl.S
e_log2.S e_log2f.S e_log2l.S
e_log10.S e_log10f.S e_log10l.S
e_pow.S e_powf.S e_powl.S
e_remainder.S e_remainderf.S e_remainderl.S

@ -0,0 +1,38 @@
/*
* Written by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
/* 10^x = 2^(x * log2(10)) */
ENTRY(__ieee754_exp10)
fldl 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
For the i686 the code can be written better.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
movb $0x45, %dh
andb %ah, %dh
cmpb $0x05, %dh
je 1f /* Is +-Inf, jump. */
fldl2t
fmulp /* x * log2(10) */
fld %st
frndint /* int(x * log2(10)) */
fsubr %st,%st(1) /* fract(x * log2(10)) */
fxch
f2xm1 /* 2^(fract(x * log2(10))) - 1 */
fld1
faddp /* 2^(fract(x * log2(10))) */
fscale /* e^x */
fstp %st(1)
ret
1: testl $0x200, %eax /* Test sign. */
jz 2f /* If positive, jump. */
fstp %st
fldz /* Set result to 0. */
2: ret
END (__ieee754_exp10)

@ -0,0 +1,38 @@
/*
* Written by Ulrich Drepper.
*/
#include <machine/asm.h>
/* e^x = 2^(x * log2(10)) */
ENTRY(__ieee754_exp10f)
flds 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
For the i686 the code can be written better.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
movb $0x45, %dh
andb %ah, %dh
cmpb $0x05, %dh
je 1f /* Is +-Inf, jump. */
fldl2t
fmulp /* x * log2(10) */
fld %st
frndint /* int(x * log2(10)) */
fsubr %st,%st(1) /* fract(x * log2(10)) */
fxch
f2xm1 /* 2^(fract(x * log2(10))) - 1 */
fld1
faddp /* 2^(fract(x * log2(10))) */
fscale /* e^x */
fstp %st(1)
ret
1: testl $0x200, %eax /* Test sign. */
jz 2f /* If positive, jump. */
fstp %st
fldz /* Set result to 0. */
2: ret
END (__ieee754_exp10f)

@ -0,0 +1,38 @@
/*
* Written by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
/* e^x = 2^(x * log2l(10)) */
ENTRY(__ieee754_exp10l)
fldt 4(%esp)
/* I added the following ugly construct because expl(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
For the i686 the code can be written better.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
movb $0x45, %dh
andb %ah, %dh
cmpb $0x05, %dh
je 1f /* Is +-Inf, jump. */
fldl2t
fmulp /* x * log2(10) */
fld %st
frndint /* int(x * log2(10)) */
fsubr %st,%st(1) /* fract(x * log2(10)) */
fxch
f2xm1 /* 2^(fract(x * log2(10))) - 1 */
fld1
faddp /* 2^(fract(x * log2(10))) */
fscale /* e^x */
fstp %st(1)
ret
1: testl $0x200, %eax /* Test sign. */
jz 2f /* If positive, jump. */
fstp %st
fldz /* Set result to 0. */
2: ret
END (__ieee754_exp10l)

@ -0,0 +1,37 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Adapted for exp2 by Ulrich Drepper <drepper@cygnus.com>.
* Public domain.
*/
#include <machine/asm.h>
ENTRY(__ieee754_exp2)
fldl 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
For the i686 the code can be written better.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
movb $0x45, %dh
andb %ah, %dh
cmpb $0x05, %dh
je 1f /* Is +-Inf, jump. */
fld %st
frndint /* int(x) */
fsubr %st,%st(1) /* fract(x) */
fxch
f2xm1 /* 2^(fract(x)) - 1 */
fld1
faddp /* 2^(fract(x)) */
fscale /* e^x */
fstp %st(1)
ret
1: testl $0x200, %eax /* Test sign. */
jz 2f /* If positive, jump. */
fstp %st
fldz /* Set result to 0. */
2: ret
END (__ieee754_exp2)

@ -0,0 +1,37 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Adapted for exp2 by Ulrich Drepper <drepper@cygnus.com>.
* Public domain.
*/
#include <machine/asm.h>
ENTRY(__ieee754_exp2f)
flds 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
For the i686 the code can be written better.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
movb $0x45, %dh
andb %ah, %dh
cmpb $0x05, %dh
je 1f /* Is +-Inf, jump. */
fld %st
frndint /* int(x) */
fsubr %st,%st(1) /* fract(x) */
fxch
f2xm1 /* 2^(fract(x)) - 1 */
fld1
faddp /* 2^(fract(x)) */
fscale /* e^x */
fstp %st(1)
ret
1: testl $0x200, %eax /* Test sign. */
jz 2f /* If positive, jump. */
fstp %st
fldz /* Set result to 0. */
2: ret
END (__ieee754_exp2f)

@ -0,0 +1,37 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Adapted for exp2 by Ulrich Drepper <drepper@cygnus.com>.
* Public domain.
*/
#include <machine/asm.h>
ENTRY(__ieee754_exp2l)
fldt 4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
For the i686 the code can be written better.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
movb $0x45, %dh
andb %ah, %dh
cmpb $0x05, %dh
je 1f /* Is +-Inf, jump. */
fld %st
frndint /* int(x) */
fsubr %st,%st(1) /* fract(x) */
fxch
f2xm1 /* 2^(fract(x)) - 1 */
fld1
faddp /* 2^(fract(x)) */
fscale /* e^x */
fstp %st(1)
ret
1: testl $0x200, %eax /* Test sign. */
jz 2f /* If positive, jump. */
fstp %st
fldz /* Set result to 0. */
2: ret
END (__ieee754_exp2l)

@ -0,0 +1,67 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Adapted for use as log2 by Ulrich Drepper <drepper@cygnus.com>.
* Public domain.
*
* Changed to use fyl2xp1 for values near 1, <drepper@cygnus.com>.
*/
#include <machine/asm.h>
#ifdef __ELF__
.section .rodata
#else
.text
#endif
.align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(one,@object)
one: .double 1.0
ASM_SIZE_DIRECTIVE(one)
/* It is not important that this constant is precise. It is only
a value which is known to be on the safe side for using the
fyl2xp1 instruction. */
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
#ifdef PIC
#define MO(op) op##@GOTOFF(%edx)
#else
#define MO(op) op
#endif
.text
ENTRY(__ieee754_log2)
#ifdef PIC
call 1f
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
fldl MO(one)
fldl 4(%esp) // x : 1
fxam
fnstsw
fld %st // x : x : 1
sahf
jc 3f // in case x is NaN or ±Inf
4: fsub %st(2), %st // x-1 : x : 1
fld %st // x-1 : x-1 : x : 1
fabs // |x-1| : x-1 : x : 1
fcompl MO(limit) // x-1 : x : 1
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
2: fstp %st(0) // x : 1
fyl2x // log(x)
ret
3: jp 4b // in case x is ±Inf
fstp %st(1)
fstp %st(1)
ret
END (__ieee754_log2)

@ -0,0 +1,67 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Adapted for use as log2 by Ulrich Drepper <drepper@cygnus.com>.
* Public domain.
*
* Changed to use fyl2xp1 for values near 1, <drepper@cygnus.com>.
*/
#include <machine/asm.h>
#ifdef __ELF__
.section .rodata
#else
.text
#endif
.align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(one,@object)
one: .double 1.0
ASM_SIZE_DIRECTIVE(one)
/* It is not important that this constant is precise. It is only
a value which is known to be on the safe side for using the
fyl2xp1 instruction. */
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
#ifdef PIC
#define MO(op) op##@GOTOFF(%edx)
#else
#define MO(op) op
#endif
.text
ENTRY(__ieee754_log2f)
#ifdef PIC
call 1f
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
fldl MO(one)
flds 4(%esp) // x : 1
fxam
fnstsw
fld %st // x : x : 1
sahf
jc 3f // in case x is NaN or ±Inf
4: fsub %st(2), %st // x-1 : x : 1
fld %st // x-1 : x-1 : x : 1
fabs // |x-1| : x-1 : x : 1
fcompl MO(limit) // x-1 : x : 1
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
2: fstp %st(0) // x : 1
fyl2x // log(x)
ret
3: jp 4b // in case x is ±Inf
fstp %st(1)
fstp %st(1)
ret
END (__ieee754_log2f)

@ -0,0 +1,67 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Adapted for use as log2 by Ulrich Drepper <drepper@cygnus.com>.
* Public domain.
*
* Changed to use fyl2xp1 for values near 1, <drepper@cygnus.com>.
*/
#include <machine/asm.h>
#ifdef __ELF__
.section .rodata
#else
.text
#endif
.align ALIGNARG(4)
ASM_TYPE_DIRECTIVE(one,@object)
one: .double 1.0
ASM_SIZE_DIRECTIVE(one)
/* It is not important that this constant is precise. It is only
a value which is known to be on the safe side for using the
fyl2xp1 instruction. */
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
#ifdef PIC
#define MO(op) op##@GOTOFF(%edx)
#else
#define MO(op) op
#endif
.text
ENTRY(__ieee754_log2l)
#ifdef PIC
call 1f
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
fldl MO(one)
fldt 4(%esp) // x : 1
fxam
fnstsw
fld %st // x : x : 1
sahf
jc 3f // in case x is NaN or ±Inf
4: fsub %st(2), %st // x-1 : x : 1
fld %st // x-1 : x-1 : x : 1
fabs // |x-1| : x-1 : x : 1
fcompl MO(limit) // x-1 : x : 1
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
2: fstp %st(0) // x : 1
fyl2x // log(x)
ret
3: jp 4b // in case x is ±Inf
fstp %st(1)
fstp %st(1)
ret
END (__ieee754_log2l)