diff --git a/src/system/libroot/posix/glibc/arch/arm/Jamfile b/src/system/libroot/posix/glibc/arch/arm/Jamfile index deb19a0bb5..38d21d5ea0 100644 --- a/src/system/libroot/posix/glibc/arch/arm/Jamfile +++ b/src/system/libroot/posix/glibc/arch/arm/Jamfile @@ -34,11 +34,12 @@ local genericSources = s_isnan.c s_isnanf.c s_signbit.c s_signbitf.c s_signbitl.c - s_floor.c + s_floor.c s_floorf.c s_ceil.c s_ceilf.c s_modf.c w_pow.c e_pow.c slowpow.c - e_exp.c slowexp.c + w_exp.c e_exp.c slowexp.c + s_frexp.c s_expm1.c dosincos.c doasin.c sincos32.c @@ -51,10 +52,15 @@ local genericSources = e_asin.c w_asin.c e_log10.c w_log10.c e_acos.c w_acos.c - e_atan2.c w_atan2.c mpatan2.c mpatan.c mptan.c mpsqrt.c + e_atan2.c w_atan2.c mpatan2.c mpatan.c mptan.c mpsqrt.c w_sqrt.c w_sqrtf.c e_fmod.c w_fmod.c e_log.c w_log.c + e_cosh.c w_cosh.c + e_sinh.c w_sinh.c s_ldexp.c s_ldexpf.c + s_scalbnf.c s_scalbn.c + s_copysign.c + s_tanh.c ; MergeObject posix_gnu_arch_$(TARGET_ARCH)_generic.o : @@ -63,6 +69,7 @@ MergeObject posix_gnu_arch_$(TARGET_ARCH)_generic.o : MergeObject posix_gnu_arch_$(TARGET_ARCH)_others.o : e_sqrt.c + e_sqrtf.c ; MergeObjectFromObjects posix_gnu_arch_$(TARGET_ARCH).o : : diff --git a/src/system/libroot/posix/glibc/arch/arm/e_sqrtf.c b/src/system/libroot/posix/glibc/arch/arm/e_sqrtf.c new file mode 100644 index 0000000000..7648ef4bca --- /dev/null +++ b/src/system/libroot/posix/glibc/arch/arm/e_sqrtf.c @@ -0,0 +1,97 @@ +/* e_sqrtf.c -- float version of e_sqrt.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: e_sqrtf.c,v 1.4 1995/05/10 20:46:19 jtc Exp $"; +#endif + +#include "math.h" +#include "math_private.h" + +#ifdef __STDC__ +static const float one = 1.0, tiny=1.0e-30; +#else +static float one = 1.0, tiny=1.0e-30; +#endif + +#ifdef __STDC__ + float __ieee754_sqrtf(float x) +#else + float __ieee754_sqrtf(x) + float x; +#endif +{ + float z; + int32_t sign = (int)0x80000000; + int32_t ix,s,q,m,t,i; + u_int32_t r; + + GET_FLOAT_WORD(ix,x); + + /* take care of Inf and NaN */ + if((ix&0x7f800000)==0x7f800000) { + return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if(ix<=0) { + if((ix&(~sign))==0) return x;/* sqrt(+-0) = +-0 */ + else if(ix<0) + return (x-x)/(x-x); /* sqrt(-ve) = sNaN */ + } + /* normalize x */ + m = (ix>>23); + if(m==0) { /* subnormal x */ + for(i=0;(ix&0x00800000)==0;i++) ix<<=1; + m -= i-1; + } + m -= 127; /* unbias exponent */ + ix = (ix&0x007fffff)|0x00800000; + if(m&1) /* odd m, double x to make it even */ + ix += ix; + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix += ix; + q = s = 0; /* q = sqrt(x) */ + r = 0x01000000; /* r = moving bit from right to left */ + + while(r!=0) { + t = s+r; + if(t<=ix) { + s = t+r; + ix -= t; + q += r; + } + ix += ix; + r>>=1; + } + + /* use floating add to find out rounding direction */ + if(ix!=0) { + z = one-tiny; /* trigger inexact flag */ + if (z>=one) { + z = one+tiny; + if (z>one) + q += 2; + else + q += (q&1); + } + } + ix = (q>>1)+0x3f000000; + ix += (m <<23); + SET_FLOAT_WORD(z,ix); + return z; +}