29.10.2.2 [simd.expos.abi]
A single class template std::simd::_Abi<N, Regs, Var> is defined to cover all
necessary ABI tag types.
Nis the number of elements in thebasic_vec/basic_mask.Regsis the (minimum) number of registers needed to hold allNelements.Varis a bit-flag identifying mask and layout variants (vector masks vs bit masks; interleaved vs contiguous storage of real and imaginary parts ofcomplex<T>)
29.10.2.2 [simd.expos.abi] There currently is no hard maximum on the number of elements in a data-parallel type. However, depending on target architecture and element type, certain numbers will be too inefficient to compile and use.
29.10.2.2 [simd.expos.abi]
native-abi<T> is an alias for _Abi<N, 1, Var> such that N is maximal.
Var prefers bit masks over vector masks and interleaved complex over
contiguous complex.
29.10.3 [simd.syn]
zero_element is INT_MIN and uninit_element is zero_element + 1.
29.10.7.1 [simd.overview]
A basic_vec<T, _Abi<N, Regs, Var>> specialization is enabled if N >= 1,
Regs >= 1, and
Varidentifies non-complex storage, vector masks, andTis an arithmetic type,Varidentifies non-complex storage, bit masks,Tis an arithmetic type, and the target supports AVX-512,Varidentifies interleaved or contiguous complex storage, vector masks, andTis a specialization ofcomplex<U>, orVaridentifies interleaved or contiguous complex storage, bit masks,Tis a specialization ofcomplex<U>, and the target supports AVX-512,
29.10.7.1 [simd.overview]
- In general,
basic_vec<T, _Abi<N, Regs, Var>>with arithmetic typeTcan be converted to and from GNU vector types (see GNU attributevector_size(Bytes)) of element typeTwithstd::bit_ceil(N)elements. - On x86 targets
basic_vec<T, _Abi<N, 1, Var>>can be converted to and from__m128ifTisfloatorstd::float32_t, andsizeof(basic_vec)is 16;__m128difTisdoubleorstd::float64_t, andsizeof(basic_vec)is 16;__m128hifTisstd::float16_t, andsizeof(basic_vec)is 16;__m128iifTis integral, andsizeof(basic_vec)is 16;__m256ifTisfloatorstd::float32_t, andsizeof(basic_vec)is 32;__m256difTisdoubleorstd::float64_t, andsizeof(basic_vec)is 32;__m256hifTisstd::float16_t, andsizeof(basic_vec)is 32;__m256iifTis integral, andsizeof(basic_vec)is 32;__m512ifTisfloatorstd::float32_t, andsizeof(basic_vec)is 64;__m512difTisdoubleorstd::float64_t, andsizeof(basic_vec)is 64;__m512hifTisstd::float16_t, andsizeof(basic_vec)is 64;__m512iifTis integral, andsizeof(basic_vec)is 64.
29.10.9.1 [simd.mask.overview]
A basic_mask<Bytes, _Abi<N, Regs, Var>> specialization is enabled if N >= 1,
Regs >= 1, and
- TODO
29.10.9.1 [simd.mask.overview]
-
If
Vardoes not identify a vector mask, no additional conversions are available. -
If
Varidentifies non-complex element types, thenbasic_mask<Bytes, _Abi<N, Regs, Var>>can be converted to and from GNU vector types of element typeT, whereTis the first type ofsigned char,signed short,signed int,signed long long, orsigned longwithsizeof(T) == Bytes. The number of elements in the GNU vector type must be equal tostd::bit_ceil(N). -
If
Varidentifies complex element types,basic_mask<Bytes, _Abi<N, Regs, Var>>can be converted to and from GNU vector types of element typeT, whereTis the first type ofsigned char,signed short,signed int,signed long long, orsigned longwithsizeof(T) == Bytes / 2(matching thesizeofa single real/imag element in thecomplexvalue-type).-
If
Varidentifies interleaved storage andN > 1, the number of elements in the GNU vector type must be equal tostd::bit_ceil(N * 2). -
Otherwise, the number of elements in the GNU vector type must be equal to
std::bit_ceil(N).
-
SPDX-License-Identifier: CC-BY-4.0 Copyright © 2026 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH Matthias Kretz m.kretz@gsi.de