[gcc(refs/users/aoliva/heads/testme)] libstdc++: simd: allow x86 -mlong-double-64

Alexandre Oliva aoliva@gcc.gnu.org
Wed Mar 25 19:03:47 GMT 2026


https://gcc.gnu.org/g:6b777cd359641becd3d5a2ac0670054d68d549c2

commit 6b777cd359641becd3d5a2ac0670054d68d549c2
Author: Alexandre Oliva <oliva@adacore.com>
Date:   Sun Mar 22 22:32:55 2026 -0300

    libstdc++: simd: allow x86 -mlong-double-64
    
    On a target that defaults to -mlong-double-64 -msse,
    standard_abi_usable.cc and other tests fail to compile because of the
    assert that rejects long double.  As on ppc, we can trivially make
    things work for -mlong-double-64.
    
    
    for  libstdc++-v3/ChangeLog
    
            * include/experimental/bits/simd.h (__intrinsic_type): Accept
            64-bit long doubles on x86 SSE.

Diff:
---
 libstdc++-v3/include/experimental/bits/simd.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/experimental/bits/simd.h b/libstdc++-v3/include/experimental/bits/simd.h
index c2ac5adedacc..b96818af6e6f 100644
--- a/libstdc++-v3/include/experimental/bits/simd.h
+++ b/libstdc++-v3/include/experimental/bits/simd.h
@@ -2469,7 +2469,9 @@ template <>
 template <typename _Tp, size_t _Bytes>
   struct __intrinsic_type<_Tp, _Bytes, enable_if_t<__is_vectorizable_v<_Tp> && _Bytes <= 64>>
   {
-    static_assert(!is_same_v<_Tp, long double>,
+    // allow _Tp == long double with -mlong-double-64
+    static_assert(!(is_same_v<_Tp, long double>
+		    && sizeof(long double) > sizeof(double)),
 		  "no __intrinsic_type support for long double on x86");
 
     static constexpr size_t _S_VBytes = _Bytes <= 16 ? 16 : _Bytes <= 32 ? 32 : 64;


More information about the Libstdc++-cvs mailing list