1d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray/*
2d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * Copyright (C) 2011-2013 The Android Open Source Project
3d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray *
4d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * Licensed under the Apache License, Version 2.0 (the "License");
5d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * you may not use this file except in compliance with the License.
6d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * You may obtain a copy of the License at
7d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray *
8d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray *      http://www.apache.org/licenses/LICENSE-2.0
9d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray *
10d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * Unless required by applicable law or agreed to in writing, software
11d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * distributed under the License is distributed on an "AS IS" BASIS,
12d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * See the License for the specific language governing permissions and
14d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray * limitations under the License.
15d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray */
16d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
17d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// exports unavailable mathlib functions to compat lib
18d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
19d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#ifdef RS_COMPATIBILITY_LIB
20d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
21d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murraytypedef unsigned int uint32_t;
22d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murraytypedef int int32_t;
23d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
24d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern uint32_t SC_abs_i32(int32_t v);
25d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayuint32_t __attribute__((overloadable)) abs(int32_t v) {return SC_abs_i32(v);}
26d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
27d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#define IMPORT_F32_FN_F32(func)                                         \
28d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    extern float SC_##func##f(float v);                                 \
29d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    float __attribute__((overloadable)) func(float v) {return SC_##func##f(v);}
30d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
31d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#define IMPORT_F32_FN_F32_F32(func)                                     \
32d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    extern float SC_##func##f(float t, float v);                        \
33d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray    float __attribute__((overloadable)) func(float t, float v) {return SC_##func##f(t, v);}
34d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
35d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(acos)
36d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(acosh)
37d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(asin)
38d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(asinh)
39d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(atan)
40d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(atan2)
41d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(atanh)
42d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(cbrt)
43d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(ceil)
44d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(copysign)
45d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(cos)
46d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(cosh)
47d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(erfc)
48d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(erf)
49d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(exp)
50d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(exp2)
51d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(expm1)
52d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(fdim)
53d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(floor)
54d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern float SC_fmaf(float u, float t, float v);
55d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayfloat __attribute__((overloadable)) fma(float u, float t, float v) {return SC_fmaf(u, t, v);}
56d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(fmax)
57d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(fmin)
58d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(fmod)
59d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern float SC_frexpf(float v, int* ptr);
60d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayfloat __attribute__((overloadable)) frexp(float v, int* ptr) {return SC_frexpf(v, ptr);}
61d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(hypot)
62d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(ilogb)
63d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern float SC_ldexpf(float v, int i);
64d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayfloat __attribute__((overloadable)) ldexp(float v, int i) {return SC_ldexpf(v, i);}
65d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(lgamma)
66d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern float SC_lgammaf_r(float v, int* ptr);
67d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayfloat __attribute__((overloadable)) lgamma(float v, int* ptr) {return SC_lgammaf_r(v, ptr);}
68d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(log)
69d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(log10)
70d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(log1p)
71d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(logb)
72d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern float SC_modff(float v, float* ptr);
73d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayfloat modf(float v, float* ptr) {return SC_modff(v, ptr);}
74d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(nextafter)
75d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(pow)
76d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32_F32(remainder)
77d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern float SC_remquof(float t, float v, int* ptr);
78d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayfloat remquo(float t, float v, int* ptr) {return SC_remquof(t, v, ptr);}
79d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(rint)
80d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(round)
81d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(sin)
82d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(sinh)
83d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(sqrt)
84d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(tan)
85d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(tanh)
86d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(tgamma)
87d6f1f46b2929ed56c73ba32357cde31b82972fbeTim MurrayIMPORT_F32_FN_F32(trunc)
88d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
89b93cb42b4b8511d244ec8df4559fdc5c0b2de1bfStephen Hinesextern float SC_randf2(float min, float max);
90b93cb42b4b8511d244ec8df4559fdc5c0b2de1bfStephen Hinesfloat __attribute__((overloadable)) rsRand(float min, float max) {
91b93cb42b4b8511d244ec8df4559fdc5c0b2de1bfStephen Hines  return SC_randf2(min, max);
92b93cb42b4b8511d244ec8df4559fdc5c0b2de1bfStephen Hines}
93b93cb42b4b8511d244ec8df4559fdc5c0b2de1bfStephen Hines
94b93cb42b4b8511d244ec8df4559fdc5c0b2de1bfStephen Hines
95d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// !!! DANGER !!!
96d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// These functions are potentially missing on older Android versions.
97d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// Work around the issue by supplying our own variants.
98d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// !!! DANGER !!!
99d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
100d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// The logbl() implementation is taken from the latest bionic/, since
101d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// double == long double on Android.
102d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern "C" long double logbl(long double x) { return logb(x); }
103d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
104d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// __aeabi_idiv0 is a missing function in libcompiler_rt.so, so we just
105d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray// pick the simplest implementation based on the ARM EABI doc.
106d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murrayextern "C" int __aeabi_idiv0(int v) { return v; }
107d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray
108d6f1f46b2929ed56c73ba32357cde31b82972fbeTim Murray#endif // compatibility lib
109