@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?

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?

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
──────────────────────────────────────────────────────────────────────────

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to