197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot/*===---- __clang_cuda_cmath.h - Device-side CUDA cmath support ------------=== 297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * 397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * Permission is hereby granted, free of charge, to any person obtaining a copy 497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * of this software and associated documentation files (the "Software"), to deal 597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * in the Software without restriction, including without limitation the rights 697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * copies of the Software, and to permit persons to whom the Software is 897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * furnished to do so, subject to the following conditions: 997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * 1097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * The above copyright notice and this permission notice shall be included in 1197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * all copies or substantial portions of the Software. 1297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * 1397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * THE SOFTWARE. 2097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot * 2197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot *===-----------------------------------------------------------------------=== 2297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot */ 2397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#ifndef __CLANG_CUDA_CMATH_H__ 2497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#define __CLANG_CUDA_CMATH_H__ 2597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#ifndef __CUDA__ 2697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#error "This file is for CUDA compilation only." 2797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#endif 2897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot 2997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// CUDA lets us use various std math functions on the device side. This file 3097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// works in concert with __clang_cuda_math_forward_declares.h to make this work. 3197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// 3297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// Specifically, the forward-declares header declares __device__ overloads for 3397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// these functions in the global namespace, then pulls them into namespace std 3497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// with 'using' statements. Then this file implements those functions, after 3597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// the implementations have been pulled in. 3697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// 3797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// It's important that we declare the functions in the global namespace and pull 3897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// them into namespace std with using statements, as opposed to simply declaring 3997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// these functions in namespace std, because our device functions need to 4097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// overload the standard library functions, which may be declared in the global 4197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// namespace or in std, depending on the degree of conformance of the stdlib 4297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// implementation. Declaring in the global namespace and pulling into namespace 4397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot// std covers all of the known knowns. 4497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot 4597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#define __DEVICE__ static __device__ __inline__ __attribute__((always_inline)) 4697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot 4797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ long long abs(long long __n) { return ::llabs(__n); } 4897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ long abs(long __n) { return ::labs(__n); } 4997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float abs(float __x) { return ::fabsf(__x); } 5097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ double abs(double __x) { return ::fabs(__x); } 5197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float acos(float __x) { return ::acosf(__x); } 5297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float asin(float __x) { return ::asinf(__x); } 5397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float atan(float __x) { return ::atanf(__x); } 5497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float atan2(float __x, float __y) { return ::atan2f(__x, __y); } 5597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float ceil(float __x) { return ::ceilf(__x); } 5697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float cos(float __x) { return ::cosf(__x); } 5797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float cosh(float __x) { return ::coshf(__x); } 5897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float exp(float __x) { return ::expf(__x); } 5997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float fabs(float __x) { return ::fabsf(__x); } 6097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float floor(float __x) { return ::floorf(__x); } 6197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float fmod(float __x, float __y) { return ::fmodf(__x, __y); } 6297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ int fpclassify(float __x) { 6397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, 6497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot FP_ZERO, __x); 6597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 6697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ int fpclassify(double __x) { 6797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, 6897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot FP_ZERO, __x); 6997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 7097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float frexp(float __arg, int *__exp) { 7197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return ::frexpf(__arg, __exp); 7297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 7397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isinf(float __x) { return ::__isinff(__x); } 7497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isinf(double __x) { return ::__isinf(__x); } 7597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isfinite(float __x) { return ::__finitef(__x); } 7697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isfinite(double __x) { return ::__finite(__x); } 7797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isgreater(float __x, float __y) { 7897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isgreater(__x, __y); 7997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 8097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isgreater(double __x, double __y) { 8197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isgreater(__x, __y); 8297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 8397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isgreaterequal(float __x, float __y) { 8497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isgreaterequal(__x, __y); 8597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 8697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isgreaterequal(double __x, double __y) { 8797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isgreaterequal(__x, __y); 8897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 8997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isless(float __x, float __y) { 9097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isless(__x, __y); 9197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 9297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isless(double __x, double __y) { 9397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isless(__x, __y); 9497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 9597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool islessequal(float __x, float __y) { 9697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_islessequal(__x, __y); 9797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 9897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool islessequal(double __x, double __y) { 9997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_islessequal(__x, __y); 10097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 10197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool islessgreater(float __x, float __y) { 10297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_islessgreater(__x, __y); 10397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 10497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool islessgreater(double __x, double __y) { 10597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_islessgreater(__x, __y); 10697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 10797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isnan(float __x) { return ::__isnanf(__x); } 10897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isnan(double __x) { return ::__isnan(__x); } 10997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isnormal(float __x) { return __builtin_isnormal(__x); } 11097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isnormal(double __x) { return __builtin_isnormal(__x); } 11197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isunordered(float __x, float __y) { 11297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isunordered(__x, __y); 11397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 11497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool isunordered(double __x, double __y) { 11597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_isunordered(__x, __y); 11697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 11797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float ldexp(float __arg, int __exp) { 11897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return ::ldexpf(__arg, __exp); 11997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 12097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float log(float __x) { return ::logf(__x); } 12197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float log10(float __x) { return ::log10f(__x); } 12297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float modf(float __x, float *__iptr) { return ::modff(__x, __iptr); } 12397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float nexttoward(float __from, float __to) { 12497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_nexttowardf(__from, __to); 12597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 12697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ double nexttoward(double __from, double __to) { 12797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return __builtin_nexttoward(__from, __to); 12897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 12997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float pow(float __base, float __exp) { 13097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return ::powf(__base, __exp); 13197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 13297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float pow(float __base, int __iexp) { 13397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return ::powif(__base, __iexp); 13497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 13597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ double pow(double __base, int __iexp) { 13697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot return ::powi(__base, __iexp); 13797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot} 13897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool signbit(float __x) { return ::__signbitf(__x); } 13997b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ bool signbit(double __x) { return ::__signbit(__x); } 14097b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float sin(float __x) { return ::sinf(__x); } 14197b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float sinh(float __x) { return ::sinhf(__x); } 14297b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float sqrt(float __x) { return ::sqrtf(__x); } 14397b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float tan(float __x) { return ::tanf(__x); } 14497b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot__DEVICE__ float tanh(float __x) { return ::tanhf(__x); } 14597b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot 14697b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#undef __DEVICE__ 14797b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot 14897b4cb95e04a1691ace7dce93d6a66c48041ca9android-build-team Robot#endif 149