https://gcc.gnu.org/g:e59ea3b6cbd840e453b6af5d4baf69cd9c524961

commit e59ea3b6cbd840e453b6af5d4baf69cd9c524961
Author: Alexandre Oliva <[email protected]>
Date:   Wed Apr 8 23:43:53 2026 -0300

    libstdc++: simd: accept 64-bit long double as double in _S_*_of [PR124657]
    
    Various simd_x86 functions that handle double need to be adjusted to
    match 64-bit long double as well.
    
    This patch deals with _S_*_of, to test the concept.
    
    There are many occurrences of double in simd_x86.h file, and we
    probably have to adjust them all.  But this is more than enough to get
    pr109261_constexpr_simd.cc to compile with -mlong-double-64.
    
    We probably need a better abstraction.
    
    
    for  libstdc++-v3/ChangeLog
    
            PR libstdc++/124657
            * include/experimental/bits/simd_x86.h (_S_all_of): Handle
            long double like double.
            (_S_any_of, _S_none_of, _S_some_of): Likewise.

Diff:
---
 libstdc++-v3/include/experimental/bits/simd_x86.h | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h 
b/libstdc++-v3/include/experimental/bits/simd_x86.h
index 74c7a61998e0..400b56e40b33 100644
--- a/libstdc++-v3/include/experimental/bits/simd_x86.h
+++ b/libstdc++-v3/include/experimental/bits/simd_x86.h
@@ -5024,7 +5024,9 @@ template <typename _Abi, typename>
            else if constexpr (is_same_v<_Tp, float>)
              return (_mm_movemask_ps(__a) & ((1 << _Np) - 1))
                     == (1 << _Np) - 1;
-           else if constexpr (is_same_v<_Tp, double>)
+           else if constexpr (is_same_v<_Tp, double>
+                              || (sizeof (long double) == sizeof (double)
+                                  && is_same_v<_Tp, long double>))
              return (_mm_movemask_pd(__a) & ((1 << _Np) - 1))
                     == (1 << _Np) - 1;
            else
@@ -5086,7 +5088,9 @@ template <typename _Abi, typename>
              }
            else if constexpr (is_same_v<_Tp, float>)
              return (_mm_movemask_ps(__a) & ((1 << _Np) - 1)) != 0;
-           else if constexpr (is_same_v<_Tp, double>)
+           else if constexpr (is_same_v<_Tp, double>
+                              || (sizeof (long double) == sizeof (double)
+                                  && is_same_v<_Tp, long double>))
              return (_mm_movemask_pd(__a) & ((1 << _Np) - 1)) != 0;
            else
              return (_mm_movemask_epi8(__a) & ((1 << (_Np * sizeof(_Tp))) - 1))
@@ -5122,7 +5126,9 @@ template <typename _Abi, typename>
              }
            else if constexpr (is_same_v<_Tp, float>)
              return (__movemask(__a) & ((1 << _Np) - 1)) == 0;
-           else if constexpr (is_same_v<_Tp, double>)
+           else if constexpr (is_same_v<_Tp, double>
+                              || (sizeof (long double) == sizeof (double)
+                                  && is_same_v<_Tp, long double>))
              return (__movemask(__a) & ((1 << _Np) - 1)) == 0;
            else
              return (__movemask(__a) & int((1ull << (_Np * sizeof(_Tp))) - 1))
@@ -5156,7 +5162,9 @@ template <typename _Abi, typename>
                const auto __tmp = _mm_movemask_ps(__a) & __allbits;
                return __tmp > 0 && __tmp < __allbits;
              }
-           else if constexpr (is_same_v<_Tp, double>)
+           else if constexpr (is_same_v<_Tp, double>
+                              || (sizeof (long double) == sizeof (double)
+                                  && is_same_v<_Tp, long double>))
              {
                constexpr int __allbits = (1 << _Np) - 1;
                const auto __tmp = _mm_movemask_pd(__a) & __allbits;

Reply via email to