annotate clang/lib/Headers/__clang_cuda_cmath.h @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 /*===---- __clang_cuda_cmath.h - Device-side CUDA cmath support ------------===
anatofuz
parents:
diff changeset
2 *
anatofuz
parents:
diff changeset
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 * See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 *
anatofuz
parents:
diff changeset
7 *===-----------------------------------------------------------------------===
anatofuz
parents:
diff changeset
8 */
anatofuz
parents:
diff changeset
9 #ifndef __CLANG_CUDA_CMATH_H__
anatofuz
parents:
diff changeset
10 #define __CLANG_CUDA_CMATH_H__
anatofuz
parents:
diff changeset
11 #ifndef __CUDA__
anatofuz
parents:
diff changeset
12 #error "This file is for CUDA compilation only."
anatofuz
parents:
diff changeset
13 #endif
anatofuz
parents:
diff changeset
14
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 #ifndef _OPENMP
150
anatofuz
parents:
diff changeset
16 #include <limits>
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
17 #endif
150
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 // CUDA lets us use various std math functions on the device side. This file
anatofuz
parents:
diff changeset
20 // works in concert with __clang_cuda_math_forward_declares.h to make this work.
anatofuz
parents:
diff changeset
21 //
anatofuz
parents:
diff changeset
22 // Specifically, the forward-declares header declares __device__ overloads for
anatofuz
parents:
diff changeset
23 // these functions in the global namespace, then pulls them into namespace std
anatofuz
parents:
diff changeset
24 // with 'using' statements. Then this file implements those functions, after
anatofuz
parents:
diff changeset
25 // their implementations have been pulled in.
anatofuz
parents:
diff changeset
26 //
anatofuz
parents:
diff changeset
27 // It's important that we declare the functions in the global namespace and pull
anatofuz
parents:
diff changeset
28 // them into namespace std with using statements, as opposed to simply declaring
anatofuz
parents:
diff changeset
29 // these functions in namespace std, because our device functions need to
anatofuz
parents:
diff changeset
30 // overload the standard library functions, which may be declared in the global
anatofuz
parents:
diff changeset
31 // namespace or in std, depending on the degree of conformance of the stdlib
anatofuz
parents:
diff changeset
32 // implementation. Declaring in the global namespace and pulling into namespace
anatofuz
parents:
diff changeset
33 // std covers all of the known knowns.
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 #ifdef _OPENMP
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 #define __DEVICE__ static constexpr __attribute__((always_inline, nothrow))
150
anatofuz
parents:
diff changeset
37 #else
anatofuz
parents:
diff changeset
38 #define __DEVICE__ static __device__ __inline__ __attribute__((always_inline))
anatofuz
parents:
diff changeset
39 #endif
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 __DEVICE__ long long abs(long long __n) { return ::llabs(__n); }
anatofuz
parents:
diff changeset
42 __DEVICE__ long abs(long __n) { return ::labs(__n); }
anatofuz
parents:
diff changeset
43 __DEVICE__ float abs(float __x) { return ::fabsf(__x); }
anatofuz
parents:
diff changeset
44 __DEVICE__ double abs(double __x) { return ::fabs(__x); }
anatofuz
parents:
diff changeset
45 __DEVICE__ float acos(float __x) { return ::acosf(__x); }
anatofuz
parents:
diff changeset
46 __DEVICE__ float asin(float __x) { return ::asinf(__x); }
anatofuz
parents:
diff changeset
47 __DEVICE__ float atan(float __x) { return ::atanf(__x); }
anatofuz
parents:
diff changeset
48 __DEVICE__ float atan2(float __x, float __y) { return ::atan2f(__x, __y); }
anatofuz
parents:
diff changeset
49 __DEVICE__ float ceil(float __x) { return ::ceilf(__x); }
anatofuz
parents:
diff changeset
50 __DEVICE__ float cos(float __x) { return ::cosf(__x); }
anatofuz
parents:
diff changeset
51 __DEVICE__ float cosh(float __x) { return ::coshf(__x); }
anatofuz
parents:
diff changeset
52 __DEVICE__ float exp(float __x) { return ::expf(__x); }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
53 __DEVICE__ float fabs(float __x) { return ::fabsf(__x); }
150
anatofuz
parents:
diff changeset
54 __DEVICE__ float floor(float __x) { return ::floorf(__x); }
anatofuz
parents:
diff changeset
55 __DEVICE__ float fmod(float __x, float __y) { return ::fmodf(__x, __y); }
anatofuz
parents:
diff changeset
56 __DEVICE__ int fpclassify(float __x) {
anatofuz
parents:
diff changeset
57 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL,
anatofuz
parents:
diff changeset
58 FP_ZERO, __x);
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60 __DEVICE__ int fpclassify(double __x) {
anatofuz
parents:
diff changeset
61 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL,
anatofuz
parents:
diff changeset
62 FP_ZERO, __x);
anatofuz
parents:
diff changeset
63 }
anatofuz
parents:
diff changeset
64 __DEVICE__ float frexp(float __arg, int *__exp) {
anatofuz
parents:
diff changeset
65 return ::frexpf(__arg, __exp);
anatofuz
parents:
diff changeset
66 }
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 // For inscrutable reasons, the CUDA headers define these functions for us on
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
69 // Windows. For OpenMP we omit these as some old system headers have
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
70 // non-conforming `isinf(float)` and `isnan(float)` implementations that return
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
71 // an `int`. The system versions of these functions should be fine anyway.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
72 #if !defined(_MSC_VER) && !defined(_OPENMP)
150
anatofuz
parents:
diff changeset
73 __DEVICE__ bool isinf(float __x) { return ::__isinff(__x); }
anatofuz
parents:
diff changeset
74 __DEVICE__ bool isinf(double __x) { return ::__isinf(__x); }
anatofuz
parents:
diff changeset
75 __DEVICE__ bool isfinite(float __x) { return ::__finitef(__x); }
anatofuz
parents:
diff changeset
76 // For inscrutable reasons, __finite(), the double-precision version of
anatofuz
parents:
diff changeset
77 // __finitef, does not exist when compiling for MacOS. __isfinited is available
anatofuz
parents:
diff changeset
78 // everywhere and is just as good.
anatofuz
parents:
diff changeset
79 __DEVICE__ bool isfinite(double __x) { return ::__isfinited(__x); }
anatofuz
parents:
diff changeset
80 __DEVICE__ bool isnan(float __x) { return ::__isnanf(__x); }
anatofuz
parents:
diff changeset
81 __DEVICE__ bool isnan(double __x) { return ::__isnan(__x); }
anatofuz
parents:
diff changeset
82 #endif
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 __DEVICE__ bool isgreater(float __x, float __y) {
anatofuz
parents:
diff changeset
85 return __builtin_isgreater(__x, __y);
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87 __DEVICE__ bool isgreater(double __x, double __y) {
anatofuz
parents:
diff changeset
88 return __builtin_isgreater(__x, __y);
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90 __DEVICE__ bool isgreaterequal(float __x, float __y) {
anatofuz
parents:
diff changeset
91 return __builtin_isgreaterequal(__x, __y);
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93 __DEVICE__ bool isgreaterequal(double __x, double __y) {
anatofuz
parents:
diff changeset
94 return __builtin_isgreaterequal(__x, __y);
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96 __DEVICE__ bool isless(float __x, float __y) {
anatofuz
parents:
diff changeset
97 return __builtin_isless(__x, __y);
anatofuz
parents:
diff changeset
98 }
anatofuz
parents:
diff changeset
99 __DEVICE__ bool isless(double __x, double __y) {
anatofuz
parents:
diff changeset
100 return __builtin_isless(__x, __y);
anatofuz
parents:
diff changeset
101 }
anatofuz
parents:
diff changeset
102 __DEVICE__ bool islessequal(float __x, float __y) {
anatofuz
parents:
diff changeset
103 return __builtin_islessequal(__x, __y);
anatofuz
parents:
diff changeset
104 }
anatofuz
parents:
diff changeset
105 __DEVICE__ bool islessequal(double __x, double __y) {
anatofuz
parents:
diff changeset
106 return __builtin_islessequal(__x, __y);
anatofuz
parents:
diff changeset
107 }
anatofuz
parents:
diff changeset
108 __DEVICE__ bool islessgreater(float __x, float __y) {
anatofuz
parents:
diff changeset
109 return __builtin_islessgreater(__x, __y);
anatofuz
parents:
diff changeset
110 }
anatofuz
parents:
diff changeset
111 __DEVICE__ bool islessgreater(double __x, double __y) {
anatofuz
parents:
diff changeset
112 return __builtin_islessgreater(__x, __y);
anatofuz
parents:
diff changeset
113 }
anatofuz
parents:
diff changeset
114 __DEVICE__ bool isnormal(float __x) { return __builtin_isnormal(__x); }
anatofuz
parents:
diff changeset
115 __DEVICE__ bool isnormal(double __x) { return __builtin_isnormal(__x); }
anatofuz
parents:
diff changeset
116 __DEVICE__ bool isunordered(float __x, float __y) {
anatofuz
parents:
diff changeset
117 return __builtin_isunordered(__x, __y);
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119 __DEVICE__ bool isunordered(double __x, double __y) {
anatofuz
parents:
diff changeset
120 return __builtin_isunordered(__x, __y);
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122 __DEVICE__ float ldexp(float __arg, int __exp) {
anatofuz
parents:
diff changeset
123 return ::ldexpf(__arg, __exp);
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125 __DEVICE__ float log(float __x) { return ::logf(__x); }
anatofuz
parents:
diff changeset
126 __DEVICE__ float log10(float __x) { return ::log10f(__x); }
anatofuz
parents:
diff changeset
127 __DEVICE__ float modf(float __x, float *__iptr) { return ::modff(__x, __iptr); }
anatofuz
parents:
diff changeset
128 __DEVICE__ float pow(float __base, float __exp) {
anatofuz
parents:
diff changeset
129 return ::powf(__base, __exp);
anatofuz
parents:
diff changeset
130 }
anatofuz
parents:
diff changeset
131 __DEVICE__ float pow(float __base, int __iexp) {
anatofuz
parents:
diff changeset
132 return ::powif(__base, __iexp);
anatofuz
parents:
diff changeset
133 }
anatofuz
parents:
diff changeset
134 __DEVICE__ double pow(double __base, int __iexp) {
anatofuz
parents:
diff changeset
135 return ::powi(__base, __iexp);
anatofuz
parents:
diff changeset
136 }
anatofuz
parents:
diff changeset
137 __DEVICE__ bool signbit(float __x) { return ::__signbitf(__x); }
anatofuz
parents:
diff changeset
138 __DEVICE__ bool signbit(double __x) { return ::__signbitd(__x); }
anatofuz
parents:
diff changeset
139 __DEVICE__ float sin(float __x) { return ::sinf(__x); }
anatofuz
parents:
diff changeset
140 __DEVICE__ float sinh(float __x) { return ::sinhf(__x); }
anatofuz
parents:
diff changeset
141 __DEVICE__ float sqrt(float __x) { return ::sqrtf(__x); }
anatofuz
parents:
diff changeset
142 __DEVICE__ float tan(float __x) { return ::tanf(__x); }
anatofuz
parents:
diff changeset
143 __DEVICE__ float tanh(float __x) { return ::tanhf(__x); }
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 // Notably missing above is nexttoward. We omit it because
anatofuz
parents:
diff changeset
146 // libdevice doesn't provide an implementation, and we don't want to be in the
anatofuz
parents:
diff changeset
147 // business of implementing tricky libm functions in this header.
anatofuz
parents:
diff changeset
148
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
149 #ifndef _OPENMP
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
150
150
anatofuz
parents:
diff changeset
151 // Now we've defined everything we promised we'd define in
anatofuz
parents:
diff changeset
152 // __clang_cuda_math_forward_declares.h. We need to do two additional things to
anatofuz
parents:
diff changeset
153 // fix up our math functions.
anatofuz
parents:
diff changeset
154 //
anatofuz
parents:
diff changeset
155 // 1) Define __device__ overloads for e.g. sin(int). The CUDA headers define
anatofuz
parents:
diff changeset
156 // only sin(float) and sin(double), which means that e.g. sin(0) is
anatofuz
parents:
diff changeset
157 // ambiguous.
anatofuz
parents:
diff changeset
158 //
anatofuz
parents:
diff changeset
159 // 2) Pull the __device__ overloads of "foobarf" math functions into namespace
anatofuz
parents:
diff changeset
160 // std. These are defined in the CUDA headers in the global namespace,
anatofuz
parents:
diff changeset
161 // independent of everything else we've done here.
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 // We can't use std::enable_if, because we want to be pre-C++11 compatible. But
anatofuz
parents:
diff changeset
164 // we go ahead and unconditionally define functions that are only available when
anatofuz
parents:
diff changeset
165 // compiling for C++11 to match the behavior of the CUDA headers.
anatofuz
parents:
diff changeset
166 template<bool __B, class __T = void>
anatofuz
parents:
diff changeset
167 struct __clang_cuda_enable_if {};
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 template <class __T> struct __clang_cuda_enable_if<true, __T> {
anatofuz
parents:
diff changeset
170 typedef __T type;
anatofuz
parents:
diff changeset
171 };
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 // Defines an overload of __fn that accepts one integral argument, calls
anatofuz
parents:
diff changeset
174 // __fn((double)x), and returns __retty.
anatofuz
parents:
diff changeset
175 #define __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(__retty, __fn) \
anatofuz
parents:
diff changeset
176 template <typename __T> \
anatofuz
parents:
diff changeset
177 __DEVICE__ \
anatofuz
parents:
diff changeset
178 typename __clang_cuda_enable_if<std::numeric_limits<__T>::is_integer, \
anatofuz
parents:
diff changeset
179 __retty>::type \
anatofuz
parents:
diff changeset
180 __fn(__T __x) { \
anatofuz
parents:
diff changeset
181 return ::__fn((double)__x); \
anatofuz
parents:
diff changeset
182 }
anatofuz
parents:
diff changeset
183
anatofuz
parents:
diff changeset
184 // Defines an overload of __fn that accepts one two arithmetic arguments, calls
anatofuz
parents:
diff changeset
185 // __fn((double)x, (double)y), and returns a double.
anatofuz
parents:
diff changeset
186 //
anatofuz
parents:
diff changeset
187 // Note this is different from OVERLOAD_1, which generates an overload that
anatofuz
parents:
diff changeset
188 // accepts only *integral* arguments.
anatofuz
parents:
diff changeset
189 #define __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(__retty, __fn) \
anatofuz
parents:
diff changeset
190 template <typename __T1, typename __T2> \
anatofuz
parents:
diff changeset
191 __DEVICE__ typename __clang_cuda_enable_if< \
anatofuz
parents:
diff changeset
192 std::numeric_limits<__T1>::is_specialized && \
anatofuz
parents:
diff changeset
193 std::numeric_limits<__T2>::is_specialized, \
anatofuz
parents:
diff changeset
194 __retty>::type \
anatofuz
parents:
diff changeset
195 __fn(__T1 __x, __T2 __y) { \
anatofuz
parents:
diff changeset
196 return __fn((double)__x, (double)__y); \
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, acos)
anatofuz
parents:
diff changeset
200 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, acosh)
anatofuz
parents:
diff changeset
201 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, asin)
anatofuz
parents:
diff changeset
202 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, asinh)
anatofuz
parents:
diff changeset
203 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, atan)
anatofuz
parents:
diff changeset
204 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, atan2);
anatofuz
parents:
diff changeset
205 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, atanh)
anatofuz
parents:
diff changeset
206 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, cbrt)
anatofuz
parents:
diff changeset
207 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, ceil)
anatofuz
parents:
diff changeset
208 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, copysign);
anatofuz
parents:
diff changeset
209 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, cos)
anatofuz
parents:
diff changeset
210 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, cosh)
anatofuz
parents:
diff changeset
211 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, erf)
anatofuz
parents:
diff changeset
212 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, erfc)
anatofuz
parents:
diff changeset
213 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, exp)
anatofuz
parents:
diff changeset
214 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, exp2)
anatofuz
parents:
diff changeset
215 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, expm1)
anatofuz
parents:
diff changeset
216 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, fabs)
anatofuz
parents:
diff changeset
217 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, fdim);
anatofuz
parents:
diff changeset
218 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, floor)
anatofuz
parents:
diff changeset
219 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, fmax);
anatofuz
parents:
diff changeset
220 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, fmin);
anatofuz
parents:
diff changeset
221 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, fmod);
anatofuz
parents:
diff changeset
222 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(int, fpclassify)
anatofuz
parents:
diff changeset
223 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, hypot);
anatofuz
parents:
diff changeset
224 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(int, ilogb)
anatofuz
parents:
diff changeset
225 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(bool, isfinite)
anatofuz
parents:
diff changeset
226 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(bool, isgreater);
anatofuz
parents:
diff changeset
227 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(bool, isgreaterequal);
anatofuz
parents:
diff changeset
228 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(bool, isinf);
anatofuz
parents:
diff changeset
229 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(bool, isless);
anatofuz
parents:
diff changeset
230 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(bool, islessequal);
anatofuz
parents:
diff changeset
231 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(bool, islessgreater);
anatofuz
parents:
diff changeset
232 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(bool, isnan);
anatofuz
parents:
diff changeset
233 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(bool, isnormal)
anatofuz
parents:
diff changeset
234 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(bool, isunordered);
anatofuz
parents:
diff changeset
235 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, lgamma)
anatofuz
parents:
diff changeset
236 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, log)
anatofuz
parents:
diff changeset
237 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, log10)
anatofuz
parents:
diff changeset
238 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, log1p)
anatofuz
parents:
diff changeset
239 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, log2)
anatofuz
parents:
diff changeset
240 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, logb)
anatofuz
parents:
diff changeset
241 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(long long, llrint)
anatofuz
parents:
diff changeset
242 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(long long, llround)
anatofuz
parents:
diff changeset
243 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(long, lrint)
anatofuz
parents:
diff changeset
244 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(long, lround)
anatofuz
parents:
diff changeset
245 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, nearbyint);
anatofuz
parents:
diff changeset
246 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, nextafter);
anatofuz
parents:
diff changeset
247 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, pow);
anatofuz
parents:
diff changeset
248 __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, remainder);
anatofuz
parents:
diff changeset
249 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, rint);
anatofuz
parents:
diff changeset
250 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, round);
anatofuz
parents:
diff changeset
251 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(bool, signbit)
anatofuz
parents:
diff changeset
252 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, sin)
anatofuz
parents:
diff changeset
253 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, sinh)
anatofuz
parents:
diff changeset
254 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, sqrt)
anatofuz
parents:
diff changeset
255 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, tan)
anatofuz
parents:
diff changeset
256 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, tanh)
anatofuz
parents:
diff changeset
257 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, tgamma)
anatofuz
parents:
diff changeset
258 __CUDA_CLANG_FN_INTEGER_OVERLOAD_1(double, trunc);
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260 #undef __CUDA_CLANG_FN_INTEGER_OVERLOAD_1
anatofuz
parents:
diff changeset
261 #undef __CUDA_CLANG_FN_INTEGER_OVERLOAD_2
anatofuz
parents:
diff changeset
262
anatofuz
parents:
diff changeset
263 // Overloads for functions that don't match the patterns expected by
anatofuz
parents:
diff changeset
264 // __CUDA_CLANG_FN_INTEGER_OVERLOAD_{1,2}.
anatofuz
parents:
diff changeset
265 template <typename __T1, typename __T2, typename __T3>
anatofuz
parents:
diff changeset
266 __DEVICE__ typename __clang_cuda_enable_if<
anatofuz
parents:
diff changeset
267 std::numeric_limits<__T1>::is_specialized &&
anatofuz
parents:
diff changeset
268 std::numeric_limits<__T2>::is_specialized &&
anatofuz
parents:
diff changeset
269 std::numeric_limits<__T3>::is_specialized,
anatofuz
parents:
diff changeset
270 double>::type
anatofuz
parents:
diff changeset
271 fma(__T1 __x, __T2 __y, __T3 __z) {
anatofuz
parents:
diff changeset
272 return std::fma((double)__x, (double)__y, (double)__z);
anatofuz
parents:
diff changeset
273 }
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 template <typename __T>
anatofuz
parents:
diff changeset
276 __DEVICE__ typename __clang_cuda_enable_if<std::numeric_limits<__T>::is_integer,
anatofuz
parents:
diff changeset
277 double>::type
anatofuz
parents:
diff changeset
278 frexp(__T __x, int *__exp) {
anatofuz
parents:
diff changeset
279 return std::frexp((double)__x, __exp);
anatofuz
parents:
diff changeset
280 }
anatofuz
parents:
diff changeset
281
anatofuz
parents:
diff changeset
282 template <typename __T>
anatofuz
parents:
diff changeset
283 __DEVICE__ typename __clang_cuda_enable_if<std::numeric_limits<__T>::is_integer,
anatofuz
parents:
diff changeset
284 double>::type
anatofuz
parents:
diff changeset
285 ldexp(__T __x, int __exp) {
anatofuz
parents:
diff changeset
286 return std::ldexp((double)__x, __exp);
anatofuz
parents:
diff changeset
287 }
anatofuz
parents:
diff changeset
288
anatofuz
parents:
diff changeset
289 template <typename __T1, typename __T2>
anatofuz
parents:
diff changeset
290 __DEVICE__ typename __clang_cuda_enable_if<
anatofuz
parents:
diff changeset
291 std::numeric_limits<__T1>::is_specialized &&
anatofuz
parents:
diff changeset
292 std::numeric_limits<__T2>::is_specialized,
anatofuz
parents:
diff changeset
293 double>::type
anatofuz
parents:
diff changeset
294 remquo(__T1 __x, __T2 __y, int *__quo) {
anatofuz
parents:
diff changeset
295 return std::remquo((double)__x, (double)__y, __quo);
anatofuz
parents:
diff changeset
296 }
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 template <typename __T>
anatofuz
parents:
diff changeset
299 __DEVICE__ typename __clang_cuda_enable_if<std::numeric_limits<__T>::is_integer,
anatofuz
parents:
diff changeset
300 double>::type
anatofuz
parents:
diff changeset
301 scalbln(__T __x, long __exp) {
anatofuz
parents:
diff changeset
302 return std::scalbln((double)__x, __exp);
anatofuz
parents:
diff changeset
303 }
anatofuz
parents:
diff changeset
304
anatofuz
parents:
diff changeset
305 template <typename __T>
anatofuz
parents:
diff changeset
306 __DEVICE__ typename __clang_cuda_enable_if<std::numeric_limits<__T>::is_integer,
anatofuz
parents:
diff changeset
307 double>::type
anatofuz
parents:
diff changeset
308 scalbn(__T __x, int __exp) {
anatofuz
parents:
diff changeset
309 return std::scalbn((double)__x, __exp);
anatofuz
parents:
diff changeset
310 }
anatofuz
parents:
diff changeset
311
anatofuz
parents:
diff changeset
312 // We need to define these overloads in exactly the namespace our standard
anatofuz
parents:
diff changeset
313 // library uses (including the right inline namespace), otherwise they won't be
anatofuz
parents:
diff changeset
314 // picked up by other functions in the standard library (e.g. functions in
anatofuz
parents:
diff changeset
315 // <complex>). Thus the ugliness below.
anatofuz
parents:
diff changeset
316 #ifdef _LIBCPP_BEGIN_NAMESPACE_STD
anatofuz
parents:
diff changeset
317 _LIBCPP_BEGIN_NAMESPACE_STD
anatofuz
parents:
diff changeset
318 #else
anatofuz
parents:
diff changeset
319 namespace std {
anatofuz
parents:
diff changeset
320 #ifdef _GLIBCXX_BEGIN_NAMESPACE_VERSION
anatofuz
parents:
diff changeset
321 _GLIBCXX_BEGIN_NAMESPACE_VERSION
anatofuz
parents:
diff changeset
322 #endif
anatofuz
parents:
diff changeset
323 #endif
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 // Pull the new overloads we defined above into namespace std.
anatofuz
parents:
diff changeset
326 using ::acos;
anatofuz
parents:
diff changeset
327 using ::acosh;
anatofuz
parents:
diff changeset
328 using ::asin;
anatofuz
parents:
diff changeset
329 using ::asinh;
anatofuz
parents:
diff changeset
330 using ::atan;
anatofuz
parents:
diff changeset
331 using ::atan2;
anatofuz
parents:
diff changeset
332 using ::atanh;
anatofuz
parents:
diff changeset
333 using ::cbrt;
anatofuz
parents:
diff changeset
334 using ::ceil;
anatofuz
parents:
diff changeset
335 using ::copysign;
anatofuz
parents:
diff changeset
336 using ::cos;
anatofuz
parents:
diff changeset
337 using ::cosh;
anatofuz
parents:
diff changeset
338 using ::erf;
anatofuz
parents:
diff changeset
339 using ::erfc;
anatofuz
parents:
diff changeset
340 using ::exp;
anatofuz
parents:
diff changeset
341 using ::exp2;
anatofuz
parents:
diff changeset
342 using ::expm1;
anatofuz
parents:
diff changeset
343 using ::fabs;
anatofuz
parents:
diff changeset
344 using ::fdim;
anatofuz
parents:
diff changeset
345 using ::floor;
anatofuz
parents:
diff changeset
346 using ::fma;
anatofuz
parents:
diff changeset
347 using ::fmax;
anatofuz
parents:
diff changeset
348 using ::fmin;
anatofuz
parents:
diff changeset
349 using ::fmod;
anatofuz
parents:
diff changeset
350 using ::fpclassify;
anatofuz
parents:
diff changeset
351 using ::frexp;
anatofuz
parents:
diff changeset
352 using ::hypot;
anatofuz
parents:
diff changeset
353 using ::ilogb;
anatofuz
parents:
diff changeset
354 using ::isfinite;
anatofuz
parents:
diff changeset
355 using ::isgreater;
anatofuz
parents:
diff changeset
356 using ::isgreaterequal;
anatofuz
parents:
diff changeset
357 using ::isless;
anatofuz
parents:
diff changeset
358 using ::islessequal;
anatofuz
parents:
diff changeset
359 using ::islessgreater;
anatofuz
parents:
diff changeset
360 using ::isnormal;
anatofuz
parents:
diff changeset
361 using ::isunordered;
anatofuz
parents:
diff changeset
362 using ::ldexp;
anatofuz
parents:
diff changeset
363 using ::lgamma;
anatofuz
parents:
diff changeset
364 using ::llrint;
anatofuz
parents:
diff changeset
365 using ::llround;
anatofuz
parents:
diff changeset
366 using ::log;
anatofuz
parents:
diff changeset
367 using ::log10;
anatofuz
parents:
diff changeset
368 using ::log1p;
anatofuz
parents:
diff changeset
369 using ::log2;
anatofuz
parents:
diff changeset
370 using ::logb;
anatofuz
parents:
diff changeset
371 using ::lrint;
anatofuz
parents:
diff changeset
372 using ::lround;
anatofuz
parents:
diff changeset
373 using ::nearbyint;
anatofuz
parents:
diff changeset
374 using ::nextafter;
anatofuz
parents:
diff changeset
375 using ::pow;
anatofuz
parents:
diff changeset
376 using ::remainder;
anatofuz
parents:
diff changeset
377 using ::remquo;
anatofuz
parents:
diff changeset
378 using ::rint;
anatofuz
parents:
diff changeset
379 using ::round;
anatofuz
parents:
diff changeset
380 using ::scalbln;
anatofuz
parents:
diff changeset
381 using ::scalbn;
anatofuz
parents:
diff changeset
382 using ::signbit;
anatofuz
parents:
diff changeset
383 using ::sin;
anatofuz
parents:
diff changeset
384 using ::sinh;
anatofuz
parents:
diff changeset
385 using ::sqrt;
anatofuz
parents:
diff changeset
386 using ::tan;
anatofuz
parents:
diff changeset
387 using ::tanh;
anatofuz
parents:
diff changeset
388 using ::tgamma;
anatofuz
parents:
diff changeset
389 using ::trunc;
anatofuz
parents:
diff changeset
390
anatofuz
parents:
diff changeset
391 // Well this is fun: We need to pull these symbols in for libc++, but we can't
anatofuz
parents:
diff changeset
392 // pull them in with libstdc++, because its ::isinf and ::isnan are different
anatofuz
parents:
diff changeset
393 // than its std::isinf and std::isnan.
anatofuz
parents:
diff changeset
394 #ifndef __GLIBCXX__
anatofuz
parents:
diff changeset
395 using ::isinf;
anatofuz
parents:
diff changeset
396 using ::isnan;
anatofuz
parents:
diff changeset
397 #endif
anatofuz
parents:
diff changeset
398
anatofuz
parents:
diff changeset
399 // Finally, pull the "foobarf" functions that CUDA defines in its headers into
anatofuz
parents:
diff changeset
400 // namespace std.
anatofuz
parents:
diff changeset
401 using ::acosf;
anatofuz
parents:
diff changeset
402 using ::acoshf;
anatofuz
parents:
diff changeset
403 using ::asinf;
anatofuz
parents:
diff changeset
404 using ::asinhf;
anatofuz
parents:
diff changeset
405 using ::atan2f;
anatofuz
parents:
diff changeset
406 using ::atanf;
anatofuz
parents:
diff changeset
407 using ::atanhf;
anatofuz
parents:
diff changeset
408 using ::cbrtf;
anatofuz
parents:
diff changeset
409 using ::ceilf;
anatofuz
parents:
diff changeset
410 using ::copysignf;
anatofuz
parents:
diff changeset
411 using ::cosf;
anatofuz
parents:
diff changeset
412 using ::coshf;
anatofuz
parents:
diff changeset
413 using ::erfcf;
anatofuz
parents:
diff changeset
414 using ::erff;
anatofuz
parents:
diff changeset
415 using ::exp2f;
anatofuz
parents:
diff changeset
416 using ::expf;
anatofuz
parents:
diff changeset
417 using ::expm1f;
anatofuz
parents:
diff changeset
418 using ::fabsf;
anatofuz
parents:
diff changeset
419 using ::fdimf;
anatofuz
parents:
diff changeset
420 using ::floorf;
anatofuz
parents:
diff changeset
421 using ::fmaf;
anatofuz
parents:
diff changeset
422 using ::fmaxf;
anatofuz
parents:
diff changeset
423 using ::fminf;
anatofuz
parents:
diff changeset
424 using ::fmodf;
anatofuz
parents:
diff changeset
425 using ::frexpf;
anatofuz
parents:
diff changeset
426 using ::hypotf;
anatofuz
parents:
diff changeset
427 using ::ilogbf;
anatofuz
parents:
diff changeset
428 using ::ldexpf;
anatofuz
parents:
diff changeset
429 using ::lgammaf;
anatofuz
parents:
diff changeset
430 using ::llrintf;
anatofuz
parents:
diff changeset
431 using ::llroundf;
anatofuz
parents:
diff changeset
432 using ::log10f;
anatofuz
parents:
diff changeset
433 using ::log1pf;
anatofuz
parents:
diff changeset
434 using ::log2f;
anatofuz
parents:
diff changeset
435 using ::logbf;
anatofuz
parents:
diff changeset
436 using ::logf;
anatofuz
parents:
diff changeset
437 using ::lrintf;
anatofuz
parents:
diff changeset
438 using ::lroundf;
anatofuz
parents:
diff changeset
439 using ::modff;
anatofuz
parents:
diff changeset
440 using ::nearbyintf;
anatofuz
parents:
diff changeset
441 using ::nextafterf;
anatofuz
parents:
diff changeset
442 using ::powf;
anatofuz
parents:
diff changeset
443 using ::remainderf;
anatofuz
parents:
diff changeset
444 using ::remquof;
anatofuz
parents:
diff changeset
445 using ::rintf;
anatofuz
parents:
diff changeset
446 using ::roundf;
anatofuz
parents:
diff changeset
447 using ::scalblnf;
anatofuz
parents:
diff changeset
448 using ::scalbnf;
anatofuz
parents:
diff changeset
449 using ::sinf;
anatofuz
parents:
diff changeset
450 using ::sinhf;
anatofuz
parents:
diff changeset
451 using ::sqrtf;
anatofuz
parents:
diff changeset
452 using ::tanf;
anatofuz
parents:
diff changeset
453 using ::tanhf;
anatofuz
parents:
diff changeset
454 using ::tgammaf;
anatofuz
parents:
diff changeset
455 using ::truncf;
anatofuz
parents:
diff changeset
456
anatofuz
parents:
diff changeset
457 #ifdef _LIBCPP_END_NAMESPACE_STD
anatofuz
parents:
diff changeset
458 _LIBCPP_END_NAMESPACE_STD
anatofuz
parents:
diff changeset
459 #else
anatofuz
parents:
diff changeset
460 #ifdef _GLIBCXX_BEGIN_NAMESPACE_VERSION
anatofuz
parents:
diff changeset
461 _GLIBCXX_END_NAMESPACE_VERSION
anatofuz
parents:
diff changeset
462 #endif
anatofuz
parents:
diff changeset
463 } // namespace std
anatofuz
parents:
diff changeset
464 #endif
anatofuz
parents:
diff changeset
465
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
466 #endif // _OPENMP
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
467
150
anatofuz
parents:
diff changeset
468 #undef __DEVICE__
anatofuz
parents:
diff changeset
469
anatofuz
parents:
diff changeset
470 #endif