diff --git a/libcxx/include/math.h b/libcxx/include/math.h --- a/libcxx/include/math.h +++ b/libcxx/include/math.h @@ -1120,16 +1120,32 @@ // copysign -inline _LIBCPP_INLINE_VISIBILITY float copysign(float __lcpp_x, - float __lcpp_y) _NOEXCEPT { +#if __has_builtin(__builtin_copysignf) +_LIBCPP_CONSTEXPR +#endif +inline _LIBCPP_INLINE_VISIBILITY float __libcpp_copysign(float __lcpp_x, float __lcpp_y) _NOEXCEPT { #if __has_builtin(__builtin_copysignf) return __builtin_copysignf(__lcpp_x, __lcpp_y); #else return ::copysignf(__lcpp_x, __lcpp_y); #endif } -inline _LIBCPP_INLINE_VISIBILITY long double -copysign(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT { + +#if __has_builtin(__builtin_copysign) +_LIBCPP_CONSTEXPR +#endif +inline _LIBCPP_INLINE_VISIBILITY double __libcpp_copysign(double __lcpp_x, double __lcpp_y) _NOEXCEPT { +#if __has_builtin(__builtin_copysign) + return __builtin_copysign(__lcpp_x, __lcpp_y); +#else + return ::copysign(__lcpp_x, __lcpp_y); +#endif +} + +#if __has_builtin(__builtin_copysignl) +_LIBCPP_CONSTEXPR +#endif +inline _LIBCPP_INLINE_VISIBILITY long double __libcpp_copysign(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT { #if __has_builtin(__builtin_copysignl) return __builtin_copysignl(__lcpp_x, __lcpp_y); #else @@ -1138,6 +1154,9 @@ } template +#if __has_builtin(__builtin_copysign) +_LIBCPP_CONSTEXPR +#endif inline _LIBCPP_INLINE_VISIBILITY typename std::_EnableIf < @@ -1145,8 +1164,7 @@ std::is_arithmetic<_A2>::value, std::__promote<_A1, _A2> >::type -copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT -{ +__libcpp_copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { typedef typename std::__promote<_A1, _A2>::type __result_type; static_assert((!(std::_IsSame<_A1, __result_type>::value && std::_IsSame<_A2, __result_type>::value)), ""); @@ -1157,6 +1175,26 @@ #endif } +inline _LIBCPP_INLINE_VISIBILITY float copysign(float __lcpp_x, float __lcpp_y) _NOEXCEPT { + return ::__libcpp_copysign(__lcpp_x, __lcpp_y); +} + +inline _LIBCPP_INLINE_VISIBILITY long double copysign(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT { + return ::__libcpp_copysign(__lcpp_x, __lcpp_y); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +typename std::_EnableIf +< + std::is_arithmetic<_A1>::value && + std::is_arithmetic<_A2>::value, + std::__promote<_A1, _A2> +>::type + copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { + return ::__libcpp_copysign(__lcpp_x, __lcpp_y); +} + // erf inline _LIBCPP_INLINE_VISIBILITY float erf(float __lcpp_x) _NOEXCEPT {return ::erff(__lcpp_x);}