On Tue, Feb 24, 2026 at 2:04 PM Matthias Kretz <[email protected]> wrote:
> @Jonathan: I assume this patch is on your todo list already? ;) > > @Thomasz: Should I submit a PR on top of my branch on the forge to get > started > on complex support? > Yes, I think so. > > General comment: There's one important design alternative that might help > against template bloat when using very large widths. Right now e.g. > vec<double, 63> on SSE is a nasty explosion of the following vec<double, > N>: > 32, 31 -> 16, 15 -> 8, 7 -> 4, 3 -> 2, 1. So that's 11 different basic_vec > instantiations when the user writes vec<double, 63>. Granted, a user > shouldn't > do that when targeting SSE. So, do we care? > I think the above ouput is something that I would expect when I ask for 63 elements simd vec, so I would say we are OK for now. > > If we care, the alternative implementation of vec<double, 63> would use > array<vec<double, 2>, 31> and vec<double, 1> as data members. > This is possible to implement. But it doesn't make the code easier > (especially > reductions), and it amounts to a partial rewrite. > > - Matthias > > Matthias Kretz [Wednesday, 11 February 2026 16:07:29 CET]: > > Tested on x86_64-pc-linux-gnu. > > Reviewed by Tomasz at > https://forge.sourceware.org/gcc/gcc-TEST/pulls/117. > > > > ------------- 8< ------------ > > > > This implementation differs significantly from the > > std::experimental::simd implementation. One goal was a reduction in > > template instantiations wrt. what std::experimental::simd did. > > > > Design notes: > > > > - bits/vec_ops.h contains concepts, traits, and functions for working > > with GNU vector builtins that are mostly independent from std::simd. > > These could move from std::simd:: to std::__vec (or similar). However, > > we would then need to revisit naming. For now we kept everything in > > the std::simd namespace with __vec_ prefix in the names. The __vec_* > > functions can be called unqualified because they can never be called > > on user-defined types (no ADL). If we ever get simd<UDT> support this > > will be implemented via bit_cast to/from integral vector > > builtins/intrinsics. > > > > - bits/simd_x86.h extends vec_ops.h with calls to __builtin_ia32_* that > > can only be used after uttering the right GCC target pragma. > > > > - basic_vec and basic_mask are built on top of register-size GNU vector > > builtins (for now / x86). Any larger vec/mask is a tree of power-of-2 > > #elements on the "first" branch. Anything non-power-of-2 that is > > smaller than register size uses padding elements that participate in > > element-wise operations. The library ensures that padding elements > > lead to no side effects. The implementation makes no assumption on the > > values of these padding elements since the user can bit_cast to > > basic_vec/basic_mask. > > > > Implementation status: > > > > - The implementation is prepared for more than x86 but is x86-only for > > now. > > > > - Parts of [simd] *not* implemented in this patch: > > > > - std::complex<floating-point> as vectorizable types > > - [simd.permute.dynamic] > > - [simd.permute.mask] > > - [simd.permute.memory] > > - [simd.bit] > > - [simd.math] > > - mixed operations with vec-mask and bit-mask types > > - some conversion optimizations (open questions wrt. missed > > optimizations in the compiler) > > > > - This patch implements P3844R3 "Restore simd::vec broadcast from int", > > which is not part of the C++26 WD draft yet. If the paper does not get > > accepted the feature will be reverted. > > > > - The standard feature test macro __cpp_lib_simd is not defined yet. > > > > Tests: > > > > - Full coverage requires testing > > 1. constexpr, > > 2. constant-propagating inputs, and > > 3. unknown (to the optimizer) inputs > > - for all vectorizable types > > * for every supported width (1–64 and higher) > > + for all possible ISA extensions (combinations) > > = with different fast-math flags > > ... leading to a test matrix that's far out of reach for regular > > testsuite builds. > > > > - The tests in testsuite/std/simd/ try to cover all of the API. The > > tests can be build in every combination listed above. Per default only > > a small subset is built and tested. > > > > - Tests can still emit bogus -Wpsabi warnings (see PR98734) which are > > filtered out via dg-prune-output. > > > > Benchmarks: > > > > - The current implementation has been benchmarked in some aspects on > > x86_64 hardware. There is more optimization potential. However, it is > > not always clear whether optimizations should be part of the library > > if they can be implemented in the compiler. > > > > - No benchmark code is included in this patch. > > > > libstdc++-v3/ChangeLog: > > > > * include/Makefile.am: Add simd headers. > > * include/Makefile.in: Regenerate. > > * include/bits/version.def (simd): New. > > * include/bits/version.h: Regenerate. > > * include/bits/simd_alg.h: New file. > > * include/bits/simd_details.h: New file. > > * include/bits/simd_flags.h: New file. > > * include/bits/simd_iterator.h: New file. > > * include/bits/simd_loadstore.h: New file. > > * include/bits/simd_mask.h: New file. > > * include/bits/simd_mask_reductions.h: New file. > > * include/bits/simd_reductions.h: New file. > > * include/bits/simd_vec.h: New file. > > * include/bits/simd_x86.h: New file. > > * include/bits/vec_ops.h: New file. > > * include/std/simd: New file. > > * testsuite/std/simd/arithmetic.cc: New test. > > * testsuite/std/simd/creation.cc: New test. > > * testsuite/std/simd/loads.cc: New test. > > * testsuite/std/simd/mask.cc: New test. > > * testsuite/std/simd/reductions.cc: New test. > > * testsuite/std/simd/shift_left.cc: New test. > > * testsuite/std/simd/shift_right.cc: New test. > > * testsuite/std/simd/simd_alg.cc: New test. > > * testsuite/std/simd/sse_intrin.cc: New test. > > * testsuite/std/simd/stores.cc: New test. > > * testsuite/std/simd/test_setup.h: New test. > > * testsuite/std/simd/traits_common.cc: New test. > > * testsuite/std/simd/traits_impl.cc: New test. > > * testsuite/std/simd/traits_math.cc: New test. > > > > libstdc++-v3/include/Makefile.am | 12 + > > libstdc++-v3/include/Makefile.in | 12 + > > libstdc++-v3/include/bits/simd_alg.h | 98 + > > libstdc++-v3/include/bits/simd_details.h | 1405 ++++++++++ > > libstdc++-v3/include/bits/simd_flags.h | 187 ++ > > libstdc++-v3/include/bits/simd_iterator.h | 177 ++ > > libstdc++-v3/include/bits/simd_loadstore.h | 399 +++ > > libstdc++-v3/include/bits/simd_mask.h | 1946 ++++++++++++++ > > .../include/bits/simd_mask_reductions.h | 118 + > > libstdc++-v3/include/bits/simd_reductions.h | 109 + > > libstdc++-v3/include/bits/simd_vec.h | 2301 +++++++++++++++++ > > libstdc++-v3/include/bits/simd_x86.h | 1413 ++++++++++ > > libstdc++-v3/include/bits/vec_ops.h | 583 +++++ > > libstdc++-v3/include/bits/version.def | 13 + > > libstdc++-v3/include/bits/version.h | 9 + > > libstdc++-v3/include/std/simd | 48 + > > libstdc++-v3/testsuite/std/simd/arithmetic.cc | 336 +++ > > libstdc++-v3/testsuite/std/simd/creation.cc | 76 + > > libstdc++-v3/testsuite/std/simd/loads.cc | 84 + > > libstdc++-v3/testsuite/std/simd/mask.cc | 176 ++ > > libstdc++-v3/testsuite/std/simd/reductions.cc | 97 + > > libstdc++-v3/testsuite/std/simd/shift_left.cc | 68 + > > .../testsuite/std/simd/shift_right.cc | 92 + > > libstdc++-v3/testsuite/std/simd/simd_alg.cc | 144 ++ > > libstdc++-v3/testsuite/std/simd/sse_intrin.cc | 42 + > > libstdc++-v3/testsuite/std/simd/stores.cc | 74 + > > libstdc++-v3/testsuite/std/simd/test_setup.h | 807 ++++++ > > .../testsuite/std/simd/traits_common.cc | 687 +++++ > > .../testsuite/std/simd/traits_impl.cc | 160 ++ > > .../testsuite/std/simd/traits_math.cc | 62 + > > 30 files changed, 11735 insertions(+) > > create mode 100644 libstdc++-v3/include/bits/simd_alg.h > > create mode 100644 libstdc++-v3/include/bits/simd_details.h > > create mode 100644 libstdc++-v3/include/bits/simd_flags.h > > create mode 100644 libstdc++-v3/include/bits/simd_iterator.h > > create mode 100644 libstdc++-v3/include/bits/simd_loadstore.h > > create mode 100644 libstdc++-v3/include/bits/simd_mask.h > > create mode 100644 libstdc++-v3/include/bits/simd_mask_reductions.h > > create mode 100644 libstdc++-v3/include/bits/simd_reductions.h > > create mode 100644 libstdc++-v3/include/bits/simd_vec.h > > create mode 100644 libstdc++-v3/include/bits/simd_x86.h > > create mode 100644 libstdc++-v3/include/bits/vec_ops.h > > create mode 100644 libstdc++-v3/include/std/simd > > create mode 100644 libstdc++-v3/testsuite/std/simd/arithmetic.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/creation.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/loads.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/mask.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/reductions.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/shift_left.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/shift_right.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/simd_alg.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/sse_intrin.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/stores.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/test_setup.h > > create mode 100644 libstdc++-v3/testsuite/std/simd/traits_common.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/traits_impl.cc > > create mode 100644 libstdc++-v3/testsuite/std/simd/traits_math.cc > > > -- > ────────────────────────────────────────────────────────────────────────── > Dr. Matthias Kretz https://mattkretz.github.io > GSI Helmholtz Center for Heavy Ion Research https://gsi.de > std::simd > ────────────────────────────────────────────────────────────────────────── >
