[PATCH v2 0/2] std-simd-complex
Matthias Kretz via Sourceware Forge
forge-bot+mkretz@forge-stage.sourceware.org
Fri May 22 08:07:52 GMT 2026
Hi gcc-patches mailing list,
Matthias Kretz via Sourceware Forge <forge-bot+mkretz@forge-stage.sourceware.org> has requested that the following forgejo pull request
be published on the mailing list.
Created on: 2026-03-21 13:52:32+00:00
Latest update: 2026-05-22 08:07:53+00:00
Changes: 25 changed files, 3487 additions, 120 deletions
Head revision: mkretz/gcc ref std-simd-complex commit db5398e40d7dcde44f07382b1d954f327229b1a8
Base revision: gcc/gcc-TEST ref trunk commit 2ba702c966e3772d3d4e29e4b25beb7ef4dabf73 r17-638-g2ba702c966e377
Merge base: 2ba702c966e3772d3d4e29e4b25beb7ef4dabf73
Full diff url: https://forge.sourceware.org/gcc/gcc-TEST/pulls/145.diff
Discussion: https://forge.sourceware.org/gcc/gcc-TEST/pulls/145
Requested Reviewers:
This patch set
- refactors std::simd's ABI tags to completely drop `_ScalarAbi<N>`
- adds complex to the vectorizable types
- implements [simd.bit]
Tested on x86_64-linux-gnu, also with unix/-m32/-march=i686
Changed files:
- A: libstdc++-v3/include/bits/simd_bit.h
- A: libstdc++-v3/include/bits/simd_complex.h
- A: libstdc++-v3/include/bits/simd_math.h
- A: libstdc++-v3/testsuite/std/simd/complex_init.h
- A: libstdc++-v3/testsuite/std/simd/simd_bit.cc
- A: libstdc++-v3/testsuite/std/simd/simd_bit_expensive.cc
- M: libstdc++-v3/include/Makefile.am
- M: libstdc++-v3/include/Makefile.in
- M: libstdc++-v3/include/bits/simd_details.h
- M: libstdc++-v3/include/bits/simd_loadstore.h
- M: libstdc++-v3/include/bits/simd_mask.h
- M: libstdc++-v3/include/bits/simd_mask_reductions.h
- M: libstdc++-v3/include/bits/simd_vec.h
- M: libstdc++-v3/include/bits/simd_x86.h
- M: libstdc++-v3/include/bits/vec_ops.h
- M: libstdc++-v3/include/bits/version.def
- M: libstdc++-v3/include/bits/version.h
- M: libstdc++-v3/include/std/simd
- M: libstdc++-v3/testsuite/std/simd/arithmetic.cc
- M: libstdc++-v3/testsuite/std/simd/create_tests.h
- M: libstdc++-v3/testsuite/std/simd/mask2.cc
- M: libstdc++-v3/testsuite/std/simd/stores.cc
- M: libstdc++-v3/testsuite/std/simd/test_setup.h
- M: libstdc++-v3/testsuite/std/simd/traits_common.cc
- M: libstdc++-v3/testsuite/std/simd/traits_impl.cc
Matthias Kretz (2):
libstdc++: Refactor _ScalarAbi<N> into _Abi<N, N>
libstdc++: Add std::complex to the [simd] vectorizable types
libstdc++-v3/include/Makefile.am | 3 +
libstdc++-v3/include/Makefile.in | 3 +
libstdc++-v3/include/bits/simd_bit.h | 177 ++
libstdc++-v3/include/bits/simd_complex.h | 2321 +++++++++++++++++
libstdc++-v3/include/bits/simd_details.h | 218 +-
libstdc++-v3/include/bits/simd_loadstore.h | 4 +
libstdc++-v3/include/bits/simd_mask.h | 200 +-
.../include/bits/simd_mask_reductions.h | 2 +-
libstdc++-v3/include/bits/simd_math.h | 125 +
libstdc++-v3/include/bits/simd_vec.h | 25 +-
libstdc++-v3/include/bits/simd_x86.h | 46 +
libstdc++-v3/include/bits/vec_ops.h | 64 +-
libstdc++-v3/include/bits/version.def | 11 +
libstdc++-v3/include/bits/version.h | 9 +
libstdc++-v3/include/std/simd | 6 +
libstdc++-v3/testsuite/std/simd/arithmetic.cc | 3 +-
.../testsuite/std/simd/complex_init.h | 17 +
.../testsuite/std/simd/create_tests.h | 6 +-
libstdc++-v3/testsuite/std/simd/mask2.cc | 3 +-
libstdc++-v3/testsuite/std/simd/simd_bit.cc | 123 +
.../testsuite/std/simd/simd_bit_expensive.cc | 7 +
libstdc++-v3/testsuite/std/simd/stores.cc | 4 +-
libstdc++-v3/testsuite/std/simd/test_setup.h | 42 +-
.../testsuite/std/simd/traits_common.cc | 129 +
.../testsuite/std/simd/traits_impl.cc | 59 +-
25 files changed, 3487 insertions(+), 120 deletions(-)
create mode 100644 libstdc++-v3/include/bits/simd_bit.h
create mode 100644 libstdc++-v3/include/bits/simd_complex.h
create mode 100644 libstdc++-v3/include/bits/simd_math.h
create mode 100644 libstdc++-v3/testsuite/std/simd/complex_init.h
create mode 100644 libstdc++-v3/testsuite/std/simd/simd_bit.cc
create mode 100644 libstdc++-v3/testsuite/std/simd/simd_bit_expensive.cc
Range-diff against v1:
1: 10b41209bf7b = 1: b5bab8901212 libstdc++: Refactor _ScalarAbi<N> into _Abi<N, N>
2: f5be2c93bb69 ! 2: db5398e40d7d libstdc++: Add std::complex to the [simd] vectorizable types
@@ Commit message
_M_abs() is not and cannot be implemented without [simd.math] (sqrt and
hypot).
- Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
-
libstdc++-v3/ChangeLog:
* include/Makefile.am: Add bits/simd_bit.h, bits/simd_complex.h,
and bit/simd_math.
@@ Commit message
Test __complex_like. Add a test that _CxIleav is dropped when
rebinding to the member of a _CxIleav mask.
- libstdc++: Make default simd tests cheaper; add expensive tests
-
- Use GCC_TEST_RUN_EXPENSIVE=something to compile the more expensive
- tests (constexpr and const-prop testing) and to enable more / different
- widths for the test type.
-
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
- libstdc++-v3/ChangeLog:
-
- * testsuite/std/simd/simd_bit.cc: Remove dg-timeout-factor.
- * testsuite/std/simd/simd_bit_expensive.cc: Expensive variant of
-
## libstdc++-v3/include/Makefile.am ##
@@ libstdc++-v3/include/Makefile.am: bits_headers = \
${bits_srcdir}/shared_ptr_atomic.h \
@@ libstdc++-v3/include/bits/simd_complex.h (new)
+ // TODO: conversion extensions
+
+ // [simd.ctor] broadcast constructor ------------------------------------
-+ template <__explicitly_convertible_to<value_type> _Up>
++ template <__broadcast_constructible<value_type> _Up>
+ [[__gnu__::__always_inline__]]
-+ constexpr explicit(!__broadcast_constructible<_Up, value_type>)
++ constexpr
+ basic_vec(_Up&& __x) noexcept
+ : _M_data([&](int __i) {
+ if constexpr (__complex_like<_Up>)
@@ libstdc++-v3/include/bits/simd_complex.h (new)
+ })
+ {}
+
-+ template <__simd_vec_bcast_consteval<value_type> _Up>
-+ consteval
-+ basic_vec(const _Up& __x)
-+ : basic_vec(__value_preserving_cast<value_type>(__x))
-+ {}
-+
+ // [simd.ctor] conversion constructor -----------------------------------
+ template <__complex_like _Up, typename _UAbi>
+ requires (_S_size == _UAbi::_S_size)
@@ libstdc++-v3/include/bits/simd_complex.h (new)
+ // TODO: conversion extensions
+
+ // [simd.ctor] broadcast constructor ------------------------------------
-+ template <__explicitly_convertible_to<value_type> _Up>
++ template <__broadcast_constructible<value_type> _Up>
+ requires __complex_like<_Up>
+ [[__gnu__::__always_inline__]]
-+ constexpr explicit(!__broadcast_constructible<_Up, value_type>)
++ constexpr
+ basic_vec(_Up&& __x) noexcept
+ : _M_real(__x.real()), _M_imag(__x.imag())
+ {}
+
-+ template <__explicitly_convertible_to<value_type> _Up>
++ template <__broadcast_constructible<value_type> _Up>
+ [[__gnu__::__always_inline__]]
-+ constexpr explicit(!__broadcast_constructible<_Up, value_type>)
++ constexpr
+ basic_vec(_Up&& __x) noexcept
+ : _M_real(__x), _M_imag()
+ {}
+
-+ template <__simd_vec_bcast_consteval<value_type> _Up>
-+ consteval
-+ basic_vec(const _Up& __x)
-+ : _M_real(__x), _M_imag()
-+ {}
-+
+ // [simd.ctor] conversion constructor -----------------------------------
+ template <__complex_like _Up, typename _UAbi>
+ requires (_S_size == _UAbi::_S_size)
@@ libstdc++-v3/include/bits/version.def: ftms = {
+ };
+};
+
- // Standard test specifications.
- stds[97] = ">= 199711L";
- stds[03] = ">= 199711L";
+ ftms = {
+ name = is_structural;
+ values = {
## libstdc++-v3/include/bits/version.h ##
@@
@@ libstdc++-v3/include/bits/version.h
+#endif /* !defined(__cpp_lib_simd_complex) */
+#undef __glibcxx_want_simd_complex
+
- #undef __glibcxx_want_all
+ #if !defined(__cpp_lib_is_structural)
+ # if (__cplusplus > 202302L) && (__has_builtin(__builtin_is_structural))
+ # define __glibcxx_is_structural 202603L
## libstdc++-v3/include/std/simd ##
@@
@@ libstdc++-v3/include/std/simd
## libstdc++-v3/testsuite/std/simd/arithmetic.cc ##
@@
- // { dg-require-effective-target x86 }
+ // { dg-additional-options "-msse2" }
#include "test_setup.h"
+#include "complex_init.h"
@@ libstdc++-v3/testsuite/std/simd/simd_bit.cc (new)
@@
+// { dg-do run { target c++26 } }
+// { dg-require-effective-target x86 }
++// { dg-additional-options "-msse2" }
+
+#include "test_setup.h"
+#include <climits>
@@ libstdc++-v3/testsuite/std/simd/traits_common.cc: template class simd::basic_vec
+ simd::vec<float, 4> vh2f_b = float16_t();
+
+ simd::vec<float16_t, 4> vf2h = {f4, simd::flag_convert};
-+ simd::vec<float16_t, 4> vf2h_b{float()};
+
+ vh2f = vf2h;
+ vf2h = static_cast<decltype(vf2h)>(vh2f);
+
-+ return all_of(vh2f == vh2f_b) && all_of(vf2h == vf2h_b);
++ return all_of(vh2f == vh2f_b);
+ }());
+}
+#endif
@@ libstdc++-v3/testsuite/std/simd/traits_common.cc: namespace test02
// ensure 'true ? int : vec<float>' doesn't work
template <typename T>
concept has_type_member = requires { typename T::type; };
- static_assert(has_type_member<common_type<int, simd::vec<float>>>);
+ static_assert(!has_type_member<common_type<int, simd::vec<float>>>);
+
+ constexpr simd::vec<complex<double>>::mask_type k = {};
}
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc
namespace simd = std::simd;
+using std::complex;
+ #ifdef __STDCPP_FLOAT16_T__
using std::float16_t;
- using std::float32_t;
- using std::float64_t;
+ #endif
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc: void test()
{
using T = decltype(t);
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc: void test()
static_assert(sizeof(__integer_from<N>) == N);
static_assert(__vectorizable<__integer_from<N>>);
}
-+ template for (constexpr int N : {2, 4, 8})
++ template for (constexpr int N : {
++#ifdef __STDCPP_BFLOAT16_T__
++ 2,
++#endif
++ 4, 8})
+ {
+ static_assert(std::floating_point<__float_from<N>>);
+ static_assert(sizeof(__float_from<N>) == N);
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc: void test()
+ static_assert(!AC2::_S_is_cx_ctgus);
}
++#if __glibcxx_simd_complex
+ {
+ using ACx2 = _Abi_t<2, 2, _AbiVariant::_CxIleav>;
+ static_assert(__abi_tag<ACx2>);
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc: void test()
+ static_assert(AM4::_S_size == ACx2::_S_size * 2);
+ static_assert(!AM4::_S_is_cx_ileav);
+ }
++#endif
+
static_assert(__streq_to_1("1"));
static_assert(!__streq_to_1(""));
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc: void test()
+ static_assert( __value_preserving_convertible_to<double, complex<double>>);
+ static_assert(!__value_preserving_convertible_to<double, complex<float>>);
+ #ifdef __STDCPP_FLOAT16_T__
static_assert(__explicitly_convertible_to<float, float16_t>);
- static_assert(__explicitly_convertible_to<long, float16_t>);
@@ libstdc++-v3/testsuite/std/simd/traits_impl.cc: void test()
- static_assert(__broadcast_constructible<decltype(std::cw<2>), float>);
static_assert(__broadcast_constructible<decltype(std::cw<0.f>), std::float16_t>);
+ #endif
+ static_assert( __broadcast_constructible<complex<float>, complex<float>>);
+ static_assert( __broadcast_constructible<complex<float>, complex<double>>);
--
2.54.0
More information about the Libstdc++
mailing list