Skip to content

Commit 5aacf93

Browse files
authored
[libc++] Use _Complex for multiplication and division of complex floating point types (#83575)
This significantly simplifies the implementation and improves the codegen. The only downside is that the accuracy can be marginally worse, but that is up to the compiler to decide with this change, which means it can be controlled by compiler flags. Differential Revision: https://reviews.llvm.org/D155312
1 parent 2d0c4c3 commit 5aacf93

File tree

9 files changed

+240
-316
lines changed

9 files changed

+240
-316
lines changed

Diff for: libcxx/include/cmath

-155
Original file line numberDiff line numberDiff line change
@@ -610,161 +610,6 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool __constexpr_isfinite(_A1 __lcpp_x)
610610
return __builtin_isfinite(__lcpp_x);
611611
}
612612

613-
_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI float __constexpr_copysign(float __x, float __y) _NOEXCEPT {
614-
return __builtin_copysignf(__x, __y);
615-
}
616-
617-
_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI double __constexpr_copysign(double __x, double __y) _NOEXCEPT {
618-
return __builtin_copysign(__x, __y);
619-
}
620-
621-
_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI long double
622-
__constexpr_copysign(long double __x, long double __y) _NOEXCEPT {
623-
return __builtin_copysignl(__x, __y);
624-
}
625-
626-
template <class _A1,
627-
class _A2,
628-
__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
629-
_LIBCPP_CONSTEXPR inline _LIBCPP_HIDE_FROM_ABI typename __promote<_A1, _A2>::type
630-
__constexpr_copysign(_A1 __x, _A2 __y) _NOEXCEPT {
631-
typedef typename std::__promote<_A1, _A2>::type __result_type;
632-
static_assert(!(std::_IsSame<_A1, __result_type>::value && std::_IsSame<_A2, __result_type>::value), "");
633-
return __builtin_copysign((__result_type)__x, (__result_type)__y);
634-
}
635-
636-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR float __constexpr_fabs(float __x) _NOEXCEPT {
637-
return __builtin_fabsf(__x);
638-
}
639-
640-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(double __x) _NOEXCEPT {
641-
return __builtin_fabs(__x);
642-
}
643-
644-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR long double __constexpr_fabs(long double __x) _NOEXCEPT {
645-
return __builtin_fabsl(__x);
646-
}
647-
648-
template <class _Tp, __enable_if_t<is_integral<_Tp>::value, int> = 0>
649-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR double __constexpr_fabs(_Tp __x) _NOEXCEPT {
650-
return __builtin_fabs(static_cast<double>(__x));
651-
}
652-
653-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 float __constexpr_fmax(float __x, float __y) _NOEXCEPT {
654-
#if !__has_constexpr_builtin(__builtin_fmaxf)
655-
if (__libcpp_is_constant_evaluated()) {
656-
if (std::__constexpr_isnan(__x))
657-
return __y;
658-
if (std::__constexpr_isnan(__y))
659-
return __x;
660-
return __x < __y ? __y : __x;
661-
}
662-
#endif
663-
return __builtin_fmaxf(__x, __y);
664-
}
665-
666-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 double __constexpr_fmax(double __x, double __y) _NOEXCEPT {
667-
#if !__has_constexpr_builtin(__builtin_fmax)
668-
if (__libcpp_is_constant_evaluated()) {
669-
if (std::__constexpr_isnan(__x))
670-
return __y;
671-
if (std::__constexpr_isnan(__y))
672-
return __x;
673-
return __x < __y ? __y : __x;
674-
}
675-
#endif
676-
return __builtin_fmax(__x, __y);
677-
}
678-
679-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 long double
680-
__constexpr_fmax(long double __x, long double __y) _NOEXCEPT {
681-
#if !__has_constexpr_builtin(__builtin_fmaxl)
682-
if (__libcpp_is_constant_evaluated()) {
683-
if (std::__constexpr_isnan(__x))
684-
return __y;
685-
if (std::__constexpr_isnan(__y))
686-
return __x;
687-
return __x < __y ? __y : __x;
688-
}
689-
#endif
690-
return __builtin_fmaxl(__x, __y);
691-
}
692-
693-
template <class _Tp, class _Up, __enable_if_t<is_arithmetic<_Tp>::value && is_arithmetic<_Up>::value, int> = 0>
694-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename __promote<_Tp, _Up>::type
695-
__constexpr_fmax(_Tp __x, _Up __y) _NOEXCEPT {
696-
using __result_type = typename __promote<_Tp, _Up>::type;
697-
return std::__constexpr_fmax(static_cast<__result_type>(__x), static_cast<__result_type>(__y));
698-
}
699-
700-
template <class _Tp>
701-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __constexpr_logb(_Tp __x) {
702-
#if !__has_constexpr_builtin(__builtin_logb)
703-
if (__libcpp_is_constant_evaluated()) {
704-
if (__x == _Tp(0)) {
705-
// raise FE_DIVBYZERO
706-
return -numeric_limits<_Tp>::infinity();
707-
}
708-
709-
if (std::__constexpr_isinf(__x))
710-
return numeric_limits<_Tp>::infinity();
711-
712-
if (std::__constexpr_isnan(__x))
713-
return numeric_limits<_Tp>::quiet_NaN();
714-
715-
__x = std::__constexpr_fabs(__x);
716-
unsigned long long __exp = 0;
717-
while (__x >= numeric_limits<_Tp>::radix) {
718-
__x /= numeric_limits<_Tp>::radix;
719-
__exp += 1;
720-
}
721-
return _Tp(__exp);
722-
}
723-
#endif // !__has_constexpr_builtin(__builtin_logb)
724-
return __builtin_logb(__x);
725-
}
726-
727-
template <class _Tp>
728-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp __constexpr_scalbn(_Tp __x, int __exp) {
729-
#if !__has_constexpr_builtin(__builtin_scalbln)
730-
if (__libcpp_is_constant_evaluated()) {
731-
if (__x == _Tp(0))
732-
return __x;
733-
734-
if (std::__constexpr_isinf(__x))
735-
return __x;
736-
737-
if (__exp == _Tp(0))
738-
return __x;
739-
740-
if (std::__constexpr_isnan(__x))
741-
return numeric_limits<_Tp>::quiet_NaN();
742-
743-
_Tp __mult(1);
744-
if (__exp > 0) {
745-
__mult = numeric_limits<_Tp>::radix;
746-
--__exp;
747-
} else {
748-
++__exp;
749-
__exp = -__exp;
750-
__mult /= numeric_limits<_Tp>::radix;
751-
}
752-
753-
while (__exp > 0) {
754-
if (!(__exp & 1)) {
755-
__mult *= __mult;
756-
__exp >>= 1;
757-
} else {
758-
__x *= __mult;
759-
--__exp;
760-
}
761-
}
762-
return __x;
763-
}
764-
#endif // !__has_constexpr_builtin(__builtin_scalbln)
765-
return __builtin_scalbn(__x, __exp);
766-
}
767-
768613
#if _LIBCPP_STD_VER >= 20
769614
template <typename _Fp>
770615
_LIBCPP_HIDE_FROM_ABI constexpr _Fp __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept {

0 commit comments

Comments
 (0)