Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
/*===- __clang_math_forward_declares.h - Prototypes of __device__ math fns --===
2
 *
3
 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
 * See https://llvm.org/LICENSE.txt for license information.
5
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
 *
7
 *===-----------------------------------------------------------------------===
8
 */
9
#ifndef __CLANG__CUDA_MATH_FORWARD_DECLARES_H__
10
#define __CLANG__CUDA_MATH_FORWARD_DECLARES_H__
11
#if !defined(__CUDA__) && !__HIP__
12
#error "This file is for CUDA/HIP compilation only."
13
#endif
14
 
15
// This file forward-declares of some math functions we (or the CUDA headers)
16
// will define later.  We need to do this, and do it before cmath is included,
17
// because the standard library may have constexpr math functions.  In the
18
// absence of a prior __device__ decl, those constexpr functions may become
19
// implicitly host+device.  host+device functions can't be overloaded, so that
20
// would preclude the use of our own __device__ overloads for these functions.
21
 
22
#pragma push_macro("__DEVICE__")
23
#define __DEVICE__                                                             \
24
  static __inline__ __attribute__((always_inline)) __attribute__((device))
25
 
26
__DEVICE__ long abs(long);
27
__DEVICE__ long long abs(long long);
28
__DEVICE__ double abs(double);
29
__DEVICE__ float abs(float);
30
__DEVICE__ int abs(int);
31
__DEVICE__ double acos(double);
32
__DEVICE__ float acos(float);
33
__DEVICE__ double acosh(double);
34
__DEVICE__ float acosh(float);
35
__DEVICE__ double asin(double);
36
__DEVICE__ float asin(float);
37
__DEVICE__ double asinh(double);
38
__DEVICE__ float asinh(float);
39
__DEVICE__ double atan2(double, double);
40
__DEVICE__ float atan2(float, float);
41
__DEVICE__ double atan(double);
42
__DEVICE__ float atan(float);
43
__DEVICE__ double atanh(double);
44
__DEVICE__ float atanh(float);
45
__DEVICE__ double cbrt(double);
46
__DEVICE__ float cbrt(float);
47
__DEVICE__ double ceil(double);
48
__DEVICE__ float ceil(float);
49
__DEVICE__ double copysign(double, double);
50
__DEVICE__ float copysign(float, float);
51
__DEVICE__ double cos(double);
52
__DEVICE__ float cos(float);
53
__DEVICE__ double cosh(double);
54
__DEVICE__ float cosh(float);
55
__DEVICE__ double erfc(double);
56
__DEVICE__ float erfc(float);
57
__DEVICE__ double erf(double);
58
__DEVICE__ float erf(float);
59
__DEVICE__ double exp2(double);
60
__DEVICE__ float exp2(float);
61
__DEVICE__ double exp(double);
62
__DEVICE__ float exp(float);
63
__DEVICE__ double expm1(double);
64
__DEVICE__ float expm1(float);
65
__DEVICE__ double fabs(double);
66
__DEVICE__ float fabs(float);
67
__DEVICE__ double fdim(double, double);
68
__DEVICE__ float fdim(float, float);
69
__DEVICE__ double floor(double);
70
__DEVICE__ float floor(float);
71
__DEVICE__ double fma(double, double, double);
72
__DEVICE__ float fma(float, float, float);
73
__DEVICE__ double fmax(double, double);
74
__DEVICE__ float fmax(float, float);
75
__DEVICE__ double fmin(double, double);
76
__DEVICE__ float fmin(float, float);
77
__DEVICE__ double fmod(double, double);
78
__DEVICE__ float fmod(float, float);
79
__DEVICE__ int fpclassify(double);
80
__DEVICE__ int fpclassify(float);
81
__DEVICE__ double frexp(double, int *);
82
__DEVICE__ float frexp(float, int *);
83
__DEVICE__ double hypot(double, double);
84
__DEVICE__ float hypot(float, float);
85
__DEVICE__ int ilogb(double);
86
__DEVICE__ int ilogb(float);
87
#ifdef _MSC_VER
88
__DEVICE__ bool isfinite(long double);
89
#endif
90
__DEVICE__ bool isfinite(double);
91
__DEVICE__ bool isfinite(float);
92
__DEVICE__ bool isgreater(double, double);
93
__DEVICE__ bool isgreaterequal(double, double);
94
__DEVICE__ bool isgreaterequal(float, float);
95
__DEVICE__ bool isgreater(float, float);
96
#ifdef _MSC_VER
97
__DEVICE__ bool isinf(long double);
98
#endif
99
__DEVICE__ bool isinf(double);
100
__DEVICE__ bool isinf(float);
101
__DEVICE__ bool isless(double, double);
102
__DEVICE__ bool islessequal(double, double);
103
__DEVICE__ bool islessequal(float, float);
104
__DEVICE__ bool isless(float, float);
105
__DEVICE__ bool islessgreater(double, double);
106
__DEVICE__ bool islessgreater(float, float);
107
#ifdef _MSC_VER
108
__DEVICE__ bool isnan(long double);
109
#endif
110
__DEVICE__ bool isnan(double);
111
__DEVICE__ bool isnan(float);
112
__DEVICE__ bool isnormal(double);
113
__DEVICE__ bool isnormal(float);
114
__DEVICE__ bool isunordered(double, double);
115
__DEVICE__ bool isunordered(float, float);
116
__DEVICE__ long labs(long);
117
__DEVICE__ double ldexp(double, int);
118
__DEVICE__ float ldexp(float, int);
119
__DEVICE__ double lgamma(double);
120
__DEVICE__ float lgamma(float);
121
__DEVICE__ long long llabs(long long);
122
__DEVICE__ long long llrint(double);
123
__DEVICE__ long long llrint(float);
124
__DEVICE__ double log10(double);
125
__DEVICE__ float log10(float);
126
__DEVICE__ double log1p(double);
127
__DEVICE__ float log1p(float);
128
__DEVICE__ double log2(double);
129
__DEVICE__ float log2(float);
130
__DEVICE__ double logb(double);
131
__DEVICE__ float logb(float);
132
__DEVICE__ double log(double);
133
__DEVICE__ float log(float);
134
__DEVICE__ long lrint(double);
135
__DEVICE__ long lrint(float);
136
__DEVICE__ long lround(double);
137
__DEVICE__ long lround(float);
138
__DEVICE__ long long llround(float); // No llround(double).
139
__DEVICE__ double modf(double, double *);
140
__DEVICE__ float modf(float, float *);
141
__DEVICE__ double nan(const char *);
142
__DEVICE__ float nanf(const char *);
143
__DEVICE__ double nearbyint(double);
144
__DEVICE__ float nearbyint(float);
145
__DEVICE__ double nextafter(double, double);
146
__DEVICE__ float nextafter(float, float);
147
__DEVICE__ double pow(double, double);
148
__DEVICE__ double pow(double, int);
149
__DEVICE__ float pow(float, float);
150
__DEVICE__ float pow(float, int);
151
__DEVICE__ double remainder(double, double);
152
__DEVICE__ float remainder(float, float);
153
__DEVICE__ double remquo(double, double, int *);
154
__DEVICE__ float remquo(float, float, int *);
155
__DEVICE__ double rint(double);
156
__DEVICE__ float rint(float);
157
__DEVICE__ double round(double);
158
__DEVICE__ float round(float);
159
__DEVICE__ double scalbln(double, long);
160
__DEVICE__ float scalbln(float, long);
161
__DEVICE__ double scalbn(double, int);
162
__DEVICE__ float scalbn(float, int);
163
#ifdef _MSC_VER
164
__DEVICE__ bool signbit(long double);
165
#endif
166
__DEVICE__ bool signbit(double);
167
__DEVICE__ bool signbit(float);
168
__DEVICE__ double sin(double);
169
__DEVICE__ float sin(float);
170
__DEVICE__ double sinh(double);
171
__DEVICE__ float sinh(float);
172
__DEVICE__ double sqrt(double);
173
__DEVICE__ float sqrt(float);
174
__DEVICE__ double tan(double);
175
__DEVICE__ float tan(float);
176
__DEVICE__ double tanh(double);
177
__DEVICE__ float tanh(float);
178
__DEVICE__ double tgamma(double);
179
__DEVICE__ float tgamma(float);
180
__DEVICE__ double trunc(double);
181
__DEVICE__ float trunc(float);
182
 
