Skip to content

Commit 8eca13a

Browse files
Fix <cmath> intrinsics for CUDA (#1886)
Co-authored-by: Casey Carter <cartec69@gmail.com>
1 parent f675d68 commit 8eca13a

1 file changed

Lines changed: 69 additions & 62 deletions

File tree

stl/inc/cmath

Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@
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

Comments
 (0)