|  | /*===---- __clang_cuda_cmath.h - Device-side CUDA cmath support ------------=== | 
|  | * | 
|  | * Permission is hereby granted, free of charge, to any person obtaining a copy | 
|  | * of this software and associated documentation files (the "Software"), to deal | 
|  | * in the Software without restriction, including without limitation the rights | 
|  | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
|  | * copies of the Software, and to permit persons to whom the Software is | 
|  | * furnished to do so, subject to the following conditions: | 
|  | * | 
|  | * The above copyright notice and this permission notice shall be included in | 
|  | * all copies or substantial portions of the Software. | 
|  | * | 
|  | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
|  | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
|  | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
|  | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
|  | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|  | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
|  | * THE SOFTWARE. | 
|  | * | 
|  | *===-----------------------------------------------------------------------=== | 
|  | */ | 
|  | #ifndef __CLANG_CUDA_CMATH_H__ | 
|  | #define __CLANG_CUDA_CMATH_H__ | 
|  | #ifndef __CUDA__ | 
|  | #error "This file is for CUDA compilation only." | 
|  | #endif | 
|  |  | 
|  | // CUDA allows using math functions form std:: on device side.  This | 
|  | // file provides __device__ overloads for math functions that map to | 
|  | // appropriate math functions provided by CUDA headers or to compiler | 
|  | // builtins if CUDA does not provide a suitable function. | 
|  |  | 
|  | #define __DEVICE__ static __device__ __inline__ __attribute__((always_inline)) | 
|  |  | 
|  | namespace std { | 
|  | __DEVICE__ long long abs(long long __n) { return ::llabs(__n); } | 
|  | __DEVICE__ long abs(long __n) { return ::labs(__n); } | 
|  | using ::abs; | 
|  | __DEVICE__ float abs(float __x) { return ::fabsf(__x); } | 
|  | __DEVICE__ double abs(double __x) { return ::fabs(__x); } | 
|  | __DEVICE__ float acos(float __x) { return ::acosf(__x); } | 
|  | using ::acos; | 
|  | using ::acosh; | 
|  | __DEVICE__ float asin(float __x) { return ::asinf(__x); } | 
|  | using ::asin; | 
|  | using ::asinh; | 
|  | __DEVICE__ float atan(float __x) { return ::atanf(__x); } | 
|  | using ::atan; | 
|  | __DEVICE__ float atan2(float __x, float __y) { return ::atan2f(__x, __y); } | 
|  | using ::atan2; | 
|  | using ::atanh; | 
|  | using ::cbrt; | 
|  | __DEVICE__ float ceil(float __x) { return ::ceilf(__x); } | 
|  | using ::ceil; | 
|  | using ::copysign; | 
|  | __DEVICE__ float cos(float __x) { return ::cosf(__x); } | 
|  | using ::cos; | 
|  | __DEVICE__ float cosh(float __x) { return ::coshf(__x); } | 
|  | using ::cosh; | 
|  | using ::erf; | 
|  | using ::erfc; | 
|  | __DEVICE__ float exp(float __x) { return ::expf(__x); } | 
|  | using ::exp; | 
|  | using ::exp2; | 
|  | using ::expm1; | 
|  | __DEVICE__ float fabs(float __x) { return ::fabsf(__x); } | 
|  | using ::fabs; | 
|  | using ::fdim; | 
|  | __DEVICE__ float floor(float __x) { return ::floorf(__x); } | 
|  | using ::floor; | 
|  | using ::fma; | 
|  | using ::fmax; | 
|  | using ::fmin; | 
|  | __DEVICE__ float fmod(float __x, float __y) { return ::fmodf(__x, __y); } | 
|  | using ::fmod; | 
|  | __DEVICE__ int fpclassify(float __x) { | 
|  | return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, | 
|  | FP_ZERO, __x); | 
|  | } | 
|  | __DEVICE__ int fpclassify(double __x) { | 
|  | return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, | 
|  | FP_ZERO, __x); | 
|  | } | 
|  | __DEVICE__ float frexp(float __arg, int *__exp) { | 
|  | return ::frexpf(__arg, __exp); | 
|  | } | 
|  | using ::frexp; | 
|  | using ::hypot; | 
|  | using ::ilogb; | 
|  | __DEVICE__ bool isfinite(float __x) { return ::__finitef(__x); } | 
|  | __DEVICE__ bool isfinite(double __x) { return ::__finite(__x); } | 
|  | __DEVICE__ bool isgreater(float __x, float __y) { | 
|  | return __builtin_isgreater(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isgreater(double __x, double __y) { | 
|  | return __builtin_isgreater(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isgreaterequal(float __x, float __y) { | 
|  | return __builtin_isgreaterequal(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isgreaterequal(double __x, double __y) { | 
|  | return __builtin_isgreaterequal(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isinf(float __x) { return ::__isinff(__x); } | 
|  | __DEVICE__ bool isinf(double __x) { return ::__isinf(__x); } | 
|  | __DEVICE__ bool isless(float __x, float __y) { | 
|  | return __builtin_isless(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isless(double __x, double __y) { | 
|  | return __builtin_isless(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool islessequal(float __x, float __y) { | 
|  | return __builtin_islessequal(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool islessequal(double __x, double __y) { | 
|  | return __builtin_islessequal(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool islessgreater(float __x, float __y) { | 
|  | return __builtin_islessgreater(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool islessgreater(double __x, double __y) { | 
|  | return __builtin_islessgreater(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isnan(float __x) { return ::__isnanf(__x); } | 
|  | __DEVICE__ bool isnan(double __x) { return ::__isnan(__x); } | 
|  | __DEVICE__ bool isnormal(float __x) { return __builtin_isnormal(__x); } | 
|  | __DEVICE__ bool isnormal(double __x) { return __builtin_isnormal(__x); } | 
|  | __DEVICE__ bool isunordered(float __x, float __y) { | 
|  | return __builtin_isunordered(__x, __y); | 
|  | } | 
|  | __DEVICE__ bool isunordered(double __x, double __y) { | 
|  | return __builtin_isunordered(__x, __y); | 
|  | } | 
|  | using ::labs; | 
|  | __DEVICE__ float ldexp(float __arg, int __exp) { | 
|  | return ::ldexpf(__arg, __exp); | 
|  | } | 
|  | using ::ldexp; | 
|  | using ::lgamma; | 
|  | using ::llabs; | 
|  | using ::llrint; | 
|  | __DEVICE__ float log(float __x) { return ::logf(__x); } | 
|  | using ::log; | 
|  | __DEVICE__ float log10(float __x) { return ::log10f(__x); } | 
|  | using ::log10; | 
|  | using ::log1p; | 
|  | using ::log2; | 
|  | using ::logb; | 
|  | using ::lrint; | 
|  | using ::lround; | 
|  | __DEVICE__ float modf(float __x, float *__iptr) { return ::modff(__x, __iptr); } | 
|  | using ::modf; | 
|  | using ::nan; | 
|  | using ::nanf; | 
|  | using ::nearbyint; | 
|  | using ::nextafter; | 
|  | __DEVICE__ float nexttoward(float __from, float __to) { | 
|  | return __builtin_nexttowardf(from, to); | 
|  | } | 
|  | __DEVICE__ double nexttoward(double __from, double __to) { | 
|  | return __builtin_nexttoward(__from, __to); | 
|  | } | 
|  | using ::pow; | 
|  | __DEVICE__ float pow(float __base, float __exp) { | 
|  | return ::powf(__base, __exp); | 
|  | } | 
|  | __DEVICE__ float pow(float __base, int __iexp) { | 
|  | return ::powif(__base, __iexp); | 
|  | } | 
|  | __DEVICE__ double pow(double __base, int __iexp) { | 
|  | return ::powi(__base, __iexp); | 
|  | } | 
|  | using ::remainder; | 
|  | using ::remquo; | 
|  | using ::rint; | 
|  | using ::round; | 
|  | using ::scalbln; | 
|  | using ::scalbn; | 
|  | __DEVICE__ bool signbit(float __x) { return ::__signbitf(__x); } | 
|  | __DEVICE__ bool signbit(double __x) { return ::__signbit(__x); } | 
|  | __DEVICE__ float sin(float __x) { return ::sinf(__x); } | 
|  | using ::sin; | 
|  | __DEVICE__ float sinh(float __x) { return ::sinhf(__x); } | 
|  | using ::sinh; | 
|  | __DEVICE__ float sqrt(float __x) { return ::sqrtf(__x); } | 
|  | using ::sqrt; | 
|  | __DEVICE__ float tan(float __x) { return ::tanf(__x); } | 
|  | using ::tan; | 
|  | __DEVICE__ float tanh(float __x) { return ::tanhf(__x); } | 
|  | using ::tanh; | 
|  | using ::tgamma; | 
|  | using ::trunc; | 
|  |  | 
|  | } // namespace std | 
|  |  | 
|  | #endif |