183
// Notably missing above is nexttoward, which we don't define on
184
// the device side because libdevice doesn't give us an implementation, and we
185
// don't want to be in the business of writing one ourselves.
186
 
187
// We need to define these overloads in exactly the namespace our standard
188
// library uses (including the right inline namespace), otherwise they won't be
189
// picked up by other functions in the standard library (e.g. functions in
190
// <complex>).  Thus the ugliness below.
191
#ifdef _LIBCPP_BEGIN_NAMESPACE_STD
192
_LIBCPP_BEGIN_NAMESPACE_STD
193
#else
194
namespace std {
195
#ifdef _GLIBCXX_BEGIN_NAMESPACE_VERSION
196
_GLIBCXX_BEGIN_NAMESPACE_VERSION
197
#endif
198
#endif
199
 
200
using ::abs;
201
using ::acos;
202
using ::acosh;
203
using ::asin;
204
using ::asinh;
205
using ::atan;
206
using ::atan2;
207
using ::atanh;
208
using ::cbrt;
209
using ::ceil;
210
using ::copysign;
211
using ::cos;
212
using ::cosh;
213
using ::erf;
214
using ::erfc;
215
using ::exp;
216
using ::exp2;
217
using ::expm1;
218
using ::fabs;
219
using ::fdim;
220
using ::floor;
221
using ::fma;
222
using ::fmax;
223
using ::fmin;
224
using ::fmod;
225
using ::fpclassify;
226
using ::frexp;
227
using ::hypot;
228
using ::ilogb;
229
using ::isfinite;
230
using ::isgreater;
231
using ::isgreaterequal;
232
using ::isinf;
233
using ::isless;
234
using ::islessequal;
235
using ::islessgreater;
236
using ::isnan;
237
using ::isnormal;
238
using ::isunordered;
239
using ::labs;
240
using ::ldexp;
241
using ::lgamma;
242
using ::llabs;
243
using ::llrint;
244
using ::log;
245
using ::log10;
246
using ::log1p;
247
using ::log2;
248
using ::logb;
249
using ::lrint;
250
using ::lround;
251
using ::llround;
252
using ::modf;
253
using ::nan;
254
using ::nanf;
255
using ::nearbyint;
256
using ::nextafter;
257
using ::pow;
258
using ::remainder;
259
using ::remquo;
260
using ::rint;
261
using ::round;
262
using ::scalbln;
263
using ::scalbn;
264
using ::signbit;
265
using ::sin;
266
using ::sinh;
267
using ::sqrt;
268
using ::tan;
269
using ::tanh;
270
using ::tgamma;
271
using ::trunc;
272
 
273
#ifdef _LIBCPP_END_NAMESPACE_STD
274
_LIBCPP_END_NAMESPACE_STD
275
#else
276
#ifdef _GLIBCXX_BEGIN_NAMESPACE_VERSION
277
_GLIBCXX_END_NAMESPACE_VERSION
278
#endif
279
} // namespace std
280
#endif
281
 
282
#pragma pop_macro("__DEVICE__")
283
 
284
#endif