1037ce981d8ebbe275236814876441f872d438c26Reid Spencer/*
234695381d626485a560594f162701088079589dfMisha Brukman * Copyright (C) 2011-2013 The Android Open Source Project
3e89c7c616b36378d5eaf19541f4ae79841f9ed8eJeff Cohen *
44b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen * Licensed under the Apache License, Version 2.0 (the "License");
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * you may not use this file except in compliance with the License.
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * You may obtain a copy of the License at
734695381d626485a560594f162701088079589dfMisha Brukman *
84b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen *      http://www.apache.org/licenses/LICENSE-2.0
94b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen *
10037ce981d8ebbe275236814876441f872d438c26Reid Spencer * Unless required by applicable law or agreed to in writing, software
11037ce981d8ebbe275236814876441f872d438c26Reid Spencer * distributed under the License is distributed on an "AS IS" BASIS,
124b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen * See the License for the specific language governing permissions and
144b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen * limitations under the License.
1562c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer */
1662c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer
174b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen// exports unavailable mathlib functions to compat lib
1862c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer
1936b708a3188cd02909d102c26ec6c251147890d7Owen Anderson#ifdef RS_COMPATIBILITY_LIB
2062c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer
2162c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencertypedef unsigned int uint32_t;
22a11e2eb845ffc1ad9aee0a96d6998a3e084edfcdNick Lewyckytypedef int int32_t;
2362c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer
2462c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencerextern uint32_t SC_abs_i32(int32_t v);
2562c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spenceruint32_t __attribute__((overloadable)) abs(int32_t v) {return SC_abs_i32(v);}
26f4db3a51c7d806f7dcef5d9625e7cdf7f122dca9Daniel Dunbar
2706deda2d9c8d3117c49704e42b5147df13f42355Jeff Cohen#define IMPORT_F32_FN_F32(func)                                         \
2862c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer    extern float SC_##func##f(float v);                                 \
294b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen    float __attribute__((overloadable)) func(float v) {return SC_##func##f(v);}
304b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen
314b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen#define IMPORT_F32_FN_F32_F32(func)                                     \
324b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen    extern float SC_##func##f(float t, float v);                        \
339b2b56ef758ea93082817d421b3fc4cea6daf99eChris Lattner    float __attribute__((overloadable)) func(float t, float v) {return SC_##func##f(t, v);}
344b807e0381be558f3c9173c971ecf640cb9a9176Jeff Cohen
354b807e0381be558f3c9173c971ecf640cb9a9176Jeff CohenIMPORT_F32_FN_F32(acos)
36534927d82de6d1be0f6e939263eeb309ad135661Jeff CohenIMPORT_F32_FN_F32(acosh)
37534927d82de6d1be0f6e939263eeb309ad135661Jeff CohenIMPORT_F32_FN_F32(asin)
389b2b56ef758ea93082817d421b3fc4cea6daf99eChris LattnerIMPORT_F32_FN_F32(asinh)
39b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(atan)
40b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(atan2)
419b2b56ef758ea93082817d421b3fc4cea6daf99eChris LattnerIMPORT_F32_FN_F32(atanh)
429b2b56ef758ea93082817d421b3fc4cea6daf99eChris LattnerIMPORT_F32_FN_F32(cbrt)
43b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(ceil)
444b807e0381be558f3c9173c971ecf640cb9a9176Jeff CohenIMPORT_F32_FN_F32_F32(copysign)
45534927d82de6d1be0f6e939263eeb309ad135661Jeff CohenIMPORT_F32_FN_F32(cos)
46b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(cosh)
47534927d82de6d1be0f6e939263eeb309ad135661Jeff CohenIMPORT_F32_FN_F32(erfc)
48472c7918b0bc155e002db6f682c899e21bff852cAndrew LenharthIMPORT_F32_FN_F32(erf)
49534927d82de6d1be0f6e939263eeb309ad135661Jeff CohenIMPORT_F32_FN_F32(exp)
50b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(exp2)
51c6791d9fca0ca42c6ccc7b786bbb73dd5ac330ebDevang PatelIMPORT_F32_FN_F32(expm1)
52534927d82de6d1be0f6e939263eeb309ad135661Jeff CohenIMPORT_F32_FN_F32_F32(fdim)
53029840c93521f5c54380e037a66216c8227ad1e1Chris LattnerIMPORT_F32_FN_F32(floor)
54bf65268def058af3e1d35aba233d5f0fd5a80fceJeff Cohenextern float SC_fmaf(float u, float t, float v);
55b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenfloat __attribute__((overloadable)) fma(float u, float t, float v) {return SC_fmaf(u, t, v);}
56b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(fmax)
57b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(fmin)
58b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(fmod)
59b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenextern float SC_frexpf(float v, int* ptr);
60b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenfloat __attribute__((overloadable)) frexp(float v, int* ptr) {return SC_frexpf(v, ptr);}
61b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(hypot)
62b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(ilogb)
63b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenextern float SC_ldexpf(float v, int i);
64b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenfloat __attribute__((overloadable)) ldexp(float v, int i) {return SC_ldexpf(v, i);}
65b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(lgamma)
66b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenextern float SC_lgammaf_r(float v, int* ptr);
673d566ddd05120d1ff85eb4f93283e0e85366fa82Devang Patelfloat __attribute__((overloadable)) lgamma(float v, int* ptr) {return SC_lgammaf_r(v, ptr);}
68b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(log)
69b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(log10)
70b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(log1p)
7106deda2d9c8d3117c49704e42b5147df13f42355Jeff CohenIMPORT_F32_FN_F32(logb)
721f476f4d84028c69777b9d309579209666f45543Owen Andersonextern float SC_modff(float v, float* ptr);
73b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenfloat modf(float v, float* ptr) {return SC_modff(v, ptr);}
74b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(nextafter)
75b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(pow)
76b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32_F32(remainder)
77e214979f79291e377571561025ab97d15044d72cChris Lattnerextern float SC_remquof(float t, float v, int* ptr);
7811f510b577878e61e62a3a9c5c8d86483961d20cOwen Andersonfloat remquo(float t, float v, int* ptr) {return SC_remquof(t, v, ptr);}
79b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(rint)
80bf65268def058af3e1d35aba233d5f0fd5a80fceJeff CohenIMPORT_F32_FN_F32(round)
81b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(sin)
82b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(sinh)
83b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(sqrt)
84b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(tan)
856116fb10359fc62914c37bfb80a80d85b4c5e885Chris LattnerIMPORT_F32_FN_F32(tanh)
86fee76bd9ba038a4640259ffcbb2c6e2bd970a3caDevang PatelIMPORT_F32_FN_F32(tgamma)
87b99468d718c4d1b8f20909a4c765e458585ef745Jeff CohenIMPORT_F32_FN_F32(trunc)
88b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen
89b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenextern float SC_randf2(float min, float max);
90b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohenfloat __attribute__((overloadable)) rsRand(float min, float max) {
91534927d82de6d1be0f6e939263eeb309ad135661Jeff Cohen  return SC_randf2(min, max);
92534927d82de6d1be0f6e939263eeb309ad135661Jeff Cohen}
936e400f76e6921226ddacba367d3928474ed7567dJeff Cohen
94e60f69c0543993953465863d4b2cf9260c2dad96Jeff Cohen
95105b2f5374d970822d6f33f7ec5d2ed1e9ef9c29Andrew Lenharth// !!! DANGER !!!
96b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen// These functions are potentially missing on older Android versions.
97b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen// Work around the issue by supplying our own variants.
98b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen// !!! DANGER !!!
99b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen
100b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen// The logbl() implementation is taken from the latest bionic/, since
101c8beae2b6d42664378f712895997486fe1f06453Jeff Cohen// double == long double on Android.
1028f027c7fea068394be9026a80a8cbe045ed021eeDan Gohmanextern "C" long double logbl(long double x) { return logb(x); }
103b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen
104bf65268def058af3e1d35aba233d5f0fd5a80fceJeff Cohen// __aeabi_idiv0 is a missing function in libcompiler_rt.so, so we just
105f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel// pick the simplest implementation based on the ARM EABI doc.
1065f2e4681ce039f29d75fae2d8447e4a31b8e4706Devang Patelextern "C" int __aeabi_idiv0(int v) { return v; }
107b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen
108b99468d718c4d1b8f20909a4c765e458585ef745Jeff Cohen#endif // compatibility lib
1098383a7b7a6acdae478d4b4c2520915153b73f676Chris Lattner