1212#include <cstdlib>
1313#include <xtr1common>
1414
15- #if !defined(_M_CEE) && !defined(__clang__)
15+ #if !defined(_M_CEE) && !defined(__clang__) && !defined(__CUDACC__) && !defined(__INTEL_COMPILER)
16+ #define _HAS_CMATH_INTRINSICS 1
17+ #else // ^^^ intrinsics available ^^^ / vvv intrinsics unavailable vvv
18+ #define _HAS_CMATH_INTRINSICS 0
19+ #endif // ^^^ intrinsics unavailable ^^^
20+
21+ #if _HAS_CMATH_INTRINSICS
1622#include <intrin0.h>
17- #endif // !defined(_M_CEE) && !defined(__clang__)
23+ #endif // _HAS_CMATH_INTRINSICS
1824
1925#if _HAS_CXX20
2026#include <xutility>
@@ -60,23 +66,23 @@ _NODISCARD _Check_return_ inline float cbrt(_In_ float _Xx) noexcept /* strength
6066}
6167
6268_NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strengthened */ {
63- #ifdef _M_CEE
64- return _CSTD ceilf (_Xx);
69+ #if _HAS_CMATH_INTRINSICS
70+ return __ceilf (_Xx);
6571#elif defined(__clang__)
6672 return __builtin_ceilf(_Xx);
67- #else // ^^^ __clang__ / !__clang__ vvv
68- return __ceilf (_Xx);
69- #endif // __clang__
73+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
74+ return _CSTD ceilf (_Xx);
75+ #endif // ^^^ intrinsics unavailable ^^^
7076}
7177
7278_NODISCARD _Check_return_ inline float copysign(_In_ float _Number, _In_ float _Sign) noexcept /* strengthened */ {
73- #ifdef _M_CEE
74- return _CSTD copysignf (_Number, _Sign);
79+ #if _HAS_CMATH_INTRINSICS
80+ return __copysignf (_Number, _Sign);
7581#elif defined(__clang__)
7682 return __builtin_copysignf(_Number, _Sign);
77- #else // ^^^ __clang__ / !__clang__ vvv
78- return __copysignf (_Number, _Sign);
79- #endif // __clang__
83+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
84+ return _CSTD copysignf (_Number, _Sign);
85+ #endif // ^^^ intrinsics unavailable ^^^
8086}
8187
8288_NODISCARD _Check_return_ inline float cos(_In_ float _Xx) noexcept /* strengthened */ {
@@ -116,13 +122,13 @@ _NODISCARD _Check_return_ inline float fdim(_In_ float _Xx, _In_ float _Yx) noex
116122}
117123
118124_NODISCARD _Check_return_ inline float floor(_In_ float _Xx) noexcept /* strengthened */ {
119- #ifdef _M_CEE
120- return _CSTD floorf (_Xx);
125+ #if _HAS_CMATH_INTRINSICS
126+ return __floorf (_Xx);
121127#elif defined(__clang__)
122128 return __builtin_floorf(_Xx);
123- #else // ^^^ __clang__ / !__clang__ vvv
124- return __floorf (_Xx);
125- #endif // __clang__
129+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
130+ return _CSTD floorf (_Xx);
131+ #endif // ^^^ intrinsics unavailable ^^^
126132}
127133
128134_NODISCARD _Check_return_ inline float fma(_In_ float _Xx, _In_ float _Yx, _In_ float _Zx) noexcept /* strengthened */ {
@@ -230,13 +236,13 @@ _NODISCARD _Check_return_ inline float rint(_In_ float _Xx) noexcept /* strength
230236}
231237
232238_NODISCARD _Check_return_ inline float round(_In_ float _Xx) noexcept /* strengthened */ {
233- #ifdef _M_CEE
234- return _CSTD roundf (_Xx);
239+ #if _HAS_CMATH_INTRINSICS
240+ return __roundf (_Xx);
235241#elif defined(__clang__)
236242 return __builtin_roundf(_Xx);
237- #else // ^^^ __clang__ / !__clang__ vvv
238- return __roundf (_Xx);
239- #endif // __clang__
243+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
244+ return _CSTD roundf (_Xx);
245+ #endif // ^^^ intrinsics unavailable ^^^
240246}
241247
242248_NODISCARD _Check_return_ inline float scalbln(_In_ float _Xx, _In_ long _Yx) noexcept /* strengthened */ {
@@ -272,13 +278,13 @@ _NODISCARD _Check_return_ inline float tgamma(_In_ float _Xx) noexcept /* streng
272278}
273279
274280_NODISCARD _Check_return_ inline float trunc(_In_ float _Xx) noexcept /* strengthened */ {
275- #ifdef _M_CEE
276- return _CSTD truncf (_Xx);
281+ #if _HAS_CMATH_INTRINSICS
282+ return __truncf (_Xx);
277283#elif defined(__clang__)
278284 return __builtin_truncf(_Xx);
279- #else // ^^^ __clang__ / !__clang__ vvv
280- return __truncf (_Xx);
281- #endif // __clang__
285+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
286+ return _CSTD truncf (_Xx);
287+ #endif // ^^^ intrinsics unavailable ^^^
282288}
283289
284290_NODISCARD _Check_return_ inline long double acos(_In_ long double _Xx) noexcept /* strengthened */ {
@@ -315,24 +321,24 @@ _NODISCARD _Check_return_ inline long double cbrt(_In_ long double _Xx) noexcept
315321}
316322
317323_NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept /* strengthened */ {
318- #ifdef _M_CEE
319- return _CSTD ceill( _Xx);
324+ #if _HAS_CMATH_INTRINSICS
325+ return __ceil(static_cast<double>( _Xx) );
320326#elif defined(__clang__)
321327 return __builtin_ceill(_Xx);
322- #else // ^^^ __clang__ / !__clang__ vvv
323- return __ceil(static_cast<double>( _Xx) );
324- #endif // __clang__
328+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
329+ return _CSTD ceill( _Xx);
330+ #endif // ^^^ intrinsics unavailable ^^^
325331}
326332
327333_NODISCARD _Check_return_ inline long double copysign(_In_ long double _Number, _In_ long double _Sign) noexcept
328334/* strengthened */ {
329- #ifdef _M_CEE
330- return _CSTD copysignl( _Number, _Sign);
335+ #if _HAS_CMATH_INTRINSICS
336+ return __copysign(static_cast<double>( _Number), static_cast<double>( _Sign) );
331337#elif defined(__clang__)
332338 return __builtin_copysignl(_Number, _Sign);
333- #else // ^^^ __clang__ / !__clang__ vvv
334- return __copysign(static_cast<double>( _Number), static_cast<double>( _Sign) );
335- #endif // __clang__
339+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
340+ return _CSTD copysignl( _Number, _Sign);
341+ #endif // ^^^ intrinsics unavailable ^^^
336342}
337343
338344_NODISCARD _Check_return_ inline long double cos(_In_ long double _Xx) noexcept /* strengthened */ {
@@ -373,13 +379,13 @@ _NODISCARD _Check_return_ inline long double fdim(_In_ long double _Xx, _In_ lon
373379}
374380
375381_NODISCARD _Check_return_ inline long double floor(_In_ long double _Xx) noexcept /* strengthened */ {
376- #ifdef _M_CEE
377- return _CSTD floorl( _Xx);
382+ #if _HAS_CMATH_INTRINSICS
383+ return __floor(static_cast<double>( _Xx) );
378384#elif defined(__clang__)
379385 return __builtin_floorl(_Xx);
380- #else // ^^^ __clang__ / !__clang__ vvv
381- return __floor(static_cast<double>( _Xx) );
382- #endif // __clang__
386+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
387+ return _CSTD floorl( _Xx);
388+ #endif // ^^^ intrinsics unavailable ^^^
383389}
384390
385391_NODISCARD _Check_return_ inline long double fma(
@@ -496,13 +502,13 @@ _NODISCARD _Check_return_ inline long double rint(_In_ long double _Xx) noexcept
496502}
497503
498504_NODISCARD _Check_return_ inline long double round(_In_ long double _Xx) noexcept /* strengthened */ {
499- #ifdef _M_CEE
500- return _CSTD roundl( _Xx);
505+ #if _HAS_CMATH_INTRINSICS
506+ return __round(static_cast<double>( _Xx) );
501507#elif defined(__clang__)
502508 return __builtin_roundl(_Xx);
503- #else // ^^^ __clang__ / !__clang__ vvv
504- return __round(static_cast<double>( _Xx) );
505- #endif // __clang__
509+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
510+ return _CSTD roundl( _Xx);
511+ #endif // ^^^ intrinsics unavailable ^^^
506512}
507513
508514_NODISCARD _Check_return_ inline long double scalbln(_In_ long double _Xx, _In_ long _Yx) noexcept /* strengthened */ {
@@ -538,13 +544,13 @@ _NODISCARD _Check_return_ inline long double tgamma(_In_ long double _Xx) noexce
538544}
539545
540546_NODISCARD _Check_return_ inline long double trunc(_In_ long double _Xx) noexcept /* strengthened */ {
541- #ifdef _M_CEE
542- return _CSTD truncl( _Xx);
547+ #if _HAS_CMATH_INTRINSICS
548+ return __trunc(static_cast<double>( _Xx) );
543549#elif defined(__clang__)
544550 return __builtin_truncl(_Xx);
545- #else // ^^^ __clang__ / !__clang__ vvv
546- return __trunc(static_cast<double>( _Xx) );
547- #endif // __clang__
551+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
552+ return _CSTD truncl( _Xx);
553+ #endif // ^^^ intrinsics unavailable ^^^
548554}
549555
550556
@@ -598,13 +604,13 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo
598604#define _GENERIC_MATH1R(FUN, RET) _GENERIC_MATH1_BASE(FUN, RET, _CSTD FUN)
599605#define _GENERIC_MATH1(FUN) _GENERIC_MATH1R(FUN, double)
600606
601- #ifdef _M_CEE
602- #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, _CSTD FUN )
607+ #if _HAS_CMATH_INTRINSICS
608+ #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, MSVC_INTRIN )
603609#elif defined(__clang__)
604610#define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, CLANG_INTRIN)
605- #else // ^^^ __clang__ / !__clang__ vvv
606- #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, MSVC_INTRIN )
607- #endif // __clang__
611+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
612+ #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, _CSTD FUN )
613+ #endif // ^^^ intrinsics unavailable ^^^
608614
609615#define _GENERIC_MATH1X(FUN, ARG2) \
610616 template <class _Ty, _STD enable_if_t<_STD is_integral_v<_Ty>, int> = 0> \
@@ -622,13 +628,13 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo
622628
623629#define _GENERIC_MATH2(FUN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN)
624630
625- #ifdef _M_CEE
626- #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN )
631+ #if _HAS_CMATH_INTRINSICS
632+ #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, MSVC_INTRIN )
627633#elif defined(__clang__)
628634#define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, CLANG_INTRIN)
629- #else // ^^^ __clang__ / !__clang__ vvv
630- #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, MSVC_INTRIN )
631- #endif // __clang__
635+ #else // ^^^ defined( __clang__) ^^^ / vvv intrinsics unavailable vvv
636+ #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN )
637+ #endif // ^^^ intrinsics unavailable ^^^
632638
633639// The following order matches N4820 26.8.1 [cmath.syn].
634640_GENERIC_MATH1(acos)
@@ -702,6 +708,7 @@ _GENERIC_MATH2(fmin)
702708#undef _GENERIC_MATH2_BASE
703709#undef _GENERIC_MATH2
704710#undef _GENERIC_MATH2I
711+ #undef _HAS_CMATH_INTRINSICS
705712
706713
707714_STD_BEGIN
0 commit comments