[libcxx-commits] [libcxx] [libcxx] replaces `sqrt(complex<T>)` implementation with builtin (PR #122391)
Christopher Di Bella via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jan 9 15:52:24 PST 2025
https://github.com/cjdb updated https://github.com/llvm/llvm-project/pull/122391
>From 484e554e35aa0a07dc7193dda3989c27ba1eddfe Mon Sep 17 00:00:00 2001
From: Christopher Di Bella <cjdb at google.com>
Date: Thu, 9 Jan 2025 23:44:15 +0000
Subject: [PATCH 1/2] [libcxx] replaces `sqrt(complex<T>)` implementation with
builtin
This significantly improves the accuracy of the function.
Fixes #122172
---
libcxx/include/complex | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
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
>From ec503b4523723980f3807d7f9e5de6f2832e8500 Mon Sep 17 00:00:00 2001
From: Christopher Di Bella <cjdb at google.com>
Date: Thu, 9 Jan 2025 23:52:12 +0000
Subject: [PATCH 2/2] applies clang-format
---
libcxx/include/complex | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/libcxx/include/complex b/libcxx/include/complex
index 3858a07d34eea6..890417288295e0 100644
--- a/libcxx/include/complex
+++ b/libcxx/include/complex
@@ -1059,17 +1059,11 @@ 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 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 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);
-}
+_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) {
More information about the libcxx-commits
mailing list