aboutsummaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2017-06-30 13:44:31 -0700
committerDan Albert <danalbert@google.com>2017-06-30 16:54:46 -0700
commit8127c9619e2a497a58e6db62df9916e4c4864608 (patch)
tree671f85365d4497a827e723ed6fbb2d56ff098490 /sources
parentb04b1a2e39477518e963daaec34fffcb69852c04 (diff)
downloadndk-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')
-rw-r--r--sources/android/support/Android.mk81
-rw-r--r--sources/android/support/src/math_support.c93
-rw-r--r--sources/android/support/src/msun/e_log2.c120
-rw-r--r--sources/android/support/src/msun/e_log2f.c82
-rw-r--r--sources/android/support/src/msun/k_log.h100
-rw-r--r--sources/android/support/src/msun/k_logf.h39
-rw-r--r--sources/android/support/src/msun/math_private.h764
-rw-r--r--sources/android/support/src/msun/s_nan.c129
-rw-r--r--sources/android/support/src/musl-math/complex.h1
-rw-r--r--sources/android/support/src/musl-math/frexp.c23
-rw-r--r--sources/android/support/src/musl-math/frexpf.c23
-rw-r--r--sources/android/support/src/musl-math/frexpl.c29
-rw-r--r--sources/android/support/src/musl-math/libm.h161
-rw-r--r--sources/android/support/src/musl-math/scalbln.c11
-rw-r--r--sources/android/support/src/musl-math/scalblnf.c11
-rw-r--r--sources/android/support/src/musl-math/scalblnl.c19
-rw-r--r--sources/android/support/src/musl-math/scalbnl.c36
-rw-r--r--sources/android/support/src/stdio/fpmath.h96
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