[AMDGPU] Parse wwm filter flag for regalloc fast (#119347)
[llvm-project.git] / clang / lib / Headers / cuda_wrappers / cmath
blob45f89beec9b4df4350f3822c8be96bc04b162dc2
1 /*===---- cmath - CUDA wrapper for <cmath> ---------------------------------===
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  */
24 #ifndef __CLANG_CUDA_WRAPPERS_CMATH
25 #define __CLANG_CUDA_WRAPPERS_CMATH
27 #include_next <cmath>
29 #if defined(_LIBCPP_STD_VER)
31 // libc++ will need long double variants of these functions, but CUDA does not
32 // provide them. We'll provide their declarations, which should allow the
33 // headers to parse, but would not allow accidental use of them on a GPU.
35 __attribute__((device)) long double logb(long double);
36 __attribute__((device)) long double scalbn(long double, int);
38 namespace std {
40 // For __constexpr_fmin/fmax we only need device-side overloads before c++14
41 // where they are not constexpr.
42 #if _LIBCPP_STD_VER < 14
44 __attribute__((device))
45 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 float __constexpr_fmax(float __x, float __y) _NOEXCEPT {
46   return __builtin_fmaxf(__x, __y);
49 __attribute__((device))
50 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 double __constexpr_fmax(double __x, double __y) _NOEXCEPT {
51   return __builtin_fmax(__x, __y);
54 __attribute__((device))
55 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 long double
56 __constexpr_fmax(long double __x, long double __y) _NOEXCEPT {
57   return __builtin_fmaxl(__x, __y);
60 template <class _Tp, class _Up, __enable_if_t<is_arithmetic<_Tp>::value && is_arithmetic<_Up>::value, int> = 0>
61 __attribute__((device))
62 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename __promote<_Tp, _Up>::type
63 __constexpr_fmax(_Tp __x, _Up __y) _NOEXCEPT {
64   using __result_type = typename __promote<_Tp, _Up>::type;
65   return std::__constexpr_fmax(static_cast<__result_type>(__x), static_cast<__result_type>(__y));
67 #endif // _LIBCPP_STD_VER < 14
69 // For logb/scalbn templates we must always provide device overloads because
70 // libc++ implementation uses __builtin_XXX which gets translated into a libcall
71 // which we can't handle on GPU. We need to forward those to CUDA-provided
72 // implementations.
74 template <class _Tp>
75 __attribute__((device))
76 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __constexpr_logb(_Tp __x) {
77   return ::logb(__x);
80 template <class _Tp>
81 __attribute__((device))
82 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp __constexpr_scalbn(_Tp __x, int __exp) {
83   return ::scalbn(__x, __exp);
86 } // namespace std//
88 #endif // _LIBCPP_STD_VER
90 #endif // include guard