[libcxx-commits] [libcxx] [libcxx] replaces `sqrt(complex<T>)` implementation with builtin (PR #122391)
via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jan 9 15:47:43 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Christopher Di Bella (cjdb)
<details>
<summary>Changes</summary>
This significantly improves the accuracy of the function.
Fixes #<!-- -->122172
---
Full diff: https://github.com/llvm/llvm-project/pull/122391.diff
1 Files Affected:
- (modified) libcxx/include/complex (+13-8)
``````````diff
diff --git a/libcxx/include/complex b/libcxx/include/complex
index df18159595b34d..3858a07d34eea6 100644
--- a/libcxx/include/complex
+++ b/libcxx/include/complex
@@ -1059,16 +1059,21 @@ inline _LIBCPP_HIDE_FROM_ABI complex<_Tp> log10(const complex<_Tp>& __x) {
// sqrt
+_LIBCPP_HIDE_FROM_ABI inline _Complex float __csqrt(_Complex float __v) {
+ return __builtin_csqrtf(__v);
+}
+
+_LIBCPP_HIDE_FROM_ABI inline _Complex double __csqrt(_Complex double __v) {
+ return __builtin_csqrt(__v);
+}
+
+_LIBCPP_HIDE_FROM_ABI inline _Complex long double __csqrt(_Complex long double __v) {
+ return __builtin_csqrtl(__v);
+}
+
template <class _Tp>
_LIBCPP_HIDE_FROM_ABI complex<_Tp> sqrt(const complex<_Tp>& __x) {
- if (std::isinf(__x.imag()))
- return complex<_Tp>(_Tp(INFINITY), __x.imag());
- if (std::isinf(__x.real())) {
- if (__x.real() > _Tp(0))
- return complex<_Tp>(__x.real(), std::isnan(__x.imag()) ? __x.imag() : std::copysign(_Tp(0), __x.imag()));
- return complex<_Tp>(std::isnan(__x.imag()) ? __x.imag() : _Tp(0), std::copysign(__x.real(), __x.imag()));
- }
- return std::polar(std::sqrt(std::abs(__x)), std::arg(__x) / _Tp(2));
+ return complex<_Tp>(__from_builtin_tag(), std::__csqrt(__x.__builtin()));
}
// exp
``````````
</details>
https://github.com/llvm/llvm-project/pull/122391
More information about the libcxx-commits
mailing list