diff options
author | Dan Albert <danalbert@google.com> | 2017-06-30 13:44:31 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2017-06-30 16:54:46 -0700 |
commit | 8127c9619e2a497a58e6db62df9916e4c4864608 (patch) | |
tree | 671f85365d4497a827e723ed6fbb2d56ff098490 /sources | |
parent | b04b1a2e39477518e963daaec34fffcb69852c04 (diff) | |
download | ndk-8127c9619e2a497a58e6db62df9916e4c4864608.tar.gz |
Replace libandroid_support math code with bionic's.
Some of this was from musl, some was from bionic, but the bionic code
is likely out of date. Pull it all from bionic.
Test: ./run_tests.py
Bug: https://github.com/android-ndk/ndk/issues/300
Change-Id: Iff9d65c4ad21f91f5fa05724c50005bf6d40f2aa
Diffstat (limited to 'sources')
18 files changed, 64 insertions, 1754 deletions
diff --git a/sources/android/support/Android.mk b/sources/android/support/Android.mk index 2d023c833..291d07a48 100644 --- a/sources/android/support/Android.mk +++ b/sources/android/support/Android.mk @@ -21,6 +21,11 @@ include $(PREBUILT_STATIC_LIBRARY) else # Building android_support_c_includes := $(android_support_export_c_includes) +android_support_cflags := \ + -Drestrict=__restrict__ \ + -ffunction-sections \ + -fdata-sections \ + -fvisibility=hidden \ ifeq ($(is_lp64),true) # 64-bit ABIs @@ -37,7 +42,15 @@ else BIONIC_PATH := ../../../../bionic -android_support_c_includes += $(BIONIC_PATH)/libc +android_support_c_includes += \ + $(BIONIC_PATH)/libc \ + $(BIONIC_PATH)/libm \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src \ + $(BIONIC_PATH)/libm/upstream-freebsd/android/include \ + +android_support_cflags += \ + -include freebsd-compat.h \ + -D_BSD_SOURCE \ android_support_sources := \ $(BIONIC_PATH)/libc/bionic/c32rtomb.cpp \ @@ -45,6 +58,46 @@ android_support_sources := \ $(BIONIC_PATH)/libc/bionic/mbstate.cpp \ $(BIONIC_PATH)/libc/bionic/wchar.cpp \ $(BIONIC_PATH)/libc/upstream-openbsd/lib/libc/locale/mbtowc.c \ + $(BIONIC_PATH)/libm/digittoint.c \ + $(BIONIC_PATH)/libm/fake_long_double.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_acos.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_acosh.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_asin.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_atan2.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_atanh.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_cosh.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_exp.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_hypot.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_lgamma.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_log.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_log10.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_log2.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_logf.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_remainder.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_sinh.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/e_sqrt.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/imprecise.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/k_cos.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/k_exp.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/k_rem_pio2.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/k_sin.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/k_tan.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_asinh.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_atan.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_cbrt.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_cos.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_erf.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_exp2.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_expm1.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_log1p.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_logb.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_nan.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_nextafter.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_remquo.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_rint.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_sin.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_tan.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_tanh.c \ src/_Exit.cpp \ src/iswblank.cpp \ src/posix_memalign.cpp \ @@ -58,13 +111,6 @@ android_support_sources += \ src/locale/localeconv.c \ src/locale/newlocale.c \ src/locale/uselocale.c \ - src/math_support.c \ - src/msun/e_log2.c \ - src/msun/e_log2f.c \ - src/msun/s_nan.c \ - src/musl-math/frexp.c \ - src/musl-math/frexpf.c \ - src/musl-math/frexpl.c \ src/wchar_support.c \ src/wcstox/floatscan.c \ src/wcstox/intscan.c \ @@ -72,13 +118,18 @@ android_support_sources += \ src/wcstox/wcstod.c \ src/wcstox/wcstol.c \ +ifneq (armeabi,$(TARGET_ARCH_ABI)) +# The file uses instructions that aren't available in arm5. +android_support_sources += \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_nearbyint.c \ + +endif + # Replaces broken implementations in x86 libm.so ifeq (x86,$(TARGET_ARCH_ABI)) android_support_sources += \ - src/musl-math/scalbln.c \ - src/musl-math/scalblnf.c \ - src/musl-math/scalblnl.c \ - src/musl-math/scalbnl.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_scalbln.c \ + $(BIONIC_PATH)/libm/upstream-freebsd/lib/msun/src/s_scalbn.c \ endif @@ -89,11 +140,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := android_support LOCAL_SRC_FILES := $(android_support_sources) LOCAL_C_INCLUDES := $(android_support_c_includes) -LOCAL_CFLAGS := \ - -Drestrict=__restrict__ \ - -ffunction-sections \ - -fdata-sections \ - -fvisibility=hidden \ +LOCAL_CFLAGS := $(android_support_cflags) LOCAL_CPPFLAGS := \ -fvisibility-inlines-hidden \ diff --git a/sources/android/support/src/math_support.c b/sources/android/support/src/math_support.c deleted file mode 100644 index 24cdade03..000000000 --- a/sources/android/support/src/math_support.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <math.h> -#include <assert.h> - -/* Any 64-bit Android math library should provide these functions, - * so these wrappers are only needed for 32-bit systems. - */ -#ifndef __LP64__ - -/* - * On 32-bit Android, long double and double are identical, hence - * nexttoward is the same as nextafter. - */ - -__attribute__((weak)) double nexttoward(double d, long double td) { - return nextafter(d, (double)td); -} - -__attribute__((weak)) float nexttowardf(float f, long double td) { - return nextafterf(f, (float)td); -} - -__attribute__((weak)) long double nexttowardl(long double ld, long double td) { - return nextafter((double)ld, (double)td); -} - -__attribute__((weak)) long double acosl(long double x) { return acos((double)x); } -__attribute__((weak)) long double asinl(long double x) { return asin((double)x); } -__attribute__((weak)) long double atanl(long double x) { return atan((double)x); } -__attribute__((weak)) long double atan2l(long double x, long double y) { return atan2((double)x, (double)y); } -__attribute__((weak)) long double cosl(long double x) { return cos((double)x); } -__attribute__((weak)) long double coshl(long double x) { return cosh((double)x); } -__attribute__((weak)) long double expl(long double x) { return exp((double)x); } -__attribute__((weak)) long double fmodl(long double x, long double y) { return fmod((double)x, (double)y); } -__attribute__((weak)) long double powl(long double x, long double y) { return pow((double)x, (double)y); } -__attribute__((weak)) long double sinl(long double x) { return sin((double)x); } -__attribute__((weak)) long double sinhl(long double x) { return sinh((double)x); } -__attribute__((weak)) long double sqrtl(long double x) { return sqrt((double)x); } -__attribute__((weak)) long double tanl(long double x) { return tan((double)x); } -__attribute__((weak)) long double tanhl(long double x) { return tanh((double)x); } -__attribute__((weak)) long double acoshl(long double x) { return acosh((double)x); } -__attribute__((weak)) long double asinhl(long double x) { return asinh((double)x); } -__attribute__((weak)) long double atanhl(long double x) { return atanh((double)x); } -__attribute__((weak)) long double cbrtl(long double x) { return cbrt((double)x); } -__attribute__((weak)) long double erfl(long double x) { return erf((double)x); } -__attribute__((weak)) long double erfcl(long double x) { return erfc((double)x); } -__attribute__((weak)) long double expm1l(long double x) { return expm1((double)x); } -__attribute__((weak)) long double hypotl(long double x, long double y) { return hypot((double)x, (double)y); } -__attribute__((weak)) long double lgammal(long double x) { return lgamma((double)x); } -__attribute__((weak)) long long int llrintl(long double x) { return llrint((double)x); } -__attribute__((weak)) long double logl(long double x) { return log((double)x); } -__attribute__((weak)) long double log1pl(long double x) { return log1p((double)x); } -__attribute__((weak)) long double log2l(long double x) { return log2((double)x); } -__attribute__((weak)) long double logbl(long double x) { return logb((double)x); } -__attribute__((weak)) long double log10l(long double x) { return log10((double)x); } -__attribute__((weak)) long double nanl(const char* s) { return nan(s); } -__attribute__((weak)) long double nearbyintl(long double x) { return nearbyint((double)x); } -__attribute__((weak)) long double remainderl(long double x, long double y) { return remainder((double)x, (double)y); } -__attribute__((weak)) long double remquol(long double x, long double y, int* i) { return remquo((double)x, (double)y, i); } -__attribute__((weak)) long double rintl(long double x) { return rint((double)x); } -__attribute__((weak)) long int lrintl(long double x) { return lrint((double)x); } -__attribute__((weak)) long double tgammal(long double x) { return tgamma((double)x); } -__attribute__((weak)) long double modfl(long double x, long double* y) { return modf((double)x, (double *)y); } -__attribute__((weak)) long double exp2l(long double x) { return exp2((double)x); } - -#endif // !__LP64__ diff --git a/sources/android/support/src/msun/e_log2.c b/sources/android/support/src/msun/e_log2.c deleted file mode 100644 index 94c4f84cb..000000000 --- a/sources/android/support/src/msun/e_log2.c +++ /dev/null @@ -1,120 +0,0 @@ - -/* @(#)e_log10.c 1.3 95/01/18 */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Return the base 2 logarithm of x. See e_log.c and k_log.h for most - * comments. - * - * This reduces x to {k, 1+f} exactly as in e_log.c, then calls the kernel, - * then does the combining and scaling steps - * log2(x) = (f - 0.5*f*f + k_log1p(f)) / ln2 + k - * in not-quite-routine extra precision. - */ - -#include <float.h> - -#include "math.h" -#include "math_private.h" -#include "k_log.h" - -static const double -two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ -ivln2hi = 1.44269504072144627571e+00, /* 0x3ff71547, 0x65200000 */ -ivln2lo = 1.67517131648865118353e-10; /* 0x3de705fc, 0x2eefa200 */ - -static const double zero = 0.0; -static volatile double vzero = 0.0; - -double -__ieee754_log2(double x) -{ - double f,hfsq,hi,lo,r,val_hi,val_lo,w,y; - int32_t i,k,hx; - u_int32_t lx; - - EXTRACT_WORDS(hx,lx,x); - - k=0; - if (hx < 0x00100000) { /* x < 2**-1022 */ - if (((hx&0x7fffffff)|lx)==0) - return -two54/vzero; /* log(+-0)=-inf */ - if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ - k -= 54; x *= two54; /* subnormal number, scale up x */ - GET_HIGH_WORD(hx,x); - } - if (hx >= 0x7ff00000) return x+x; - if (hx == 0x3ff00000 && lx == 0) - return zero; /* log(1) = +0 */ - 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); - y = (double)k; - f = x - 1.0; - hfsq = 0.5*f*f; - r = k_log1p(f); - - /* - * f-hfsq must (for args near 1) be evaluated in extra precision - * to avoid a large cancellation when x is near sqrt(2) or 1/sqrt(2). - * This is fairly efficient since f-hfsq only depends on f, so can - * be evaluated in parallel with R. Not combining hfsq with R also - * keeps R small (though not as small as a true `lo' term would be), - * so that extra precision is not needed for terms involving R. - * - * Compiler bugs involving extra precision used to break Dekker's - * theorem for spitting f-hfsq as hi+lo, unless double_t was used - * or the multi-precision calculations were avoided when double_t - * has extra precision. These problems are now automatically - * avoided as a side effect of the optimization of combining the - * Dekker splitting step with the clear-low-bits step. - * - * y must (for args near sqrt(2) and 1/sqrt(2)) be added in extra - * precision to avoid a very large cancellation when x is very near - * these values. Unlike the above cancellations, this problem is - * specific to base 2. It is strange that adding +-1 is so much - * harder than adding +-ln2 or +-log10_2. - * - * This uses Dekker's theorem to normalize y+val_hi, so the - * compiler bugs are back in some configurations, sigh. And I - * don't want to used double_t to avoid them, since that gives a - * pessimization and the support for avoiding the pessimization - * is not yet available. - * - * The multi-precision calculations for the multiplications are - * routine. - */ - hi = f - hfsq; - SET_LOW_WORD(hi,0); - lo = (f - hi) - hfsq + r; - val_hi = hi*ivln2hi; - val_lo = (lo+hi)*ivln2lo + lo*ivln2hi; - - /* spadd(val_hi, val_lo, y), except for not using double_t: */ - w = y + val_hi; - val_lo += (y - w) + val_hi; - val_hi = w; - - return val_lo + val_hi; -} - -#if (LDBL_MANT_DIG == 53) -#define __weak_reference(sym,alias) \ - __asm__(".weak " #alias); \ - __asm__(".equ " #alias ", " #sym) -__weak_reference(log2, log2l); -#endif diff --git a/sources/android/support/src/msun/e_log2f.c b/sources/android/support/src/msun/e_log2f.c deleted file mode 100644 index 1794484e6..000000000 --- a/sources/android/support/src/msun/e_log2f.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ==================================================== - * 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 <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Float version of e_log2.c. See the latter for most comments. - */ - -#include "math.h" -#include "math_private.h" -#include "k_logf.h" - -static const float -two25 = 3.3554432000e+07, /* 0x4c000000 */ -ivln2hi = 1.4428710938e+00, /* 0x3fb8b000 */ -ivln2lo = -1.7605285393e-04; /* 0xb9389ad4 */ - -static const float zero = 0.0; -static volatile float vzero = 0.0; - -float -__ieee754_log2f(float x) -{ - float f,hfsq,hi,lo,r,y; - int32_t i,k,hx; - - GET_FLOAT_WORD(hx,x); - - k=0; - if (hx < 0x00800000) { /* x < 2**-126 */ - if ((hx&0x7fffffff)==0) - return -two25/vzero; /* log(+-0)=-inf */ - if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ - k -= 25; x *= two25; /* subnormal number, scale up x */ - GET_FLOAT_WORD(hx,x); - } - if (hx >= 0x7f800000) return x+x; - if (hx == 0x3f800000) - return zero; /* log(1) = +0 */ - k += (hx>>23)-127; - hx &= 0x007fffff; - i = (hx+(0x4afb0d))&0x800000; - SET_FLOAT_WORD(x,hx|(i^0x3f800000)); /* normalize x or x/2 */ - k += (i>>23); - y = (float)k; - f = x - (float)1.0; - hfsq = (float)0.5*f*f; - r = k_log1pf(f); - - /* - * We no longer need to avoid falling into the multi-precision - * calculations due to compiler bugs breaking Dekker's theorem. - * Keep avoiding this as an optimization. See e_log2.c for more - * details (some details are here only because the optimization - * is not yet available in double precision). - * - * Another compiler bug turned up. With gcc on i386, - * (ivln2lo + ivln2hi) would be evaluated in float precision - * despite runtime evaluations using double precision. So we - * must cast one of its terms to float_t. This makes the whole - * expression have type float_t, so return is forced to waste - * time clobbering its extra precision. - */ - if (sizeof(float_t) > sizeof(float)) - return (r - hfsq + f) * ((float_t)ivln2lo + ivln2hi) + y; - - hi = f - hfsq; - GET_FLOAT_WORD(hx,hi); - SET_FLOAT_WORD(hi,hx&0xfffff000); - lo = (f - hi) - hfsq + r; - return (lo+hi)*ivln2lo + lo*ivln2hi + hi*ivln2hi + y; -} diff --git a/sources/android/support/src/msun/k_log.h b/sources/android/support/src/msun/k_log.h deleted file mode 100644 index aaff8bd90..000000000 --- a/sources/android/support/src/msun/k_log.h +++ /dev/null @@ -1,100 +0,0 @@ - -/* @(#)e_log.c 1.3 95/01/18 */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunSoft, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * k_log1p(f): - * Return log(1+f) - f for 1+f in ~[sqrt(2)/2, sqrt(2)]. - * - * The following describes the overall strategy for computing - * logarithms in base e. The argument reduction and adding the final - * term of the polynomial are done by the caller for increased accuracy - * when different bases are used. - * - * 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*ln2 + log(1+f). - * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) - * Here ln2 is split into two floating point number: - * ln2_hi + ln2_lo, - * where n*ln2_hi is always exact for |n| < 2000. - * - * Special cases: - * log(x) is NaN with signal if x < 0 (including -INF) ; - * log(+INF) is +INF; log(0) is -INF with signal; - * log(NaN) is that NaN with no signal. - * - * Accuracy: - * according to an error analysis, the error is always less than - * 1 ulp (unit in the last place). - * - * 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. - */ - -static const double -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 */ - -/* - * We always inline k_log1p(), since doing so produces a - * substantial performance improvement (~40% on amd64). - */ -static inline double -k_log1p(double f) -{ - double hfsq,s,z,R,w,t1,t2; - - s = f/(2.0+f); - z = s*s; - w = z*z; - t1= w*(Lg2+w*(Lg4+w*Lg6)); - t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); - R = t2+t1; - hfsq=0.5*f*f; - return s*(hfsq+R); -} diff --git a/sources/android/support/src/msun/k_logf.h b/sources/android/support/src/msun/k_logf.h deleted file mode 100644 index 71c547e88..000000000 --- a/sources/android/support/src/msun/k_logf.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ==================================================== - * 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 <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Float version of k_log.h. See the latter for most comments. - */ - -static const float -/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */ -Lg1 = 0xaaaaaa.0p-24, /* 0.66666662693 */ -Lg2 = 0xccce13.0p-25, /* 0.40000972152 */ -Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */ -Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */ - -static inline float -k_log1pf(float f) -{ - float hfsq,s,z,R,w,t1,t2; - - s = f/((float)2.0+f); - z = s*s; - w = z*z; - t1= w*(Lg2+w*Lg4); - t2= z*(Lg1+w*Lg3); - R = t2+t1; - hfsq=(float)0.5*f*f; - return s*(hfsq+R); -} diff --git a/sources/android/support/src/msun/math_private.h b/sources/android/support/src/msun/math_private.h deleted file mode 100644 index efc35daf0..000000000 --- a/sources/android/support/src/msun/math_private.h +++ /dev/null @@ -1,764 +0,0 @@ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -/* - * from: @(#)fdlibm.h 5.1 93/09/24 - * $FreeBSD$ - */ - -#ifndef _MATH_PRIVATE_H_ -#define _MATH_PRIVATE_H_ - -#include <sys/types.h> -#include <endian.h> - -/* - * The original fdlibm code used statements like: - * n0 = ((*(int*)&one)>>29)^1; * index of high word * - * ix0 = *(n0+(int*)&x); * high word of x * - * ix1 = *((1-n0)+(int*)&x); * low word of x * - * to dig two 32 bit words out of the 64 bit IEEE floating point - * value. That is non-ANSI, and, moreover, the gcc instruction - * scheduler gets it wrong. We instead use the following macros. - * Unlike the original code, we determine the endianness at compile - * time, not at run time; I don't see much benefit to selecting - * endianness at run time. - */ - -/* - * A union which permits us to convert between a double and two 32 bit - * ints. - */ - -#ifdef __arm__ -#if defined(__VFP_FP__) || defined(__ARM_EABI__) -#define IEEE_WORD_ORDER BYTE_ORDER -#else -#define IEEE_WORD_ORDER BIG_ENDIAN -#endif -#else /* __arm__ */ -#define IEEE_WORD_ORDER BYTE_ORDER -#endif - -#if IEEE_WORD_ORDER == BIG_ENDIAN - -typedef union -{ - double value; - struct - { - u_int32_t msw; - u_int32_t lsw; - } parts; - struct - { - u_int64_t w; - } xparts; -} ieee_double_shape_type; - -#endif - -#if IEEE_WORD_ORDER == LITTLE_ENDIAN - -typedef union -{ - double value; - struct - { - u_int32_t lsw; - u_int32_t msw; - } parts; - struct - { - u_int64_t w; - } xparts; -} ieee_double_shape_type; - -#endif - -/* Get two 32 bit ints from a double. */ - -#define EXTRACT_WORDS(ix0,ix1,d) \ -do { \ - ieee_double_shape_type ew_u; \ - ew_u.value = (d); \ - (ix0) = ew_u.parts.msw; \ - (ix1) = ew_u.parts.lsw; \ -} while (0) - -/* Get a 64-bit int from a double. */ -#define EXTRACT_WORD64(ix,d) \ -do { \ - ieee_double_shape_type ew_u; \ - ew_u.value = (d); \ - (ix) = ew_u.xparts.w; \ -} while (0) - -/* Get the more significant 32 bit int from a double. */ - -#define GET_HIGH_WORD(i,d) \ -do { \ - ieee_double_shape_type gh_u; \ - gh_u.value = (d); \ - (i) = gh_u.parts.msw; \ -} while (0) - -/* Get the less significant 32 bit int from a double. */ - -#define GET_LOW_WORD(i,d) \ -do { \ - ieee_double_shape_type gl_u; \ - gl_u.value = (d); \ - (i) = gl_u.parts.lsw; \ -} while (0) - -/* Set a double from two 32 bit ints. */ - -#define INSERT_WORDS(d,ix0,ix1) \ -do { \ - ieee_double_shape_type iw_u; \ - iw_u.parts.msw = (ix0); \ - iw_u.parts.lsw = (ix1); \ - (d) = iw_u.value; \ -} while (0) - -/* Set a double from a 64-bit int. */ -#define INSERT_WORD64(d,ix) \ -do { \ - ieee_double_shape_type iw_u; \ - iw_u.xparts.w = (ix); \ - (d) = iw_u.value; \ -} while (0) - -/* Set the more significant 32 bits of a double from an int. */ - -#define SET_HIGH_WORD(d,v) \ -do { \ - ieee_double_shape_type sh_u; \ - sh_u.value = (d); \ - sh_u.parts.msw = (v); \ - (d) = sh_u.value; \ -} while (0) - -/* Set the less significant 32 bits of a double from an int. */ - -#define SET_LOW_WORD(d,v) \ -do { \ - ieee_double_shape_type sl_u; \ - sl_u.value = (d); \ - sl_u.parts.lsw = (v); \ - (d) = sl_u.value; \ -} while (0) - -/* - * A union which permits us to convert between a float and a 32 bit - * int. - */ - -typedef union -{ - float value; - /* FIXME: Assumes 32 bit int. */ - unsigned int word; -} ieee_float_shape_type; - -/* Get a 32 bit int from a float. */ - -#define GET_FLOAT_WORD(i,d) \ -do { \ - ieee_float_shape_type gf_u; \ - gf_u.value = (d); \ - (i) = gf_u.word; \ -} while (0) - -/* Set a float from a 32 bit int. */ - -#define SET_FLOAT_WORD(d,i) \ -do { \ - ieee_float_shape_type sf_u; \ - sf_u.word = (i); \ - (d) = sf_u.value; \ -} while (0) - -/* - * Get expsign and mantissa as 16 bit and 64 bit ints from an 80 bit long - * double. - */ - -#define EXTRACT_LDBL80_WORDS(ix0,ix1,d) \ -do { \ - union IEEEl2bits ew_u; \ - ew_u.e = (d); \ - (ix0) = ew_u.xbits.expsign; \ - (ix1) = ew_u.xbits.man; \ -} while (0) - -/* - * Get expsign and mantissa as one 16 bit and two 64 bit ints from a 128 bit - * long double. - */ - -#define EXTRACT_LDBL128_WORDS(ix0,ix1,ix2,d) \ -do { \ - union IEEEl2bits ew_u; \ - ew_u.e = (d); \ - (ix0) = ew_u.xbits.expsign; \ - (ix1) = ew_u.xbits.manh; \ - (ix2) = ew_u.xbits.manl; \ -} while (0) - -/* Get expsign as a 16 bit int from a long double. */ - -#define GET_LDBL_EXPSIGN(i,d) \ -do { \ - union IEEEl2bits ge_u; \ - ge_u.e = (d); \ - (i) = ge_u.xbits.expsign; \ -} while (0) - -/* - * Set an 80 bit long double from a 16 bit int expsign and a 64 bit int - * mantissa. - */ - -#define INSERT_LDBL80_WORDS(d,ix0,ix1) \ -do { \ - union IEEEl2bits iw_u; \ - iw_u.xbits.expsign = (ix0); \ - iw_u.xbits.man = (ix1); \ - (d) = iw_u.e; \ -} while (0) - -/* - * Set a 128 bit long double from a 16 bit int expsign and two 64 bit ints - * comprising the mantissa. - */ - -#define INSERT_LDBL128_WORDS(d,ix0,ix1,ix2) \ -do { \ - union IEEEl2bits iw_u; \ - iw_u.xbits.expsign = (ix0); \ - iw_u.xbits.manh = (ix1); \ - iw_u.xbits.manl = (ix2); \ - (d) = iw_u.e; \ -} while (0) - -/* Set expsign of a long double from a 16 bit int. */ - -#define SET_LDBL_EXPSIGN(d,v) \ -do { \ - union IEEEl2bits se_u; \ - se_u.e = (d); \ - se_u.xbits.expsign = (v); \ - (d) = se_u.e; \ -} while (0) - -#ifdef __i386__ -/* Long double constants are broken on i386. */ -#define LD80C(m, ex, v) { \ - .xbits.man = __CONCAT(m, ULL), \ - .xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0), \ -} -#else -/* The above works on non-i386 too, but we use this to check v. */ -#define LD80C(m, ex, v) { .e = (v), } -#endif - -#ifdef FLT_EVAL_METHOD -/* - * Attempt to get strict C99 semantics for assignment with non-C99 compilers. - */ -#if FLT_EVAL_METHOD == 0 || __GNUC__ == 0 -#define STRICT_ASSIGN(type, lval, rval) ((lval) = (rval)) -#else -#define STRICT_ASSIGN(type, lval, rval) do { \ - volatile type __lval; \ - \ - if (sizeof(type) >= sizeof(long double)) \ - (lval) = (rval); \ - else { \ - __lval = (rval); \ - (lval) = __lval; \ - } \ -} while (0) -#endif -#endif /* FLT_EVAL_METHOD */ - -/* Support switching the mode to FP_PE if necessary. */ -#if defined(__i386__) && !defined(NO_FPSETPREC) -#define ENTERI() \ - long double __retval; \ - fp_prec_t __oprec; \ - \ - if ((__oprec = fpgetprec()) != FP_PE) \ - fpsetprec(FP_PE) -#define RETURNI(x) do { \ - __retval = (x); \ - if (__oprec != FP_PE) \ - fpsetprec(__oprec); \ - RETURNF(__retval); \ -} while (0) -#else -#define ENTERI(x) -#define RETURNI(x) RETURNF(x) -#endif - -/* Default return statement if hack*_t() is not used. */ -#define RETURNF(v) return (v) - -/* - * 2sum gives the same result as 2sumF without requiring |a| >= |b| or - * a == 0, but is slower. - */ -#define _2sum(a, b) do { \ - __typeof(a) __s, __w; \ - \ - __w = (a) + (b); \ - __s = __w - (a); \ - (b) = ((a) - (__w - __s)) + ((b) - __s); \ - (a) = __w; \ -} while (0) - -/* - * 2sumF algorithm. - * - * "Normalize" the terms in the infinite-precision expression a + b for - * the sum of 2 floating point values so that b is as small as possible - * relative to 'a'. (The resulting 'a' is the value of the expression in - * the same precision as 'a' and the resulting b is the rounding error.) - * |a| must be >= |b| or 0, b's type must be no larger than 'a's type, and - * exponent overflow or underflow must not occur. This uses a Theorem of - * Dekker (1971). See Knuth (1981) 4.2.2 Theorem C. The name "TwoSum" - * is apparently due to Skewchuk (1997). - * - * For this to always work, assignment of a + b to 'a' must not retain any - * extra precision in a + b. This is required by C standards but broken - * in many compilers. The brokenness cannot be worked around using - * STRICT_ASSIGN() like we do elsewhere, since the efficiency of this - * algorithm would be destroyed by non-null strict assignments. (The - * compilers are correct to be broken -- the efficiency of all floating - * point code calculations would be destroyed similarly if they forced the - * conversions.) - * - * Fortunately, a case that works well can usually be arranged by building - * any extra precision into the type of 'a' -- 'a' should have type float_t, - * double_t or long double. b's type should be no larger than 'a's type. - * Callers should use these types with scopes as large as possible, to - * reduce their own extra-precision and efficiciency problems. In - * particular, they shouldn't convert back and forth just to call here. - */ -#ifdef DEBUG -#define _2sumF(a, b) do { \ - __typeof(a) __w; \ - volatile __typeof(a) __ia, __ib, __r, __vw; \ - \ - __ia = (a); \ - __ib = (b); \ - assert(__ia == 0 || fabsl(__ia) >= fabsl(__ib)); \ - \ - __w = (a) + (b); \ - (b) = ((a) - __w) + (b); \ - (a) = __w; \ - \ - /* The next 2 assertions are weak if (a) is already long double. */ \ - assert((long double)__ia + __ib == (long double)(a) + (b)); \ - __vw = __ia + __ib; \ - __r = __ia - __vw; \ - __r += __ib; \ - assert(__vw == (a) && __r == (b)); \ -} while (0) -#else /* !DEBUG */ -#define _2sumF(a, b) do { \ - __typeof(a) __w; \ - \ - __w = (a) + (b); \ - (b) = ((a) - __w) + (b); \ - (a) = __w; \ -} while (0) -#endif /* DEBUG */ - -/* - * Set x += c, where x is represented in extra precision as a + b. - * x must be sufficiently normalized and sufficiently larger than c, - * and the result is then sufficiently normalized. - * - * The details of ordering are that |a| must be >= |c| (so that (a, c) - * can be normalized without extra work to swap 'a' with c). The details of - * the normalization are that b must be small relative to the normalized 'a'. - * Normalization of (a, c) makes the normalized c tiny relative to the - * normalized a, so b remains small relative to 'a' in the result. However, - * b need not ever be tiny relative to 'a'. For example, b might be about - * 2**20 times smaller than 'a' to give about 20 extra bits of precision. - * That is usually enough, and adding c (which by normalization is about - * 2**53 times smaller than a) cannot change b significantly. However, - * cancellation of 'a' with c in normalization of (a, c) may reduce 'a' - * significantly relative to b. The caller must ensure that significant - * cancellation doesn't occur, either by having c of the same sign as 'a', - * or by having |c| a few percent smaller than |a|. Pre-normalization of - * (a, b) may help. - * - * This is is a variant of an algorithm of Kahan (see Knuth (1981) 4.2.2 - * exercise 19). We gain considerable efficiency by requiring the terms to - * be sufficiently normalized and sufficiently increasing. - */ -#define _3sumF(a, b, c) do { \ - __typeof(a) __tmp; \ - \ - __tmp = (c); \ - _2sumF(__tmp, (a)); \ - (b) += (a); \ - (a) = __tmp; \ -} while (0) - -/* - * Common routine to process the arguments to nan(), nanf(), and nanl(). - */ -void _scan_nan(uint32_t *__words, int __num_words, const char *__s); - -#ifdef _COMPLEX_H - -/* - * C99 specifies that complex numbers have the same representation as - * an array of two elements, where the first element is the real part - * and the second element is the imaginary part. - */ -typedef union { - float complex f; - float a[2]; -} float_complex; -typedef union { - double complex f; - double a[2]; -} double_complex; -typedef union { - long double complex f; - long double a[2]; -} long_double_complex; -#define REALPART(z) ((z).a[0]) -#define IMAGPART(z) ((z).a[1]) - -/* - * Inline functions that can be used to construct complex values. - * - * The C99 standard intends x+I*y to be used for this, but x+I*y is - * currently unusable in general since gcc introduces many overflow, - * underflow, sign and efficiency bugs by rewriting I*y as - * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product. - * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted - * to -0.0+I*0.0. - */ -static __inline float complex -cpackf(float x, float y) -{ - float_complex z; - - REALPART(z) = x; - IMAGPART(z) = y; - return (z.f); -} - -static __inline double complex -cpack(double x, double y) -{ - double_complex z; - - REALPART(z) = x; - IMAGPART(z) = y; - return (z.f); -} - -static __inline long double complex -cpackl(long double x, long double y) -{ - long_double_complex z; - - REALPART(z) = x; - IMAGPART(z) = y; - return (z.f); -} -#endif /* _COMPLEX_H */ - -#ifdef __GNUCLIKE_ASM - -/* Asm versions of some functions. */ - -#ifdef __amd64__ -static __inline int -irint(double x) -{ - int n; - - asm("cvtsd2si %1,%0" : "=r" (n) : "x" (x)); - return (n); -} -#define HAVE_EFFICIENT_IRINT -#endif - -#ifdef __i386__ -static __inline int -irint(double x) -{ - int n; - - asm("fistl %0" : "=m" (n) : "t" (x)); - return (n); -} -#define HAVE_EFFICIENT_IRINT -#endif - -#if defined(__amd64__) || defined(__i386__) -static __inline int -irintl(long double x) -{ - int n; - - asm("fistl %0" : "=m" (n) : "t" (x)); - return (n); -} -#define HAVE_EFFICIENT_IRINTL -#endif - -#endif /* __GNUCLIKE_ASM */ - -#ifdef DEBUG -#if defined(__amd64__) || defined(__i386__) -#define breakpoint() asm("int $3") -#else -#include <signal.h> - -#define breakpoint() raise(SIGTRAP) -#endif -#endif - -/* Write a pari script to test things externally. */ -#ifdef DOPRINT -#include <stdio.h> - -#ifndef DOPRINT_SWIZZLE -#define DOPRINT_SWIZZLE 0 -#endif - -#ifdef DOPRINT_LD80 - -#define DOPRINT_START(xp) do { \ - uint64_t __lx; \ - uint16_t __hx; \ - \ - /* Hack to give more-problematic args. */ \ - EXTRACT_LDBL80_WORDS(__hx, __lx, *xp); \ - __lx ^= DOPRINT_SWIZZLE; \ - INSERT_LDBL80_WORDS(*xp, __hx, __lx); \ - printf("x = %.21Lg; ", (long double)*xp); \ -} while (0) -#define DOPRINT_END1(v) \ - printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v)) -#define DOPRINT_END2(hi, lo) \ - printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \ - (long double)(hi), (long double)(lo)) - -#elif defined(DOPRINT_D64) - -#define DOPRINT_START(xp) do { \ - uint32_t __hx, __lx; \ - \ - EXTRACT_WORDS(__hx, __lx, *xp); \ - __lx ^= DOPRINT_SWIZZLE; \ - INSERT_WORDS(*xp, __hx, __lx); \ - printf("x = %.21Lg; ", (long double)*xp); \ -} while (0) -#define DOPRINT_END1(v) \ - printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v)) -#define DOPRINT_END2(hi, lo) \ - printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \ - (long double)(hi), (long double)(lo)) - -#elif defined(DOPRINT_F32) - -#define DOPRINT_START(xp) do { \ - uint32_t __hx; \ - \ - GET_FLOAT_WORD(__hx, *xp); \ - __hx ^= DOPRINT_SWIZZLE; \ - SET_FLOAT_WORD(*xp, __hx); \ - printf("x = %.21Lg; ", (long double)*xp); \ -} while (0) -#define DOPRINT_END1(v) \ - printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v)) -#define DOPRINT_END2(hi, lo) \ - printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \ - (long double)(hi), (long double)(lo)) - -#else /* !DOPRINT_LD80 && !DOPRINT_D64 (LD128 only) */ - -#ifndef DOPRINT_SWIZZLE_HIGH -#define DOPRINT_SWIZZLE_HIGH 0 -#endif - -#define DOPRINT_START(xp) do { \ - uint64_t __lx, __llx; \ - uint16_t __hx; \ - \ - EXTRACT_LDBL128_WORDS(__hx, __lx, __llx, *xp); \ - __llx ^= DOPRINT_SWIZZLE; \ - __lx ^= DOPRINT_SWIZZLE_HIGH; \ - INSERT_LDBL128_WORDS(*xp, __hx, __lx, __llx); \ - printf("x = %.36Lg; ", (long double)*xp); \ -} while (0) -#define DOPRINT_END1(v) \ - printf("y = %.36Lg; z = 0; show(x, y, z);\n", (long double)(v)) -#define DOPRINT_END2(hi, lo) \ - printf("y = %.36Lg; z = %.36Lg; show(x, y, z);\n", \ - (long double)(hi), (long double)(lo)) - -#endif /* DOPRINT_LD80 */ - -#else /* !DOPRINT */ -#define DOPRINT_START(xp) -#define DOPRINT_END1(v) -#define DOPRINT_END2(hi, lo) -#endif /* DOPRINT */ - -#define RETURNP(x) do { \ - DOPRINT_END1(x); \ - RETURNF(x); \ -} while (0) -#define RETURNPI(x) do { \ - DOPRINT_END1(x); \ - RETURNI(x); \ -} while (0) -#define RETURN2P(x, y) do { \ - DOPRINT_END2((x), (y)); \ - RETURNF((x) + (y)); \ -} while (0) -#define RETURN2PI(x, y) do { \ - DOPRINT_END2((x), (y)); \ - RETURNI((x) + (y)); \ -} while (0) -#ifdef STRUCT_RETURN -#define RETURNSP(rp) do { \ - if (!(rp)->lo_set) \ - RETURNP((rp)->hi); \ - RETURN2P((rp)->hi, (rp)->lo); \ -} while (0) -#define RETURNSPI(rp) do { \ - if (!(rp)->lo_set) \ - RETURNPI((rp)->hi); \ - RETURN2PI((rp)->hi, (rp)->lo); \ -} while (0) -#endif -#define SUM2P(x, y) ({ \ - const __typeof (x) __x = (x); \ - const __typeof (y) __y = (y); \ - \ - DOPRINT_END2(__x, __y); \ - __x + __y; \ -}) - -/* - * ieee style elementary functions - * - * We rename functions here to improve other sources' diffability - * against fdlibm. - */ -#define __ieee754_sqrt sqrt -#define __ieee754_acos acos -#define __ieee754_acosh acosh -#define __ieee754_log log -#define __ieee754_log2 log2 -#define __ieee754_atanh atanh -#define __ieee754_asin asin -#define __ieee754_atan2 atan2 -#define __ieee754_exp exp -#define __ieee754_cosh cosh -#define __ieee754_fmod fmod -#define __ieee754_pow pow -#define __ieee754_lgamma lgamma -#define __ieee754_gamma gamma -#define __ieee754_lgamma_r lgamma_r -#define __ieee754_gamma_r gamma_r -#define __ieee754_log10 log10 -#define __ieee754_sinh sinh -#define __ieee754_hypot hypot -#define __ieee754_j0 j0 -#define __ieee754_j1 j1 -#define __ieee754_y0 y0 -#define __ieee754_y1 y1 -#define __ieee754_jn jn -#define __ieee754_yn yn -#define __ieee754_remainder remainder -#define __ieee754_scalb scalb -#define __ieee754_sqrtf sqrtf -#define __ieee754_acosf acosf -#define __ieee754_acoshf acoshf -#define __ieee754_logf logf -#define __ieee754_atanhf atanhf -#define __ieee754_asinf asinf -#define __ieee754_atan2f atan2f -#define __ieee754_expf expf -#define __ieee754_coshf coshf -#define __ieee754_fmodf fmodf -#define __ieee754_powf powf -#define __ieee754_lgammaf lgammaf -#define __ieee754_gammaf gammaf -#define __ieee754_lgammaf_r lgammaf_r -#define __ieee754_gammaf_r gammaf_r -#define __ieee754_log10f log10f -#define __ieee754_log2f log2f -#define __ieee754_sinhf sinhf -#define __ieee754_hypotf hypotf -#define __ieee754_j0f j0f -#define __ieee754_j1f j1f -#define __ieee754_y0f y0f -#define __ieee754_y1f y1f -#define __ieee754_jnf jnf -#define __ieee754_ynf ynf -#define __ieee754_remainderf remainderf -#define __ieee754_scalbf scalbf - -/* fdlibm kernel function */ -int __kernel_rem_pio2(double*,double*,int,int,int); - -/* double precision kernel functions */ -#ifndef INLINE_REM_PIO2 -int __ieee754_rem_pio2(double,double*); -#endif -double __kernel_sin(double,double,int); -double __kernel_cos(double,double); -double __kernel_tan(double,double,int); -double __ldexp_exp(double,int); -#ifdef _COMPLEX_H -double complex __ldexp_cexp(double complex,int); -#endif - -/* float precision kernel functions */ -#ifndef INLINE_REM_PIO2F -int __ieee754_rem_pio2f(float,double*); -#endif -#ifndef INLINE_KERNEL_SINDF -float __kernel_sindf(double); -#endif -#ifndef INLINE_KERNEL_COSDF -float __kernel_cosdf(double); -#endif -#ifndef INLINE_KERNEL_TANDF -float __kernel_tandf(double,int); -#endif -float __ldexp_expf(float,int); -#ifdef _COMPLEX_H -float complex __ldexp_cexpf(float complex,int); -#endif - -/* long double precision kernel functions */ -long double __kernel_sinl(long double, long double, int); -long double __kernel_cosl(long double, long double); -long double __kernel_tanl(long double, long double, int); - -#endif /* !_MATH_PRIVATE_H_ */ diff --git a/sources/android/support/src/msun/s_nan.c b/sources/android/support/src/msun/s_nan.c deleted file mode 100644 index 305719956..000000000 --- a/sources/android/support/src/msun/s_nan.c +++ /dev/null @@ -1,129 +0,0 @@ -/*- - * Copyright (c) 2007 David Schultz - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/endian.h> -#include <ctype.h> -#include <float.h> -#include <math.h> -#include <stdint.h> -#include <strings.h> - -#include "math_private.h" - -static int digittoint(char ch) { - int d = ch - '0'; - if ((unsigned) d < 10) { - return d; - } - d = ch - 'a'; - if ((unsigned) d < 6) { - return d + 10; - } - d = ch - 'A'; - if ((unsigned) d < 6) { - return d + 10; - } - return -1; -} - -/* - * Scan a string of hexadecimal digits (the format nan(3) expects) and - * make a bit array (using the local endianness). We stop when we - * encounter an invalid character, NUL, etc. If we overflow, we do - * the same as gcc's __builtin_nan(), namely, discard the high order bits. - * - * The format this routine accepts needs to be compatible with what is used - * in contrib/gdtoa/hexnan.c (for strtod/scanf) and what is used in - * __builtin_nan(). In fact, we're only 100% compatible for strings we - * consider valid, so we might be violating the C standard. But it's - * impossible to use nan(3) portably anyway, so this seems good enough. - */ -void -_scan_nan(uint32_t *words, int num_words, const char *s) -{ - int si; /* index into s */ - int bitpos; /* index into words (in bits) */ - - bzero(words, num_words * sizeof(uint32_t)); - - /* Allow a leading '0x'. (It's expected, but redundant.) */ - if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - s += 2; - - /* Scan forwards in the string, looking for the end of the sequence. */ - for (si = 0; isxdigit(s[si]); si++) - ; - - /* Scan backwards, filling in the bits in words[] as we go. */ -#if _BYTE_ORDER == _LITTLE_ENDIAN - for (bitpos = 0; bitpos < 32 * num_words; bitpos += 4) { -#else - for (bitpos = 32 * num_words - 4; bitpos >= 0; bitpos -= 4) { -#endif - if (--si < 0) - break; - words[bitpos / 32] |= digittoint(s[si]) << (bitpos % 32); - } -} - -double -nan(const char *s) -{ - union { - double d; - uint32_t bits[2]; - } u; - - _scan_nan(u.bits, 2, s); -#if _BYTE_ORDER == _LITTLE_ENDIAN - u.bits[1] |= 0x7ff80000; -#else - u.bits[0] |= 0x7ff80000; -#endif - return (u.d); -} - -float -nanf(const char *s) -{ - union { - float f; - uint32_t bits[1]; - } u; - - _scan_nan(u.bits, 1, s); - u.bits[0] |= 0x7fc00000; - return (u.f); -} - -#if (LDBL_MANT_DIG == 53) -#define __weak_reference(sym,alias) \ - __asm__(".weak " #alias); \ - __asm__(".equ " #alias ", " #sym) -__weak_reference(nan, nanl); -#endif diff --git a/sources/android/support/src/musl-math/complex.h b/sources/android/support/src/musl-math/complex.h deleted file mode 100644 index 0aab0801f..000000000 --- a/sources/android/support/src/musl-math/complex.h +++ /dev/null @@ -1 +0,0 @@ -/* Intentionally empty */ diff --git a/sources/android/support/src/musl-math/frexp.c b/sources/android/support/src/musl-math/frexp.c deleted file mode 100644 index 27b6266ed..000000000 --- a/sources/android/support/src/musl-math/frexp.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <math.h> -#include <stdint.h> - -double frexp(double x, int *e) -{ - union { double d; uint64_t i; } y = { x }; - int ee = y.i>>52 & 0x7ff; - - if (!ee) { - if (x) { - x = frexp(x*0x1p64, e); - *e -= 64; - } else *e = 0; - return x; - } else if (ee == 0x7ff) { - return x; - } - - *e = ee - 0x3fe; - y.i &= 0x800fffffffffffffull; - y.i |= 0x3fe0000000000000ull; - return y.d; -} diff --git a/sources/android/support/src/musl-math/frexpf.c b/sources/android/support/src/musl-math/frexpf.c deleted file mode 100644 index 078709752..000000000 --- a/sources/android/support/src/musl-math/frexpf.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <math.h> -#include <stdint.h> - -float frexpf(float x, int *e) -{ - union { float f; uint32_t i; } y = { x }; - int ee = y.i>>23 & 0xff; - - if (!ee) { - if (x) { - x = frexpf(x*0x1p64, e); - *e -= 64; - } else *e = 0; - return x; - } else if (ee == 0xff) { - return x; - } - - *e = ee - 0x7e; - y.i &= 0x807ffffful; - y.i |= 0x3f000000ul; - return y.f; -} diff --git a/sources/android/support/src/musl-math/frexpl.c b/sources/android/support/src/musl-math/frexpl.c deleted file mode 100644 index 3c1b55374..000000000 --- a/sources/android/support/src/musl-math/frexpl.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double frexpl(long double x, int *e) -{ - return frexp(x, e); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double frexpl(long double x, int *e) -{ - union ldshape u = {x}; - int ee = u.i.se & 0x7fff; - - if (!ee) { - if (x) { - x = frexpl(x*0x1p120, e); - *e -= 120; - } else *e = 0; - return x; - } else if (ee == 0x7fff) { - return x; - } - - *e = ee - 0x3ffe; - u.i.se &= 0x8000; - u.i.se |= 0x3ffe; - return u.f; -} -#endif diff --git a/sources/android/support/src/musl-math/libm.h b/sources/android/support/src/musl-math/libm.h deleted file mode 100644 index fb6764f57..000000000 --- a/sources/android/support/src/musl-math/libm.h +++ /dev/null @@ -1,161 +0,0 @@ -/* origin: FreeBSD /usr/src/lib/msun/src/math_private.h */ -/* - * ==================================================== - * 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. - * ==================================================== - */ - -#ifndef _LIBM_H -#define _LIBM_H - -#include <stdint.h> -#include <float.h> -#include <math.h> -// ANDROID -//#include <complex.h> -#include <endian.h> - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN -union ldshape { - long double f; - struct { - uint64_t m; - uint16_t se; - } i; -}; -#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN -union ldshape { - long double f; - struct { - uint64_t lo; - uint32_t mid; - uint16_t top; - uint16_t se; - } i; - struct { - uint64_t lo; - uint64_t hi; - } i2; -}; -#else -#error Unsupported long double representation -#endif - -#define FORCE_EVAL(x) do { \ - if (sizeof(x) == sizeof(float)) { \ - volatile float __x; \ - __x = (x); \ - } else if (sizeof(x) == sizeof(double)) { \ - volatile double __x; \ - __x = (x); \ - } else { \ - volatile long double __x; \ - __x = (x); \ - } \ -} while(0) - -/* Get two 32 bit ints from a double. */ -#define EXTRACT_WORDS(hi,lo,d) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - (hi) = __u.i >> 32; \ - (lo) = (uint32_t)__u.i; \ -} while (0) - -/* Get the more significant 32 bit int from a double. */ -#define GET_HIGH_WORD(hi,d) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - (hi) = __u.i >> 32; \ -} while (0) - -/* Get the less significant 32 bit int from a double. */ -#define GET_LOW_WORD(lo,d) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - (lo) = (uint32_t)__u.i; \ -} while (0) - -/* Set a double from two 32 bit ints. */ -#define INSERT_WORDS(d,hi,lo) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.i = ((uint64_t)(hi)<<32) | (uint32_t)(lo); \ - (d) = __u.f; \ -} while (0) - -/* Set the more significant 32 bits of a double from an int. */ -#define SET_HIGH_WORD(d,hi) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - __u.i &= 0xffffffff; \ - __u.i |= (uint64_t)(hi) << 32; \ - (d) = __u.f; \ -} while (0) - -/* Set the less significant 32 bits of a double from an int. */ -#define SET_LOW_WORD(d,lo) \ -do { \ - union {double f; uint64_t i;} __u; \ - __u.f = (d); \ - __u.i &= 0xffffffff00000000ull; \ - __u.i |= (uint32_t)(lo); \ - (d) = __u.f; \ -} while (0) - -/* Get a 32 bit int from a float. */ -#define GET_FLOAT_WORD(w,d) \ -do { \ - union {float f; uint32_t i;} __u; \ - __u.f = (d); \ - (w) = __u.i; \ -} while (0) - -/* Set a float from a 32 bit int. */ -#define SET_FLOAT_WORD(d,w) \ -do { \ - union {float f; uint32_t i;} __u; \ - __u.i = (w); \ - (d) = __u.f; \ -} while (0) - -/* fdlibm kernel functions */ - -int __rem_pio2_large(double*,double*,int,int,int); - -int __rem_pio2(double,double*); -double __sin(double,double,int); -double __cos(double,double); -double __tan(double,double,int); -double __expo2(double); -// ANDROID -//double complex __ldexp_cexp(double complex,int); - -int __rem_pio2f(float,double*); -float __sindf(double); -float __cosdf(double); -float __tandf(double,int); -float __expo2f(float); -// ANDROID -//float complex __ldexp_cexpf(float complex,int); - -int __rem_pio2l(long double, long double *); -long double __sinl(long double, long double, int); -long double __cosl(long double, long double); -long double __tanl(long double, long double, int); - -/* polynomial evaluation */ -long double __polevll(long double, const long double *, int); -long double __p1evll(long double, const long double *, int); - -#endif diff --git a/sources/android/support/src/musl-math/scalbln.c b/sources/android/support/src/musl-math/scalbln.c deleted file mode 100644 index e6f3f195c..000000000 --- a/sources/android/support/src/musl-math/scalbln.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <limits.h> -#include <math.h> - -double scalbln(double x, long n) -{ - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; - return scalbn(x, n); -} diff --git a/sources/android/support/src/musl-math/scalblnf.c b/sources/android/support/src/musl-math/scalblnf.c deleted file mode 100644 index d8e8166b1..000000000 --- a/sources/android/support/src/musl-math/scalblnf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <limits.h> -#include <math.h> - -float scalblnf(float x, long n) -{ - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; - return scalbnf(x, n); -} diff --git a/sources/android/support/src/musl-math/scalblnl.c b/sources/android/support/src/musl-math/scalblnl.c deleted file mode 100644 index 854c51c4c..000000000 --- a/sources/android/support/src/musl-math/scalblnl.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <limits.h> -#include <math.h> -#include <float.h> - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double scalblnl(long double x, long n) -{ - return scalbln(x, n); -} -#else -long double scalblnl(long double x, long n) -{ - if (n > INT_MAX) - n = INT_MAX; - else if (n < INT_MIN) - n = INT_MIN; - return scalbnl(x, n); -} -#endif diff --git a/sources/android/support/src/musl-math/scalbnl.c b/sources/android/support/src/musl-math/scalbnl.c deleted file mode 100644 index 08a4c5875..000000000 --- a/sources/android/support/src/musl-math/scalbnl.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "libm.h" - -#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 -long double scalbnl(long double x, int n) -{ - return scalbn(x, n); -} -#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 -long double scalbnl(long double x, int n) -{ - union ldshape u; - - if (n > 16383) { - x *= 0x1p16383L; - n -= 16383; - if (n > 16383) { - x *= 0x1p16383L; - n -= 16383; - if (n > 16383) - n = 16383; - } - } else if (n < -16382) { - x *= 0x1p-16382L; - n += 16382; - if (n < -16382) { - x *= 0x1p-16382L; - n += 16382; - if (n < -16382) - n = -16382; - } - } - u.f = 1.0; - u.i.se = 0x3fff + n; - return x * u.f; -} -#endif diff --git a/sources/android/support/src/stdio/fpmath.h b/sources/android/support/src/stdio/fpmath.h deleted file mode 100644 index d4319c6aa..000000000 --- a/sources/android/support/src/stdio/fpmath.h +++ /dev/null @@ -1,96 +0,0 @@ -/*- - * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org> - * Copyright (c) 2002 David Schultz <das@FreeBSD.ORG> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/lib/libc/include/fpmath.h,v 1.3 2005/02/06 03:23:31 das Exp $ - */ - -#include <endian.h> -#if defined(__arm__) -#include "arm/_fpmath.h" -#elif defined(__aarch64__) -#include "arm64/_fpmath.h" -#elif defined(__i386__) -#include "i386/_fpmath.h" -#elif defined(__x86_64__) -#include "amd64/_fpmath.h" -#elif defined(__mips__) -#include "mips/_fpmath.h" -#else -#error Unknown arch! -#endif - -union IEEEf2bits { - float f; - struct { -#if __BYTE_ORDER == __LITTLE_ENDIAN - unsigned int man :23; - unsigned int exp :8; - unsigned int sign :1; -#else /* _BIG_ENDIAN */ - unsigned int sign :1; - unsigned int exp :8; - unsigned int man :23; -#endif - } bits; -}; - -#define DBL_MANH_SIZE 20 -#define DBL_MANL_SIZE 32 - -union IEEEd2bits { - double d; - struct { -/* #ifdef __ARMEB__ */ -#if (__BYTE_ORDER == __BIG_ENDIAN) || (defined(__arm__) && !defined(__VFP_FP__)) - unsigned int manh :20; - unsigned int exp :11; - unsigned int sign :1; - unsigned int manl :32; -#elif __BYTE_ORDER == __LITTLE_ENDIAN - unsigned int manl :32; - unsigned int manh :20; - unsigned int exp :11; - unsigned int sign :1; -#elif __BYTE_ORDER == __BIG_ENDIAN - unsigned int sign :1; - unsigned int exp :11; - unsigned int manh :20; - unsigned int manl :32; -#endif - } bits; -}; - -/* - * The BSD "long double" functions are broken when sizeof(long double) == sizeof(double). - * Android works around those cases by replacing the broken functions with our own trivial stubs - * that call the regular "double" function. - */ -#define __fpclassifyl __broken__fpclassify -#define __isfinitel __broken__isfinitel -#define __isinfl __broken__isinfl -#define __isnanl __broken__isnanl -#define __isnormall __broken__isnormall -#define __signbitl __broken_signbitl |