added missing wrappers from glibc 2.3.6
hopefully fix bug #157 git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16391 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
3648c6cea4
commit
162972f5f2
src/system/libroot/posix/glibc/arch
generic
e_exp10.ce_exp10f.ce_exp10l.ce_exp2.ce_exp2f.ce_log2.ce_log2f.cw_acoshl.cw_acosl.cw_asin.cw_asinf.cw_asinl.cw_atan2l.cw_atanhl.cw_coshl.cw_dreml.cw_exp10.cw_exp10f.cw_exp10l.cw_exp2.cw_exp2f.cw_exp2l.cw_expl.cw_fmodl.cw_hypotl.cw_j0l.cw_j1l.cw_jnl.cw_lgammal.cw_lgammal_r.cw_log10l.cw_log2.cw_log2f.cw_log2l.cw_logl.cw_powl.cw_remainderl.cw_scalbl.cw_sinhl.cw_sqrtl.cw_tgamma.cw_tgammaf.cw_tgammal.c
x86
30
src/system/libroot/posix/glibc/arch/generic/e_exp10.c
Normal file
30
src/system/libroot/posix/glibc/arch/generic/e_exp10.c
Normal file
@ -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);
|
||||
}
|
30
src/system/libroot/posix/glibc/arch/generic/e_exp10f.c
Normal file
30
src/system/libroot/posix/glibc/arch/generic/e_exp10f.c
Normal file
@ -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);
|
||||
}
|
30
src/system/libroot/posix/glibc/arch/generic/e_exp10l.c
Normal file
30
src/system/libroot/posix/glibc/arch/generic/e_exp10l.c
Normal file
@ -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);
|
||||
}
|
130
src/system/libroot/posix/glibc/arch/generic/e_exp2.c
Normal file
130
src/system/libroot/posix/glibc/arch/generic/e_exp2.c
Normal file
@ -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;
|
||||
}
|
128
src/system/libroot/posix/glibc/arch/generic/e_exp2f.c
Normal file
128
src/system/libroot/posix/glibc/arch/generic/e_exp2f.c
Normal file
@ -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;
|
||||
}
|
130
src/system/libroot/posix/glibc/arch/generic/e_log2.c
Normal file
130
src/system/libroot/posix/glibc/arch/generic/e_log2.c
Normal file
@ -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;
|
||||
}
|
||||
}
|
90
src/system/libroot/posix/glibc/arch/generic/e_log2f.c
Normal file
90
src/system/libroot/posix/glibc/arch/generic/e_log2f.c
Normal file
@ -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;
|
||||
}
|
||||
}
|
47
src/system/libroot/posix/glibc/arch/generic/w_acoshl.c
Normal file
47
src/system/libroot/posix/glibc/arch/generic/w_acoshl.c
Normal file
@ -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)
|
48
src/system/libroot/posix/glibc/arch/generic/w_acosl.c
Normal file
48
src/system/libroot/posix/glibc/arch/generic/w_acosl.c
Normal file
@ -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)
|
49
src/system/libroot/posix/glibc/arch/generic/w_asin.c
Normal file
49
src/system/libroot/posix/glibc/arch/generic/w_asin.c
Normal file
@ -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
|
49
src/system/libroot/posix/glibc/arch/generic/w_asinf.c
Normal file
49
src/system/libroot/posix/glibc/arch/generic/w_asinf.c
Normal file
@ -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)
|
49
src/system/libroot/posix/glibc/arch/generic/w_asinl.c
Normal file
49
src/system/libroot/posix/glibc/arch/generic/w_asinl.c
Normal file
@ -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)
|
47
src/system/libroot/posix/glibc/arch/generic/w_atan2l.c
Normal file
47
src/system/libroot/posix/glibc/arch/generic/w_atan2l.c
Normal file
@ -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)
|
52
src/system/libroot/posix/glibc/arch/generic/w_atanhl.c
Normal file
52
src/system/libroot/posix/glibc/arch/generic/w_atanhl.c
Normal file
@ -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)
|
47
src/system/libroot/posix/glibc/arch/generic/w_coshl.c
Normal file
47
src/system/libroot/posix/glibc/arch/generic/w_coshl.c
Normal file
@ -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)
|
18
src/system/libroot/posix/glibc/arch/generic/w_dreml.c
Normal file
18
src/system/libroot/posix/glibc/arch/generic/w_dreml.c
Normal file
@ -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)
|
51
src/system/libroot/posix/glibc/arch/generic/w_exp10.c
Normal file
51
src/system/libroot/posix/glibc/arch/generic/w_exp10.c
Normal file
@ -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
|
46
src/system/libroot/posix/glibc/arch/generic/w_exp10f.c
Normal file
46
src/system/libroot/posix/glibc/arch/generic/w_exp10f.c
Normal file
@ -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)
|
46
src/system/libroot/posix/glibc/arch/generic/w_exp10l.c
Normal file
46
src/system/libroot/posix/glibc/arch/generic/w_exp10l.c
Normal file
@ -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)
|
36
src/system/libroot/posix/glibc/arch/generic/w_exp2.c
Normal file
36
src/system/libroot/posix/glibc/arch/generic/w_exp2.c
Normal file
@ -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
|
32
src/system/libroot/posix/glibc/arch/generic/w_exp2f.c
Normal file
32
src/system/libroot/posix/glibc/arch/generic/w_exp2f.c
Normal file
@ -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)
|
31
src/system/libroot/posix/glibc/arch/generic/w_exp2l.c
Normal file
31
src/system/libroot/posix/glibc/arch/generic/w_exp2l.c
Normal file
@ -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)
|
13
src/system/libroot/posix/glibc/arch/generic/w_expl.c
Normal file
13
src/system/libroot/posix/glibc/arch/generic/w_expl.c
Normal file
@ -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)
|
48
src/system/libroot/posix/glibc/arch/generic/w_fmodl.c
Normal file
48
src/system/libroot/posix/glibc/arch/generic/w_fmodl.c
Normal file
@ -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)
|
48
src/system/libroot/posix/glibc/arch/generic/w_hypotl.c
Normal file
48
src/system/libroot/posix/glibc/arch/generic/w_hypotl.c
Normal file
@ -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)
|
73
src/system/libroot/posix/glibc/arch/generic/w_j0l.c
Normal file
73
src/system/libroot/posix/glibc/arch/generic/w_j0l.c
Normal file
@ -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
|
||||
}
|
74
src/system/libroot/posix/glibc/arch/generic/w_j1l.c
Normal file
74
src/system/libroot/posix/glibc/arch/generic/w_j1l.c
Normal file
@ -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
|
||||
}
|
96
src/system/libroot/posix/glibc/arch/generic/w_jnl.c
Normal file
96
src/system/libroot/posix/glibc/arch/generic/w_jnl.c
Normal file
@ -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
|
||||
}
|
58
src/system/libroot/posix/glibc/arch/generic/w_lgammal.c
Normal file
58
src/system/libroot/posix/glibc/arch/generic/w_lgammal.c
Normal file
@ -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)
|
52
src/system/libroot/posix/glibc/arch/generic/w_lgammal_r.c
Normal file
52
src/system/libroot/posix/glibc/arch/generic/w_lgammal_r.c
Normal file
@ -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)
|
51
src/system/libroot/posix/glibc/arch/generic/w_log10l.c
Normal file
51
src/system/libroot/posix/glibc/arch/generic/w_log10l.c
Normal file
@ -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)
|
32
src/system/libroot/posix/glibc/arch/generic/w_log2.c
Normal file
32
src/system/libroot/posix/glibc/arch/generic/w_log2.c
Normal file
@ -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
|
30
src/system/libroot/posix/glibc/arch/generic/w_log2f.c
Normal file
30
src/system/libroot/posix/glibc/arch/generic/w_log2f.c
Normal file
@ -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)
|
28
src/system/libroot/posix/glibc/arch/generic/w_log2l.c
Normal file
28
src/system/libroot/posix/glibc/arch/generic/w_log2l.c
Normal file
@ -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)
|
48
src/system/libroot/posix/glibc/arch/generic/w_logl.c
Normal file
48
src/system/libroot/posix/glibc/arch/generic/w_logl.c
Normal file
@ -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)
|
68
src/system/libroot/posix/glibc/arch/generic/w_powl.c
Normal file
68
src/system/libroot/posix/glibc/arch/generic/w_powl.c
Normal file
@ -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)
|
48
src/system/libroot/posix/glibc/arch/generic/w_remainderl.c
Normal file
48
src/system/libroot/posix/glibc/arch/generic/w_remainderl.c
Normal file
@ -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)
|
65
src/system/libroot/posix/glibc/arch/generic/w_scalbl.c
Normal file
65
src/system/libroot/posix/glibc/arch/generic/w_scalbl.c
Normal file
@ -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)
|
47
src/system/libroot/posix/glibc/arch/generic/w_sinhl.c
Normal file
47
src/system/libroot/posix/glibc/arch/generic/w_sinhl.c
Normal file
@ -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)
|
47
src/system/libroot/posix/glibc/arch/generic/w_sqrtl.c
Normal file
47
src/system/libroot/posix/glibc/arch/generic/w_sqrtl.c
Normal file
@ -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)
|
56
src/system/libroot/posix/glibc/arch/generic/w_tgamma.c
Normal file
56
src/system/libroot/posix/glibc/arch/generic/w_tgamma.c
Normal file
@ -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
|
53
src/system/libroot/posix/glibc/arch/generic/w_tgammaf.c
Normal file
53
src/system/libroot/posix/glibc/arch/generic/w_tgammaf.c
Normal file
@ -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)
|
55
src/system/libroot/posix/glibc/arch/generic/w_tgammal.c
Normal file
55
src/system/libroot/posix/glibc/arch/generic/w_tgammal.c
Normal file
@ -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
|
||||
|
38
src/system/libroot/posix/glibc/arch/x86/e_exp10.S
Normal file
38
src/system/libroot/posix/glibc/arch/x86/e_exp10.S
Normal file
@ -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)
|
38
src/system/libroot/posix/glibc/arch/x86/e_exp10f.S
Normal file
38
src/system/libroot/posix/glibc/arch/x86/e_exp10f.S
Normal file
@ -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)
|
38
src/system/libroot/posix/glibc/arch/x86/e_exp10l.S
Normal file
38
src/system/libroot/posix/glibc/arch/x86/e_exp10l.S
Normal file
@ -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)
|
37
src/system/libroot/posix/glibc/arch/x86/e_exp2.S
Normal file
37
src/system/libroot/posix/glibc/arch/x86/e_exp2.S
Normal file
@ -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)
|
37
src/system/libroot/posix/glibc/arch/x86/e_exp2f.S
Normal file
37
src/system/libroot/posix/glibc/arch/x86/e_exp2f.S
Normal file
@ -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)
|
37
src/system/libroot/posix/glibc/arch/x86/e_exp2l.S
Normal file
37
src/system/libroot/posix/glibc/arch/x86/e_exp2l.S
Normal file
@ -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)
|
67
src/system/libroot/posix/glibc/arch/x86/e_log2.S
Normal file
67
src/system/libroot/posix/glibc/arch/x86/e_log2.S
Normal file
@ -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)
|
67
src/system/libroot/posix/glibc/arch/x86/e_log2f.S
Normal file
67
src/system/libroot/posix/glibc/arch/x86/e_log2f.S
Normal file
@ -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)
|
67
src/system/libroot/posix/glibc/arch/x86/e_log2l.S
Normal file
67
src/system/libroot/posix/glibc/arch/x86/e_log2l.S
Normal file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user