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;
