1 /*===- __clang_math_forward_declares.h - Prototypes of __device__ math fns --=== 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to deal 5 * in the Software without restriction, including without limitation the rights 6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 * copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 * THE SOFTWARE. 20 * 21 *===-----------------------------------------------------------------------=== 22 */ 23 #ifndef __CLANG__CUDA_MATH_FORWARD_DECLARES_H__ 24 #define __CLANG__CUDA_MATH_FORWARD_DECLARES_H__ 25 #ifndef __CUDA__ 26 #error "This file is for CUDA compilation only." 27 #endif 28 29 // This file forward-declares of some math functions we (or the CUDA headers) 30 // will define later. We need to do this, and do it before cmath is included, 31 // because the standard library may have constexpr math functions. In the 32 // absence of a prior __device__ decl, those constexpr functions may become 33 // implicitly host+device. host+device functions can't be overloaded, so that 34 // would preclude the use of our own __device__ overloads for these functions. 35 36 #pragma push_macro("__DEVICE__") 37 #define __DEVICE__ \ 38 static __inline__ __attribute__((always_inline)) __attribute__((device)) 39 40 __DEVICE__ double abs(double); 41 __DEVICE__ float abs(float); 42 __DEVICE__ int abs(int); 43 __DEVICE__ long abs(long); 44 __DEVICE__ long long abs(long long); 45 __DEVICE__ double acos(double); 46 __DEVICE__ float acos(float); 47 __DEVICE__ double acosh(double); 48 __DEVICE__ float acosh(float); 49 __DEVICE__ double asin(double); 50 __DEVICE__ float asin(float); 51 __DEVICE__ double asinh(double); 52 __DEVICE__ float asinh(float); 53 __DEVICE__ double atan2(double, double); 54 __DEVICE__ float atan2(float, float); 55 __DEVICE__ double atan(double); 56 __DEVICE__ float atan(float); 57 __DEVICE__ double atanh(double); 58 __DEVICE__ float atanh(float); 59 __DEVICE__ double cbrt(double); 60 __DEVICE__ float cbrt(float); 61 __DEVICE__ double ceil(double); 62 __DEVICE__ float ceil(float); 63 __DEVICE__ double copysign(double, double); 64 __DEVICE__ float copysign(float, float); 65 __DEVICE__ double cos(double); 66 __DEVICE__ float cos(float); 67 __DEVICE__ double cosh(double); 68 __DEVICE__ float cosh(float); 69 __DEVICE__ double erfc(double); 70 __DEVICE__ float erfc(float); 71 __DEVICE__ double erf(double); 72 __DEVICE__ float erf(float); 73 __DEVICE__ double exp2(double); 74 __DEVICE__ float exp2(float); 75 __DEVICE__ double exp(double); 76 __DEVICE__ float exp(float); 77 __DEVICE__ double expm1(double); 78 __DEVICE__ float expm1(float); 79 __DEVICE__ double fabs(double); 80 __DEVICE__ float fabs(float); 81 __DEVICE__ double fdim(double, double); 82 __DEVICE__ float fdim(float, float); 83 __DEVICE__ double floor(double); 84 __DEVICE__ float floor(float); 85 __DEVICE__ double fma(double, double, double); 86 __DEVICE__ float fma(float, float, float); 87 __DEVICE__ double fmax(double, double); 88 __DEVICE__ float fmax(float, float); 89 __DEVICE__ double fmin(double, double); 90 __DEVICE__ float fmin(float, float); 91 __DEVICE__ double fmod(double, double); 92 __DEVICE__ float fmod(float, float); 93 __DEVICE__ int fpclassify(double); 94 __DEVICE__ int fpclassify(float); 95 __DEVICE__ double frexp(double, int *); 96 __DEVICE__ float frexp(float, int *); 97 __DEVICE__ double hypot(double, double); 98 __DEVICE__ float hypot(float, float); 99 __DEVICE__ int ilogb(double); 100 __DEVICE__ int ilogb(float); 101 __DEVICE__ bool isfinite(double); 102 __DEVICE__ bool isfinite(float); 103 __DEVICE__ bool isgreater(double, double); 104 __DEVICE__ bool isgreaterequal(double, double); 105 __DEVICE__ bool isgreaterequal(float, float); 106 __DEVICE__ bool isgreater(float, float); 107 __DEVICE__ bool isinf(double); 108 __DEVICE__ bool isinf(float); 109 __DEVICE__ bool isless(double, double); 110 __DEVICE__ bool islessequal(double, double); 111 __DEVICE__ bool islessequal(float, float); 112 __DEVICE__ bool isless(float, float); 113 __DEVICE__ bool islessgreater(double, double); 114 __DEVICE__ bool islessgreater(float, float); 115 __DEVICE__ bool isnan(double); 116 __DEVICE__ bool isnan(float); 117 __DEVICE__ bool isnormal(double); 118 __DEVICE__ bool isnormal(float); 119 __DEVICE__ bool isunordered(double, double); 120 __DEVICE__ bool isunordered(float, float); 121 __DEVICE__ long labs(long); 122 __DEVICE__ double ldexp(double, int); 123 __DEVICE__ float ldexp(float, int); 124 __DEVICE__ double lgamma(double); 125 __DEVICE__ float lgamma(float); 126 __DEVICE__ long long llabs(long long); 127 __DEVICE__ long long llrint(double); 128 __DEVICE__ long long llrint(float); 129 __DEVICE__ double log10(double); 130 __DEVICE__ float log10(float); 131 __DEVICE__ double log1p(double); 132 __DEVICE__ float log1p(float); 133 __DEVICE__ double log2(double); 134 __DEVICE__ float log2(float); 135 __DEVICE__ double logb(double); 136 __DEVICE__ float logb(float); 137 __DEVICE__ double log(double); 138 __DEVICE__ float log(float); 139 __DEVICE__ long lrint(double); 140 __DEVICE__ long lrint(float); 141 __DEVICE__ long lround(double); 142 __DEVICE__ long lround(float); 143 __DEVICE__ long long llround(float); // No llround(double). 144 __DEVICE__ double modf(double, double *); 145 __DEVICE__ float modf(float, float *); 146 __DEVICE__ double nan(const char *); 147 __DEVICE__ float nanf(const char *); 148 __DEVICE__ double nearbyint(double); 149 __DEVICE__ float nearbyint(float); 150 __DEVICE__ double nextafter(double, double); 151 __DEVICE__ float nextafter(float, float); 152 __DEVICE__ double pow(double, double); 153 __DEVICE__ double pow(double, int); 154 __DEVICE__ float pow(float, float); 155 __DEVICE__ float pow(float, int); 156 __DEVICE__ double remainder(double, double); 157 __DEVICE__ float remainder(float, float); 158 __DEVICE__ double remquo(double, double, int *); 159 __DEVICE__ float remquo(float, float, int *); 160 __DEVICE__ double rint(double); 161 __DEVICE__ float rint(float); 162 __DEVICE__ double round(double); 163 __DEVICE__ float round(float); 164 __DEVICE__ double scalbln(double, long); 165 __DEVICE__ float scalbln(float, long); 166 __DEVICE__ double scalbn(double, int); 167 __DEVICE__ float scalbn(float, int); 168 __DEVICE__ bool signbit(double); 169 __DEVICE__ bool signbit(float); 170 __DEVICE__ double sin(double); 171 __DEVICE__ float sin(float); 172 __DEVICE__ double sinh(double); 173 __DEVICE__ float sinh(float); 174 __DEVICE__ double sqrt(double); 175 __DEVICE__ float sqrt(float); 176 __DEVICE__ double tan(double); 177 __DEVICE__ float tan(float); 178 __DEVICE__ double tanh(double); 179 __DEVICE__ float tanh(float); 180 __DEVICE__ double tgamma(double); 181 __DEVICE__ float tgamma(float); 182 __DEVICE__ double trunc(double); 183 __DEVICE__ float trunc(float); 184 185 // Notably missing above is nexttoward, which we don't define on 186 // the device side because libdevice doesn't give us an implementation, and we 187 // don't want to be in the business of writing one ourselves. 188 189 // We need to define these overloads in exactly the namespace our standard 190 // library uses (including the right inline namespace), otherwise they won't be 191 // picked up by other functions in the standard library (e.g. functions in 192 // <complex>). Thus the ugliness below. 193 #ifdef _LIBCPP_BEGIN_NAMESPACE_STD 194 _LIBCPP_BEGIN_NAMESPACE_STD 195 #else 196 namespace std { 197 #ifdef _GLIBCXX_BEGIN_NAMESPACE_VERSION 198 _GLIBCXX_BEGIN_NAMESPACE_VERSION 199 #endif 200 #endif 201 202 using ::abs; 203 using ::acos; 204 using ::acosh; 205 using ::asin; 206 using ::asinh; 207 using ::atan; 208 using ::atan2; 209 using ::atanh; 210 using ::cbrt; 211 using ::ceil; 212 using ::copysign; 213 using ::cos; 214 using ::cosh; 215 using ::erf; 216 using ::erfc; 217 using ::exp; 218 using ::exp2; 219 using ::expm1; 220 using ::fabs; 221 using ::fdim; 222 using ::floor; 223 using ::fma; 224 using ::fmax; 225 using ::fmin; 226 using ::fmod; 227 using ::fpclassify; 228 using ::frexp; 229 using ::hypot; 230 using ::ilogb; 231 using ::isfinite; 232 using ::isgreater; 233 using ::isgreaterequal; 234 using ::isinf; 235 using ::isless; 236 using ::islessequal; 237 using ::islessgreater; 238 using ::isnan; 239 using ::isnormal; 240 using ::isunordered; 241 using ::labs; 242 using ::ldexp; 243 using ::lgamma; 244 using ::llabs; 245 using ::llrint; 246 using ::log; 247 using ::log10; 248 using ::log1p; 249 using ::log2; 250 using ::logb; 251 using ::lrint; 252 using ::lround; 253 using ::llround; 254 using ::modf; 255 using ::nan; 256 using ::nanf; 257 using ::nearbyint; 258 using ::nextafter; 259 using ::pow; 260 using ::remainder; 261 using ::remquo; 262 using ::rint; 263 using ::round; 264 using ::scalbln; 265 using ::scalbn; 266 using ::signbit; 267 using ::sin; 268 using ::sinh; 269 using ::sqrt; 270 using ::tan; 271 using ::tanh; 272 using ::tgamma; 273 using ::trunc; 274 275 #ifdef _LIBCPP_END_NAMESPACE_STD 276 _LIBCPP_END_NAMESPACE_STD 277 #else 278 #ifdef _GLIBCXX_BEGIN_NAMESPACE_VERSION 279 _GLIBCXX_END_NAMESPACE_VERSION 280 #endif 281 } // namespace std 282 #endif 283 284 #pragma pop_macro("__DEVICE__") 285 286 #endif 287