diff --git a/liba/Makefile b/liba/Makefile index 31de8ce6f..e3659c1a2 100644 --- a/liba/Makefile +++ b/liba/Makefile @@ -65,6 +65,7 @@ liba_src += $(addprefix liba/src/external/openbsd/, \ s_frexp.c \ s_log1pf.c \ s_logb.c \ + s_logbf.c \ s_modf.c \ s_modff.c \ s_rint.c \ diff --git a/liba/src/external/openbsd/s_logbf.c b/liba/src/external/openbsd/s_logbf.c new file mode 100644 index 000000000..f8b1e25f3 --- /dev/null +++ b/liba/src/external/openbsd/s_logbf.c @@ -0,0 +1,42 @@ +/* s_logbf.c -- float version of s_logb.c. + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Taken from openlibm at 5b0e7e981321687ac0abe711fdeb30adcd9da932 and + * modified for Numworks Epsilon by Neven Sajko + */ + +/* + * ==================================================== + * 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. + * ==================================================== + */ + +//__FBSDID("$FreeBSD: src/lib/msun/src/s_logbf.c,v 1.9 2008/02/22 02:30:35 das Exp $"); + +#include "math.h" + +#include "math_private.h" + +static const float +two25 = 3.355443200e+07; /* 0x4c000000 */ + +float +logbf(float x) +{ + int32_t ix; + GET_FLOAT_WORD(ix,x); + ix &= 0x7fffffff; /* high |x| */ + if(ix==0) return (float)-1.0/fabsf(x); + if(ix>=0x7f800000) return x*x; + if(ix<0x00800000) { + x *= two25; /* convert subnormal x to normal */ + GET_FLOAT_WORD(ix,x); + ix &= 0x7fffffff; + return (float) ((ix>>23)-127-25); + } else + return (float) ((ix>>23)-127); +} diff --git a/libaxx/include/cmath b/libaxx/include/cmath index 6a3e3894e..5bcfbfa7b 100644 --- a/libaxx/include/cmath +++ b/libaxx/include/cmath @@ -121,12 +121,14 @@ inline constexpr float floor(float x) { return __builtin_floorf(x); } inline constexpr float fmax(float x, float y) { return __builtin_fmaxf(x, y); } inline constexpr float fmod(float x, float y) { return __builtin_fmodf(x, y); } inline constexpr float frexp(float x, int *exp) { return __builtin_frexpf(x, exp); } +inline constexpr float hypot(float x, float y) { return __builtin_hypotf(x, y); } inline constexpr float ldexp(float x, int exp) { return __builtin_ldexpf(x, exp); } inline constexpr float lgamma(float x) { return __builtin_lgammaf(x); } inline constexpr float lgamma_r(float x, int *signgamp) { return __builtin_lgammaf_r(x, signgamp); } +inline constexpr float log(float x) { return __builtin_logf(x); } inline constexpr float log1p(float x) { return __builtin_log1pf(x); } inline constexpr float log10(float x) { return __builtin_log10f(x); } -inline constexpr float log(float x) { return __builtin_logf(x); } +inline constexpr float logb(float x) { return __builtin_logbf(x); } inline constexpr float modf(float x, float *iptr) { return __builtin_modff(x, iptr); } inline constexpr float nanf(const char *tagp) { return __builtin_nanf(tagp); } inline constexpr float nearbyint(float x) { return __builtin_nearbyintf(x); }