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