From e9af97e206e78d0a4b33a62a77e797940989a11d Mon Sep 17 00:00:00 2001 From: Charles Milette Date: Thu, 1 Oct 2020 21:14:47 -0400 Subject: [PATCH 1/5] : Use intrinsics where possible Partial fix for #1234 --- stl/inc/cmath | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/stl/inc/cmath b/stl/inc/cmath index cdc55d438d4..b6629beb16e 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -12,6 +12,10 @@ #include #include +#ifndef __clang__ +#include +#endif // !__clang__ + #if _HAS_CXX20 #include #endif // _HAS_CXX20 @@ -56,11 +60,19 @@ _NODISCARD _Check_return_ inline float cbrt(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD ceilf(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __ceilf(_Xx); +#endif // __clang__ } _NODISCARD _Check_return_ inline float copysign(_In_ float _Number, _In_ float _Sign) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD copysignf(_Number, _Sign); +#else // ^^^ __clang__ / !__clang__ vvv + return __copysignf(_Number, _Sign); +#endif // __clang__ } _NODISCARD _Check_return_ inline float cos(_In_ float _Xx) noexcept /* strengthened */ { @@ -100,7 +112,11 @@ _NODISCARD _Check_return_ inline float fdim(_In_ float _Xx, _In_ float _Yx) noex } _NODISCARD _Check_return_ inline float floor(_In_ float _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD floorf(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __floorf(_Xx); +#endif // __clang__ } _NODISCARD _Check_return_ inline float fma(_In_ float _Xx, _In_ float _Yx, _In_ float _Zx) noexcept /* strengthened */ { @@ -208,7 +224,11 @@ _NODISCARD _Check_return_ inline float rint(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float round(_In_ float _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD roundf(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __roundf(_Xx); +#endif // __clang__ } _NODISCARD _Check_return_ inline float scalbln(_In_ float _Xx, _In_ long _Yx) noexcept /* strengthened */ { @@ -244,7 +264,11 @@ _NODISCARD _Check_return_ inline float tgamma(_In_ float _Xx) noexcept /* streng } _NODISCARD _Check_return_ inline float trunc(_In_ float _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD truncf(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __truncf(_Xx); +#endif // __clang__ } _NODISCARD _Check_return_ inline long double acos(_In_ long double _Xx) noexcept /* strengthened */ { @@ -281,12 +305,20 @@ _NODISCARD _Check_return_ inline long double cbrt(_In_ long double _Xx) noexcept } _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD ceill(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __ceil(static_cast(_Xx)); +#endif // __clang__ } _NODISCARD _Check_return_ inline long double copysign(_In_ long double _Number, _In_ long double _Sign) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD copysignl(_Number, _Sign); +#else // ^^^ __clang__ / !__clang__ vvv + return __copysign(static_cast(_Number), static_cast(_Sign)); +#endif // __clang__ } _NODISCARD _Check_return_ inline long double cos(_In_ long double _Xx) noexcept /* strengthened */ { @@ -327,7 +359,11 @@ _NODISCARD _Check_return_ inline long double fdim(_In_ long double _Xx, _In_ lon } _NODISCARD _Check_return_ inline long double floor(_In_ long double _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD floorl(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __floor(static_cast(_Xx)); +#endif // __clang__ } _NODISCARD _Check_return_ inline long double fma( @@ -444,7 +480,11 @@ _NODISCARD _Check_return_ inline long double rint(_In_ long double _Xx) noexcept } _NODISCARD _Check_return_ inline long double round(_In_ long double _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD roundl(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __round(static_cast(_Xx)); +#endif // __clang__ } _NODISCARD _Check_return_ inline long double scalbln(_In_ long double _Xx, _In_ long _Yx) noexcept /* strengthened */ { @@ -480,7 +520,11 @@ _NODISCARD _Check_return_ inline long double tgamma(_In_ long double _Xx) noexce } _NODISCARD _Check_return_ inline long double trunc(_In_ long double _Xx) noexcept /* strengthened */ { +#ifdef __clang__ return _CSTD truncl(_Xx); +#else // ^^^ __clang__ / !__clang__ vvv + return __trunc(static_cast(_Xx)); +#endif // __clang__ } From 8a6370d8e855f4b8903a9ea368c5e1dbb7165c7c Mon Sep 17 00:00:00 2001 From: Charles Milette Date: Sat, 10 Oct 2020 01:18:15 -0400 Subject: [PATCH 2/5] Insert intrinsics in the _GENERIC_MATH1 machinery --- stl/inc/cmath | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/stl/inc/cmath b/stl/inc/cmath index b6629beb16e..ec41bb6c8b0 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -605,13 +605,20 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #endif // _HAS_IF_CONSTEXPR } -#define _GENERIC_MATH1R(FUN, RET) \ +#define _GENERIC_MATH1_BASE(NAME, RET, FUN) \ template , int> = 0> \ - _NODISCARD RET FUN(_Ty _Left) noexcept /* strengthened */ { \ - return _CSTD FUN(static_cast(_Left)); \ + _NODISCARD RET NAME(_Ty _Left) noexcept /* strengthened */ { \ + return FUN(static_cast(_Left)); \ } -#define _GENERIC_MATH1(FUN) _GENERIC_MATH1R(FUN, double) +#define _GENERIC_MATH1R(FUN, RET) _GENERIC_MATH1_BASE(FUN, RET, _CSTD FUN) +#define _GENERIC_MATH1(FUN) _GENERIC_MATH1R(FUN, double) + +#ifdef __clang__ +#define _GENERIC_MATH1I(FUN, INTRIN) _GENERIC_MATH1R(FUN, double) +#else // ^^^ __clang__ / !__clang__ vvv +#define _GENERIC_MATH1I(FUN, INTRIN) _GENERIC_MATH1_BASE(FUN, double, INTRIN) +#endif // __clang__ #define _GENERIC_MATH1X(FUN, ARG2) \ template , int> = 0> \ @@ -619,14 +626,22 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo return _CSTD FUN(static_cast(_Left), _Arg2); \ } -#define _GENERIC_MATH2(FUN) \ - template && _STD is_arithmetic_v<_Ty2>, int> = 0> \ - _NODISCARD _STD _Common_float_type_t<_Ty1, _Ty2> FUN(_Ty1 _Left, _Ty2 _Right) noexcept /* strengthened */ { \ - using _Common = _STD _Common_float_type_t<_Ty1, _Ty2>; \ - return _CSTD FUN(static_cast<_Common>(_Left), static_cast<_Common>(_Right)); \ +#define _GENERIC_MATH2_BASE(NAME, FUN) \ + template && _STD is_arithmetic_v<_Ty2>, int> = 0> \ + _NODISCARD _STD _Common_float_type_t<_Ty1, _Ty2> NAME(_Ty1 _Left, _Ty2 _Right) noexcept /* strengthened */ { \ + using _Common = _STD _Common_float_type_t<_Ty1, _Ty2>; \ + return FUN(static_cast<_Common>(_Left), static_cast<_Common>(_Right)); \ } +#define _GENERIC_MATH2(FUN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN) + +#ifdef __clang__ +#define _GENERIC_MATH2I(FUN, INTRIN) _GENERIC_MATH2(FUN) +#else // ^^^ __clang__ / !__clang__ vvv +#define _GENERIC_MATH2I(FUN, INTRIN) _GENERIC_MATH2_BASE(FUN, INTRIN) +#endif // __clang__ + // The following order matches N4820 26.8.1 [cmath.syn]. _GENERIC_MATH1(acos) _GENERIC_MATH1(asin) @@ -666,20 +681,20 @@ _GENERIC_MATH1(erf) _GENERIC_MATH1(erfc) _GENERIC_MATH1(lgamma) _GENERIC_MATH1(tgamma) -_GENERIC_MATH1(ceil) -_GENERIC_MATH1(floor) +_GENERIC_MATH1I(ceil, __ceil) +_GENERIC_MATH1I(floor, __floor) _GENERIC_MATH1(nearbyint) _GENERIC_MATH1(rint) _GENERIC_MATH1R(lrint, long) _GENERIC_MATH1R(llrint, long long) -_GENERIC_MATH1(round) +_GENERIC_MATH1I(round, __round) _GENERIC_MATH1R(lround, long) _GENERIC_MATH1R(llround, long long) -_GENERIC_MATH1(trunc) +_GENERIC_MATH1I(trunc, __trunc) _GENERIC_MATH2(fmod) _GENERIC_MATH2(remainder) // remquo() is hand-crafted -_GENERIC_MATH2(copysign) +_GENERIC_MATH2I(copysign, __copysign) // nan(const char*) is exempt _GENERIC_MATH2(nextafter) _GENERIC_MATH1X(nexttoward, long double) From de493885e4ac9b0ef91b009460b3c16cce83bac5 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 5 Nov 2020 00:20:45 -0800 Subject: [PATCH 3/5] Use Clang builtins, undef macros. --- stl/inc/cmath | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/stl/inc/cmath b/stl/inc/cmath index ec41bb6c8b0..8342a305d1a 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -61,7 +61,7 @@ _NODISCARD _Check_return_ inline float cbrt(_In_ float _Xx) noexcept /* strength _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD ceilf(_Xx); + return __builtin_ceilf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __ceilf(_Xx); #endif // __clang__ @@ -69,7 +69,7 @@ _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strength _NODISCARD _Check_return_ inline float copysign(_In_ float _Number, _In_ float _Sign) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD copysignf(_Number, _Sign); + return __builtin_copysignf(_Number, _Sign); #else // ^^^ __clang__ / !__clang__ vvv return __copysignf(_Number, _Sign); #endif // __clang__ @@ -113,7 +113,7 @@ _NODISCARD _Check_return_ inline float fdim(_In_ float _Xx, _In_ float _Yx) noex _NODISCARD _Check_return_ inline float floor(_In_ float _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD floorf(_Xx); + return __builtin_floorf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __floorf(_Xx); #endif // __clang__ @@ -225,7 +225,7 @@ _NODISCARD _Check_return_ inline float rint(_In_ float _Xx) noexcept /* strength _NODISCARD _Check_return_ inline float round(_In_ float _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD roundf(_Xx); + return __builtin_roundf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __roundf(_Xx); #endif // __clang__ @@ -265,7 +265,7 @@ _NODISCARD _Check_return_ inline float tgamma(_In_ float _Xx) noexcept /* streng _NODISCARD _Check_return_ inline float trunc(_In_ float _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD truncf(_Xx); + return __builtin_truncf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __truncf(_Xx); #endif // __clang__ @@ -306,7 +306,7 @@ _NODISCARD _Check_return_ inline long double cbrt(_In_ long double _Xx) noexcept _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD ceill(_Xx); + return __builtin_ceill(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __ceil(static_cast(_Xx)); #endif // __clang__ @@ -315,7 +315,7 @@ _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept _NODISCARD _Check_return_ inline long double copysign(_In_ long double _Number, _In_ long double _Sign) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD copysignl(_Number, _Sign); + return __builtin_copysignl(_Number, _Sign); #else // ^^^ __clang__ / !__clang__ vvv return __copysign(static_cast(_Number), static_cast(_Sign)); #endif // __clang__ @@ -360,7 +360,7 @@ _NODISCARD _Check_return_ inline long double fdim(_In_ long double _Xx, _In_ lon _NODISCARD _Check_return_ inline long double floor(_In_ long double _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD floorl(_Xx); + return __builtin_floorl(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __floor(static_cast(_Xx)); #endif // __clang__ @@ -481,7 +481,7 @@ _NODISCARD _Check_return_ inline long double rint(_In_ long double _Xx) noexcept _NODISCARD _Check_return_ inline long double round(_In_ long double _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD roundl(_Xx); + return __builtin_roundl(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __round(static_cast(_Xx)); #endif // __clang__ @@ -521,7 +521,7 @@ _NODISCARD _Check_return_ inline long double tgamma(_In_ long double _Xx) noexce _NODISCARD _Check_return_ inline long double trunc(_In_ long double _Xx) noexcept /* strengthened */ { #ifdef __clang__ - return _CSTD truncl(_Xx); + return __builtin_truncl(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __trunc(static_cast(_Xx)); #endif // __clang__ @@ -615,9 +615,9 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #define _GENERIC_MATH1(FUN) _GENERIC_MATH1R(FUN, double) #ifdef __clang__ -#define _GENERIC_MATH1I(FUN, INTRIN) _GENERIC_MATH1R(FUN, double) +#define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, CLANG_INTRIN) #else // ^^^ __clang__ / !__clang__ vvv -#define _GENERIC_MATH1I(FUN, INTRIN) _GENERIC_MATH1_BASE(FUN, double, INTRIN) +#define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, MSVC_INTRIN) #endif // __clang__ #define _GENERIC_MATH1X(FUN, ARG2) \ @@ -637,9 +637,9 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #define _GENERIC_MATH2(FUN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN) #ifdef __clang__ -#define _GENERIC_MATH2I(FUN, INTRIN) _GENERIC_MATH2(FUN) +#define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, CLANG_INTRIN) #else // ^^^ __clang__ / !__clang__ vvv -#define _GENERIC_MATH2I(FUN, INTRIN) _GENERIC_MATH2_BASE(FUN, INTRIN) +#define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, MSVC_INTRIN) #endif // __clang__ // The following order matches N4820 26.8.1 [cmath.syn]. @@ -681,20 +681,20 @@ _GENERIC_MATH1(erf) _GENERIC_MATH1(erfc) _GENERIC_MATH1(lgamma) _GENERIC_MATH1(tgamma) -_GENERIC_MATH1I(ceil, __ceil) -_GENERIC_MATH1I(floor, __floor) +_GENERIC_MATH1I(ceil, __builtin_ceil, __ceil) +_GENERIC_MATH1I(floor, __builtin_floor, __floor) _GENERIC_MATH1(nearbyint) _GENERIC_MATH1(rint) _GENERIC_MATH1R(lrint, long) _GENERIC_MATH1R(llrint, long long) -_GENERIC_MATH1I(round, __round) +_GENERIC_MATH1I(round, __builtin_round, __round) _GENERIC_MATH1R(lround, long) _GENERIC_MATH1R(llround, long long) -_GENERIC_MATH1I(trunc, __trunc) +_GENERIC_MATH1I(trunc, __builtin_trunc, __trunc) _GENERIC_MATH2(fmod) _GENERIC_MATH2(remainder) // remquo() is hand-crafted -_GENERIC_MATH2I(copysign, __copysign) +_GENERIC_MATH2I(copysign, __builtin_copysign, __copysign) // nan(const char*) is exempt _GENERIC_MATH2(nextafter) _GENERIC_MATH1X(nexttoward, long double) @@ -706,10 +706,14 @@ _GENERIC_MATH2(fmin) // The "classification/comparison functions" (fpclassify(), etc.) are exempt, LWG-1327 // TRANSITION, VSO-945789, Special Math shouldn't be exempt +#undef _GENERIC_MATH1_BASE #undef _GENERIC_MATH1R #undef _GENERIC_MATH1 +#undef _GENERIC_MATH1I #undef _GENERIC_MATH1X +#undef _GENERIC_MATH2_BASE #undef _GENERIC_MATH2 +#undef _GENERIC_MATH2I _STD_BEGIN From 99a149457cf6da203584f9d060608957eff936cb Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 5 Nov 2020 13:55:09 -0800 Subject: [PATCH 4/5] Fix /clr:pure. --- stl/inc/cmath | 52 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/stl/inc/cmath b/stl/inc/cmath index 8342a305d1a..96b4e91155b 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -12,9 +12,9 @@ #include #include -#ifndef __clang__ +#if !defined(_M_CEE_PURE) && !defined(__clang__) #include -#endif // !__clang__ +#endif // !defined(_M_CEE_PURE) && !defined(__clang__) #if _HAS_CXX20 #include @@ -60,7 +60,9 @@ _NODISCARD _Check_return_ inline float cbrt(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD ceilf(_Xx); +#elif defined(__clang__) return __builtin_ceilf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __ceilf(_Xx); @@ -68,7 +70,9 @@ _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float copysign(_In_ float _Number, _In_ float _Sign) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD copysignf(_Number, _Sign); +#elif defined(__clang__) return __builtin_copysignf(_Number, _Sign); #else // ^^^ __clang__ / !__clang__ vvv return __copysignf(_Number, _Sign); @@ -112,7 +116,9 @@ _NODISCARD _Check_return_ inline float fdim(_In_ float _Xx, _In_ float _Yx) noex } _NODISCARD _Check_return_ inline float floor(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD floorf(_Xx); +#elif defined(__clang__) return __builtin_floorf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __floorf(_Xx); @@ -224,7 +230,9 @@ _NODISCARD _Check_return_ inline float rint(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float round(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD roundf(_Xx); +#elif defined(__clang__) return __builtin_roundf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __roundf(_Xx); @@ -264,7 +272,9 @@ _NODISCARD _Check_return_ inline float tgamma(_In_ float _Xx) noexcept /* streng } _NODISCARD _Check_return_ inline float trunc(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD truncf(_Xx); +#elif defined(__clang__) return __builtin_truncf(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __truncf(_Xx); @@ -305,7 +315,9 @@ _NODISCARD _Check_return_ inline long double cbrt(_In_ long double _Xx) noexcept } _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD ceill(_Xx); +#elif defined(__clang__) return __builtin_ceill(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __ceil(static_cast(_Xx)); @@ -314,7 +326,9 @@ _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept _NODISCARD _Check_return_ inline long double copysign(_In_ long double _Number, _In_ long double _Sign) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD copysignl(_Number, _Sign); +#elif defined(__clang__) return __builtin_copysignl(_Number, _Sign); #else // ^^^ __clang__ / !__clang__ vvv return __copysign(static_cast(_Number), static_cast(_Sign)); @@ -359,7 +373,9 @@ _NODISCARD _Check_return_ inline long double fdim(_In_ long double _Xx, _In_ lon } _NODISCARD _Check_return_ inline long double floor(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD floorl(_Xx); +#elif defined(__clang__) return __builtin_floorl(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __floor(static_cast(_Xx)); @@ -480,7 +496,9 @@ _NODISCARD _Check_return_ inline long double rint(_In_ long double _Xx) noexcept } _NODISCARD _Check_return_ inline long double round(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD roundl(_Xx); +#elif defined(__clang__) return __builtin_roundl(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __round(static_cast(_Xx)); @@ -520,7 +538,9 @@ _NODISCARD _Check_return_ inline long double tgamma(_In_ long double _Xx) noexce } _NODISCARD _Check_return_ inline long double trunc(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef __clang__ +#ifdef _M_CEE_PURE + return _CSTD truncl(_Xx); +#elif defined(__clang__) return __builtin_truncl(_Xx); #else // ^^^ __clang__ / !__clang__ vvv return __trunc(static_cast(_Xx)); @@ -614,7 +634,9 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #define _GENERIC_MATH1R(FUN, RET) _GENERIC_MATH1_BASE(FUN, RET, _CSTD FUN) #define _GENERIC_MATH1(FUN) _GENERIC_MATH1R(FUN, double) -#ifdef __clang__ +#ifdef _M_CEE_PURE +#define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, _CSTD FUN) +#elif defined(__clang__) #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, CLANG_INTRIN) #else // ^^^ __clang__ / !__clang__ vvv #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, MSVC_INTRIN) @@ -636,7 +658,9 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #define _GENERIC_MATH2(FUN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN) -#ifdef __clang__ +#ifdef _M_CEE_PURE +#define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN) +#elif defined(__clang__) #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, CLANG_INTRIN) #else // ^^^ __clang__ / !__clang__ vvv #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, MSVC_INTRIN) From d3c77b121f8a1906a6f59933595ed0f55b3b9d4e Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 5 Nov 2020 22:58:21 -0800 Subject: [PATCH 5/5] Fix /clr too. --- stl/inc/cmath | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/stl/inc/cmath b/stl/inc/cmath index 96b4e91155b..354587044fe 100644 --- a/stl/inc/cmath +++ b/stl/inc/cmath @@ -12,9 +12,9 @@ #include #include -#if !defined(_M_CEE_PURE) && !defined(__clang__) +#if !defined(_M_CEE) && !defined(__clang__) #include -#endif // !defined(_M_CEE_PURE) && !defined(__clang__) +#endif // !defined(_M_CEE) && !defined(__clang__) #if _HAS_CXX20 #include @@ -60,7 +60,7 @@ _NODISCARD _Check_return_ inline float cbrt(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD ceilf(_Xx); #elif defined(__clang__) return __builtin_ceilf(_Xx); @@ -70,7 +70,7 @@ _NODISCARD _Check_return_ inline float ceil(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float copysign(_In_ float _Number, _In_ float _Sign) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD copysignf(_Number, _Sign); #elif defined(__clang__) return __builtin_copysignf(_Number, _Sign); @@ -116,7 +116,7 @@ _NODISCARD _Check_return_ inline float fdim(_In_ float _Xx, _In_ float _Yx) noex } _NODISCARD _Check_return_ inline float floor(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD floorf(_Xx); #elif defined(__clang__) return __builtin_floorf(_Xx); @@ -230,7 +230,7 @@ _NODISCARD _Check_return_ inline float rint(_In_ float _Xx) noexcept /* strength } _NODISCARD _Check_return_ inline float round(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD roundf(_Xx); #elif defined(__clang__) return __builtin_roundf(_Xx); @@ -272,7 +272,7 @@ _NODISCARD _Check_return_ inline float tgamma(_In_ float _Xx) noexcept /* streng } _NODISCARD _Check_return_ inline float trunc(_In_ float _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD truncf(_Xx); #elif defined(__clang__) return __builtin_truncf(_Xx); @@ -315,7 +315,7 @@ _NODISCARD _Check_return_ inline long double cbrt(_In_ long double _Xx) noexcept } _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD ceill(_Xx); #elif defined(__clang__) return __builtin_ceill(_Xx); @@ -326,7 +326,7 @@ _NODISCARD _Check_return_ inline long double ceil(_In_ long double _Xx) noexcept _NODISCARD _Check_return_ inline long double copysign(_In_ long double _Number, _In_ long double _Sign) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD copysignl(_Number, _Sign); #elif defined(__clang__) return __builtin_copysignl(_Number, _Sign); @@ -373,7 +373,7 @@ _NODISCARD _Check_return_ inline long double fdim(_In_ long double _Xx, _In_ lon } _NODISCARD _Check_return_ inline long double floor(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD floorl(_Xx); #elif defined(__clang__) return __builtin_floorl(_Xx); @@ -496,7 +496,7 @@ _NODISCARD _Check_return_ inline long double rint(_In_ long double _Xx) noexcept } _NODISCARD _Check_return_ inline long double round(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD roundl(_Xx); #elif defined(__clang__) return __builtin_roundl(_Xx); @@ -538,7 +538,7 @@ _NODISCARD _Check_return_ inline long double tgamma(_In_ long double _Xx) noexce } _NODISCARD _Check_return_ inline long double trunc(_In_ long double _Xx) noexcept /* strengthened */ { -#ifdef _M_CEE_PURE +#ifdef _M_CEE return _CSTD truncl(_Xx); #elif defined(__clang__) return __builtin_truncl(_Xx); @@ -634,7 +634,7 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #define _GENERIC_MATH1R(FUN, RET) _GENERIC_MATH1_BASE(FUN, RET, _CSTD FUN) #define _GENERIC_MATH1(FUN) _GENERIC_MATH1R(FUN, double) -#ifdef _M_CEE_PURE +#ifdef _M_CEE #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, _CSTD FUN) #elif defined(__clang__) #define _GENERIC_MATH1I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH1_BASE(FUN, double, CLANG_INTRIN) @@ -658,7 +658,7 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo #define _GENERIC_MATH2(FUN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN) -#ifdef _M_CEE_PURE +#ifdef _M_CEE #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN) #elif defined(__clang__) #define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, CLANG_INTRIN)