From b93a719aacf8e73b35f2ecd5ca90d341cb73f90b Mon Sep 17 00:00:00 2001 From: Matthias Kretz Date: Tue, 18 Feb 2025 07:55:48 +0100 Subject: [PATCH] P3287R3 Exploration of namespaces for std::simd --- source/numerics.tex | 577 ++++++++++++++++++++++++++------------------ 1 file changed, 339 insertions(+), 238 deletions(-) diff --git a/source/numerics.tex b/source/numerics.tex index fab9bc7e05..587269c6d6 100644 --- a/source/numerics.tex +++ b/source/numerics.tex @@ -16388,24 +16388,24 @@ \rSec2[simd.syn]{Header \tcode{} synopsis} \indexheader{simd}% \begin{codeblock} -namespace std { +namespace std::datapar { // \ref{simd.traits}, \tcode{simd} type traits - template struct simd_alignment; + template struct alignment; template - constexpr size_t simd_alignment_v = simd_alignment::value; + constexpr size_t alignment_v = alignment::value; - template struct rebind_simd { using type = @\seebelow@; }; - template using rebind_simd_t = typename rebind_simd::type; - template<@\exposid{simd-size-type}@ N, class V> struct resize_simd { using type = @\seebelow@; }; - template<@\exposid{simd-size-type}@ N, class V> using resize_simd_t = typename resize_simd::type; + template struct rebind { using type = @\seebelow@; }; + template using rebind_t = typename rebind::type; + template<@\exposid{simd-size-type}@ N, class V> struct resize { using type = @\seebelow@; }; + template<@\exposid{simd-size-type}@ N, class V> using resize_t = typename resize::type; // \ref{simd.flags}, Load and store flags - template struct simd_flags; - inline constexpr simd_flags<> simd_flag_default{}; - inline constexpr simd_flags<@\exposid{convert-flag}@> simd_flag_convert{}; - inline constexpr simd_flags<@\exposid{aligned-flag}@> simd_flag_aligned{}; + template struct flags; + inline constexpr flags<> flag_default{}; + inline constexpr flags<@\exposid{convert-flag}@> flag_convert{}; + inline constexpr flags<@\exposid{aligned-flag}@> flag_aligned{}; template requires (has_single_bit(N)) - constexpr simd_flags<@\exposid{overaligned-flag}@> simd_flag_overaligned{}; + constexpr flags<@\exposid{overaligned-flag}@> flag_overaligned{}; // \ref{simd.class}, Class template \tcode{basic_simd} template> class basic_simd; @@ -16420,114 +16420,111 @@ // \ref{simd.loadstore}, \tcode{basic_simd} load and store functions template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_unchecked_load(R&& r, simd_flags f = {}); + constexpr V unchecked_load(R&& r, flags f = {}); template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_unchecked_load(R&& r, const typename V::mask_type& k, - simd_flags f = {}); + constexpr V unchecked_load(R&& r, const typename V::mask_type& k, + flags f = {}); template - constexpr V simd_unchecked_load(I first, iter_difference_t n, - simd_flags f = {}); + constexpr V unchecked_load(I first, iter_difference_t n, + flags f = {}); template - constexpr V simd_unchecked_load(I first, iter_difference_t n, - const typename V::mask_type& k, simd_flags f = {}); + constexpr V unchecked_load(I first, iter_difference_t n, + const typename V::mask_type& k, flags f = {}); template S, class... Flags> - constexpr V simd_unchecked_load(I first, S last, simd_flags f = {}); + constexpr V unchecked_load(I first, S last, flags f = {}); template S, class... Flags> - constexpr V simd_unchecked_load(I first, S last, const typename V::mask_type& k, - simd_flags f = {}); + constexpr V unchecked_load(I first, S last, const typename V::mask_type& k, + flags f = {}); template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_partial_load(R&& r, simd_flags f = {}); + constexpr V partial_load(R&& r, flags f = {}); template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_partial_load(R&& r, const typename V::mask_type& k, - simd_flags f = {}); + constexpr V partial_load(R&& r, const typename V::mask_type& k, + flags f = {}); template - constexpr V simd_partial_load(I first, iter_difference_t n, simd_flags f = {}); + constexpr V partial_load(I first, iter_difference_t n, flags f = {}); template - constexpr V simd_partial_load(I first, iter_difference_t n, - const typename V::mask_type& k, simd_flags f = {}); + constexpr V partial_load(I first, iter_difference_t n, + const typename V::mask_type& k, flags f = {}); template S, class... Flags> - constexpr V simd_partial_load(I first, S last, simd_flags f = {}); + constexpr V partial_load(I first, S last, flags f = {}); template S, class... Flags> - constexpr V simd_partial_load(I first, S last, const typename V::mask_type& k, - simd_flags f = {}); + constexpr V partial_load(I first, S last, const typename V::mask_type& k, + flags f = {}); template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_unchecked_store(const basic_simd& v, R&& r, - simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, R&& r, + flags f = {}); template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_unchecked_store(const basic_simd& v, R&& r, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, R&& r, + const typename basic_simd::mask_type& mask, flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, - iter_difference_t n, simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, + iter_difference_t n, flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, + constexpr void unchecked_store(const basic_simd& v, I first, iter_difference_t n, const typename basic_simd::mask_type& mask, - simd_flags f = {}); + flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, S last, - simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, S last, + flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, S last, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, S last, + const typename basic_simd::mask_type& mask, flags f = {}); template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_partial_store(const basic_simd& v, R&& r, - simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, R&& r, + flags f = {}); template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_partial_store(const basic_simd& v, R&& r, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, R&& r, + const typename basic_simd::mask_type& mask, flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store( - const basic_simd& v, I first, iter_difference_t n, - simd_flags f = {}); + constexpr void partial_store( + const basic_simd& v, I first, iter_difference_t n, flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store( + constexpr void partial_store( const basic_simd& v, I first, iter_difference_t n, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + const typename basic_simd::mask_type& mask, flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store(const basic_simd& v, I first, S last, - simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, I first, S last, + flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store(const basic_simd& v, I first, S last, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, I first, S last, + const typename basic_simd::mask_type& mask, flags f = {}); // \ref{simd.creation}, \tcode{basic_simd} and \tcode{basic_simd_mask} creation template - constexpr auto - simd_chunk(const basic_simd& x) noexcept; + constexpr auto chunk(const basic_simd& x) noexcept; template - constexpr auto - simd_chunk(const basic_simd_mask<@\exposid{mask-element-size}@, Abi>& x) noexcept; + constexpr auto chunk(const basic_simd_mask<@\exposid{mask-element-size}@, Abi>& x) noexcept; template - constexpr auto simd_chunk(const basic_simd& x) noexcept; + constexpr auto chunk(const basic_simd& x) noexcept; template - constexpr auto simd_chunk(const basic_simd_mask& x) noexcept; + constexpr auto chunk(const basic_simd_mask& x) noexcept; template constexpr basic_simd::size() + ...)>> - simd_cat(const basic_simd&...) noexcept; + cat(const basic_simd&...) noexcept; template constexpr basic_simd_mask, (basic_simd_mask::size() + ...)>> - simd_cat(const basic_simd_mask&...) noexcept; + cat(const basic_simd_mask&...) noexcept; // \ref{simd.mask.reductions}, \tcode{basic_simd_mask} reductions template @@ -16585,10 +16582,10 @@ const basic_simd& hi); template - constexpr auto simd_select(bool c, const T& a, const U& b) + constexpr auto select(bool c, const T& a, const U& b) -> remove_cvref_t; template - constexpr auto simd_select(const basic_simd_mask& c, const T& a, const U& b) + constexpr auto select(const basic_simd_mask& c, const T& a, const U& b) noexcept -> decltype(@\exposid{simd-select-impl}@(c, a, b)); // \ref{simd.math}, Mathematical functions @@ -16611,11 +16608,11 @@ template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ expm1(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ - frexp(const V& value, rebind_simd_t>* exp); + frexp(const V& value, rebind_t>* exp); template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> ilogb(const V& x); + constexpr rebind_t> ilogb(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ ldexp(const V& x, const - rebind_simd_t>& exp); + rebind_t>& exp); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ log(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ log10(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ log1p(const V& x); @@ -16625,10 +16622,10 @@ constexpr basic_simd modf(const type_identity_t>& value, basic_simd* iptr); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ scalbn(const V& x, const - rebind_simd_t>& n); + rebind_t>& n); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ scalbln( - const V& x, const rebind_simd_t>& n); + const V& x, const rebind_t>& n); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ cbrt(const V& x); template<@\libconcept{signed_integral}@ T, class Abi> constexpr basic_simd abs(const basic_simd& j); @@ -16650,15 +16647,15 @@ template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ nearbyint(const V& x); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ rint(const V& x); template<@\exposconcept{math-floating-point}@ V> - rebind_simd_t> lrint(const V& x); + rebind_t> lrint(const V& x); template<@\exposconcept{math-floating-point}@ V> - rebind_simd_t llrint(const @\exposid{deduced-simd-t}@& x); + rebind_t llrint(const @\exposid{deduced-simd-t}@& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ round(const V& x); template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> lround(const V& x); + constexpr rebind_t> lround(const V& x); template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> llround(const V& x); + constexpr rebind_t> llround(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ trunc(const V& x); template @@ -16667,7 +16664,7 @@ constexpr @\exposid{math-common-simd-t}@ remainder(const V0& x, const V1& y); template constexpr @\exposid{math-common-simd-t}@ - remquo(const V0& x, const V1& y, rebind_simd_t>* quo); + remquo(const V0& x, const V1& y, rebind_t>* quo); template constexpr @\exposid{math-common-simd-t}@ copysign(const V0& x, const V1& y); template @@ -16684,7 +16681,7 @@ constexpr @\exposid{math-common-simd-t}@ lerp(const V0& a, const V1& b, const V2& t) noexcept; template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> fpclassify(const V& x); + constexpr rebind_t> fpclassify(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr typename @\exposid{deduced-simd-t}@::mask_type isfinite(const V& x); template<@\exposconcept{math-floating-point}@ V> @@ -16714,12 +16711,12 @@ constexpr typename @\exposid{math-common-simd-t}@::mask_type isunordered(const V0& x, const V1& y); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ assoc_laguerre(const rebind_simd_t>& n, const - rebind_simd_t>& m, + @\exposid{deduced-simd-t}@ assoc_laguerre(const rebind_t>& n, const + rebind_t>& m, const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ assoc_legendre(const rebind_simd_t>& l, const - rebind_simd_t>& m, + @\exposid{deduced-simd-t}@ assoc_legendre(const rebind_t>& l, const + rebind_t>& m, const V& x); template @\exposid{math-common-simd-t}@ beta(const V0& x, const V1& y); @@ -16743,22 +16740,22 @@ @\exposid{math-common-simd-t}@ ellint_3(const V0& k, const V1& nu, const V2& phi); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ expint(const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ hermite(const rebind_simd_t>& n, const V& x); + @\exposid{deduced-simd-t}@ hermite(const rebind_t>& n, const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ laguerre(const rebind_simd_t>& n, const V& x); + @\exposid{deduced-simd-t}@ laguerre(const rebind_t>& n, const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ legendre(const rebind_simd_t>& l, const V& x); + @\exposid{deduced-simd-t}@ legendre(const rebind_t>& l, const V& x); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ riemann_zeta(const V& x); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ sph_bessel( - const rebind_simd_t>& n, const V& x); + const rebind_t>& n, const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ sph_legendre(const rebind_simd_t>& l, - const rebind_simd_t>& m, const V& theta); + @\exposid{deduced-simd-t}@ sph_legendre(const rebind_t>& l, + const rebind_t>& m, const V& theta); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ - sph_neumann(const rebind_simd_t>& n, const V& x); + sph_neumann(const rebind_t>& n, const V& x); // \ref{simd.bit}, Bit manipulation template<@\exposconcept{simd-type}@ V> constexpr V byteswap(const V& v) noexcept; @@ -16779,39 +16776,35 @@ constexpr V rotr(const V& v, int s) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - bit_width(const V& v) noexcept; + constexpr rebind_t, V> bit_width(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> + constexpr rebind_t, V> countl_zero(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - countl_one(const V& v) noexcept; + constexpr rebind_t, V> countl_one(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> + constexpr rebind_t, V> countr_zero(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - countr_one(const V& v) noexcept; + constexpr rebind_t, V> countr_one(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - popcount(const V& v) noexcept; + constexpr rebind_t, V> popcount(const V& v) noexcept; // \ref{simd.complex.math}, simd complex math template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> real(const V&) noexcept; + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> real(const V&) noexcept; template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> imag(const V&) noexcept; + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> imag(const V&) noexcept; template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> abs(const V&); + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> abs(const V&); template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> arg(const V&); + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> arg(const V&); template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> norm(const V&); + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> norm(const V&); template<@\exposconcept{simd-complex}@ V> constexpr V conj(const V&); template<@\exposconcept{simd-complex}@ V> constexpr V proj(const V&); @@ -16834,21 +16827,145 @@ template<@\exposconcept{simd-complex}@ V> constexpr V atanh(const V& v); template<@\exposconcept{simd-floating-point}@ V> - rebind_simd_t, V> polar(const V& x, const V& y = {}); + rebind_t, V> polar(const V& x, const V& y = {}); template<@\exposconcept{simd-complex}@ V> constexpr V pow(const V& x, const V& y); } + +namespace std { + // See \ref{simd.alg}, Algorithms + using datapar::min; + using datapar::max; + using datapar::minmax; + using datapar::clamp; + + // See \ref{simd.math}, Mathematical functions + using datapar::acos; + using datapar::asin; + using datapar::atan; + using datapar::atan2; + using datapar::cos; + using datapar::sin; + using datapar::tan; + using datapar::acosh; + using datapar::asinh; + using datapar::atanh; + using datapar::cosh; + using datapar::sinh; + using datapar::tanh; + using datapar::exp; + using datapar::exp2; + using datapar::expm1; + using datapar::frexp; + using datapar::ilogb; + using datapar::ldexp; + using datapar::log; + using datapar::log10; + using datapar::log1p; + using datapar::log2; + using datapar::logb; + using datapar::modf; + using datapar::scalbn; + using datapar::scalbln; + using datapar::cbrt; + using datapar::abs; + using datapar::abs; + using datapar::fabs; + using datapar::hypot; + using datapar::pow; + using datapar::sqrt; + using datapar::erf; + using datapar::erfc; + using datapar::lgamma; + using datapar::tgamma; + using datapar::ceil; + using datapar::floor; + using datapar::nearbyint; + using datapar::rint; + using datapar::lrint; + using datapar::llrint; + using datapar::round; + using datapar::lround; + using datapar::llround; + using datapar::trunc; + using datapar::fmod; + using datapar::remainder; + using datapar::remquo; + using datapar::copysign; + using datapar::nextafter; + using datapar::fdim; + using datapar::fmax; + using datapar::fmin; + using datapar::fma; + using datapar::lerp; + using datapar::fpclassify; + using datapar::isfinite; + using datapar::isinf; + using datapar::isnan; + using datapar::isnormal; + using datapar::signbit; + using datapar::isgreater; + using datapar::isgreaterequal; + using datapar::isless; + using datapar::islessequal; + using datapar::islessgreater; + using datapar::isunordered; + using datapar::assoc_laguerre; + using datapar::assoc_legendre; + using datapar::beta; + using datapar::comp_ellint_1; + using datapar::comp_ellint_2; + using datapar::comp_ellint_3; + using datapar::cyl_bessel_i; + using datapar::cyl_bessel_j; + using datapar::cyl_bessel_k; + using datapar::cyl_neumann; + using datapar::ellint_1; + using datapar::ellint_2; + using datapar::ellint_3; + using datapar::expint; + using datapar::hermite; + using datapar::laguerre; + using datapar::legendre; + using datapar::riemann_zeta; + using datapar::sph_bessel; + using datapar::sph_legendre; + using datapar::sph_neumann; + + // See \ref{simd.bit}, Bit manipulation + using datapar::byteswap; + using datapar::bit_ceil; + using datapar::bit_floor; + using datapar::has_single_bit; + using datapar::rotl; + using datapar::rotr; + using datapar::bit_width; + using datapar::countl_zero; + using datapar::countl_one; + using datapar::countr_zero; + using datapar::countr_one; + using datapar::popcount; + + // See \ref{simd.complex.math}, simd complex math + using datapar::real; + using datapar::imag; + using datapar::arg; + using datapar::norm; + using datapar::conj; + using datapar::proj; + using datapar::polar; +} \end{codeblock} \rSec2[simd.traits]{\tcode{simd} type traits} \begin{itemdecl} -template struct simd_alignment { @\seebelow@ }; +template struct alignment { @\seebelow@ }; \end{itemdecl} \begin{itemdescr} \pnum -\tcode{simd_alignment} has a member \tcode{value} if and only if +\tcode{alignment} has a member \tcode{value} if and only if \begin{itemize} \item \tcode{T} is a specialization of \tcode{basic_simd_mask} and \tcode{U} is @@ -16859,7 +16976,7 @@ \end{itemize} \pnum -If \tcode{value} is present, the type \tcode{simd_alignment} is a +If \tcode{value} is present, the type \tcode{alignment} is a \tcode{BinaryTypeTrait} with a base characteristic of \tcode{integral_constant} for some unspecified \tcode{N}\iref{simd.ctor,simd.loadstore}. @@ -16870,12 +16987,12 @@ \end{note} \pnum -The behavior of a program that adds specializations for \tcode{simd_alignment} +The behavior of a program that adds specializations for \tcode{alignment} is undefined. \end{itemdescr} \begin{itemdecl} -template struct rebind_simd { using type = @\seebelow@; }; +template struct rebind { using type = @\seebelow@; }; \end{itemdecl} \begin{itemdescr} @@ -16904,7 +17021,7 @@ \end{itemdescr} \begin{itemdecl} -template<@\exposid{simd-size-type}@ N, class V> struct resize_simd { using type = @\seebelow@; }; +template<@\exposid{simd-size-type}@ N, class V> struct resize { using type = @\seebelow@; }; \end{itemdecl} \begin{itemdescr} @@ -16943,21 +17060,21 @@ \rSec2[simd.flags]{Load and store flags} -\rSec3[simd.flags.overview]{Class template \tcode{simd_flags} overview} +\rSec3[simd.flags.overview]{Class template \tcode{flags} overview} \begin{codeblock} -namespace std { - template struct simd_flags { - // \ref{simd.flags.oper}, \tcode{simd_flags} operators +namespace std::datapar { + template struct flags { + // \ref{simd.flags.oper}, \tcode{flags} operators template - friend consteval auto operator|(simd_flags, simd_flags); + friend consteval auto operator|(flags, flags); }; } \end{codeblock} \pnum \begin{note} -The class template \tcode{simd_flags} acts like an integer bit-flag for types. +The class template \tcode{flags} acts like an integer bit-flag for types. \end{note} \pnum @@ -16965,17 +17082,17 @@ Every type in the parameter pack \tcode{Flags} is one of \tcode{\exposid{convert-flag}}, \tcode{\exposid{aligned-flag}}, or \tcode{\exposid{over\-aligned-\brk{}flag}}. -\rSec3[simd.flags.oper]{\tcode{simd_flags} operators} +\rSec3[simd.flags.oper]{\tcode{flags} operators} \begin{itemdecl} template - friend consteval auto operator|(simd_flags a, simd_flags b); + friend consteval auto operator|(flags a, flags b); \end{itemdecl} \begin{itemdescr} \pnum \returns - A default-initialized object of type \tcode{simd_flags} for some + A default-initialized object of type \tcode{flags} for some \tcode{Flags2} where every type in \tcode{Flags2} is present either in template parameter pack \tcode{Flags} or in template parameter pack \tcode{Other}, and every type in template parameter packs \tcode{Flags} and \tcode{Other} is present in \tcode{Flags2}. @@ -16990,7 +17107,7 @@ \rSec3[simd.overview]{Class template \tcode{basic_simd} overview} \begin{codeblock} -namespace std { +namespace std::datapar { template class basic_simd { public: using value_type = T; @@ -17007,9 +17124,9 @@ constexpr explicit(@\seebelow@) basic_simd(const basic_simd&) noexcept; template constexpr explicit basic_simd(G&& gen) noexcept; template - constexpr basic_simd(R&& range, simd_flags = {}); + constexpr basic_simd(R&& range, flags = {}); template - constexpr basic_simd(R&& range, const mask_type& mask, simd_flags = {}); + constexpr basic_simd(R&& range, const mask_type& mask, flags = {}); template<@\exposconcept{simd-floating-point}@ V> constexpr explicit(@\seebelow@) basic_simd(const V& reals, const V& imags = {}) noexcept; @@ -17214,9 +17331,9 @@ \begin{itemdecl} template - constexpr basic_simd(R&& r, simd_flags = {}); + constexpr basic_simd(R&& r, flags = {}); template - constexpr basic_simd(R&& r, const mask_type& mask, simd_flags = {}); + constexpr basic_simd(R&& r, const mask_type& mask, flags = {}); \end{itemdecl} \begin{itemdescr} @@ -17250,7 +17367,7 @@ \item If the template parameter pack \tcode{Flags} contains \tcode{\exposid{aligned-flag}}, \tcode{ranges::data(range)} points to - storage aligned by \tcode{simd_alignment_v>}. \item If the template parameter pack \tcode{Flags} contains @@ -17617,7 +17734,7 @@ \pnum \returns -An object of type \tcode{rebind_simd_t} +An object of type \tcode{rebind_t} where the $i^\text{th}$ element is initialized to the result of \tcode{\placeholder{cmplx-func}(operator[]($i$))} for all $i$ in the range \range{0}{size()}, where \placeholder{cmplx-func} is the corresponding function @@ -17825,21 +17942,20 @@ \begin{itemdecl} template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_unchecked_load(R&& r, simd_flags f = {}); + constexpr V unchecked_load(R&& r, flags f = {}); template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_unchecked_load(R&& r, const typename V::mask_type& mask, - simd_flags f = {}); + constexpr V unchecked_load(R&& r, const typename V::mask_type& mask, flags f = {}); template - constexpr V simd_unchecked_load(I first, iter_difference_t n, simd_flags f = {}); + constexpr V unchecked_load(I first, iter_difference_t n, flags f = {}); template - constexpr V simd_unchecked_load(I first, iter_difference_t n, - const typename V::mask_type& mask, simd_flags f = {}); + constexpr V unchecked_load(I first, iter_difference_t n, const typename V::mask_type& mask, + flags f = {}); template S, class... Flags> - constexpr V simd_unchecked_load(I first, S last, simd_flags f = {}); + constexpr V unchecked_load(I first, S last, flags f = {}); template S, class... Flags> - constexpr V simd_unchecked_load(I first, S last, const typename V::mask_type& mask, - simd_flags f = {}); + constexpr V unchecked_load(I first, S last, const typename V::mask_type& mask, + flags f = {}); \end{itemdecl} \begin{itemdescr} @@ -17875,7 +17991,7 @@ \pnum \effects -Equivalent to: \tcode{return simd_partial_load(r, mask, f);} +Equivalent to: \tcode{return partial_load(r, mask, f);} \pnum \remarks @@ -17886,21 +18002,20 @@ \begin{itemdecl} template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_partial_load(R&& r, simd_flags f = {}); + constexpr V partial_load(R&& r, flags f = {}); template requires ranges::@\libconcept{sized_range}@ - constexpr V simd_partial_load(R&& r, const typename V::mask_type& mask, - simd_flags f = {}); + constexpr V partial_load(R&& r, const typename V::mask_type& mask, flags f = {}); template - constexpr V simd_partial_load(I first, iter_difference_t n, simd_flags f = {}); + constexpr V partial_load(I first, iter_difference_t n, flags f = {}); template - constexpr V simd_partial_load(I first, iter_difference_t n, const typename V::mask_type& mask, - simd_flags f = {}); + constexpr V partial_load(I first, iter_difference_t n, const typename V::mask_type& mask, + flags f = {}); template S, class... Flags> - constexpr V simd_partial_load(I first, S last, simd_flags f = {}); + constexpr V partial_load(I first, S last, flags f = {}); template S, class... Flags> - constexpr V simd_partial_load(I first, S last, const typename V::mask_type& mask, - simd_flags f = {}); + constexpr V partial_load(I first, S last, const typename V::mask_type& mask, + flags f = {}); \end{itemdecl} \begin{itemdescr} @@ -17947,7 +18062,7 @@ \item If the template parameter pack \tcode{Flags} contains \tcode{\exposid{aligned-flag}}, \tcode{ranges::data(r)} points to storage - aligned by \tcode{simd_alignment_v>}. + aligned by \tcode{alignment_v>}. \item If the template parameter pack \tcode{Flags} contains \tcode{\exposid{overaligned-flag}}, \tcode{ranges::data(r)} points to @@ -17970,28 +18085,27 @@ \begin{itemdecl} template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_unchecked_store(const basic_simd& v, R&& r, - simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, R&& r, flags f = {}); template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_unchecked_store(const basic_simd& v, R&& r, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, R&& r, + const typename basic_simd::mask_type& mask, flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, iter_difference_t n, - simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, iter_difference_t n, + flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, iter_difference_t n, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, iter_difference_t n, + const typename basic_simd::mask_type& mask, flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, S last, - simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, S last, + flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_unchecked_store(const basic_simd& v, I first, S last, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void unchecked_store(const basic_simd& v, I first, S last, + const typename basic_simd::mask_type& mask, flags f = {}); \end{itemdecl} \begin{itemdescr} @@ -18030,34 +18144,33 @@ \pnum \effects -Equivalent to: \tcode{simd_partial_store(v, r, mask, f)}. +Equivalent to: \tcode{partial_store(v, r, mask, f)}. \end{itemdescr} \begin{itemdecl} template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_partial_store(const basic_simd& v, R&& r, - simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, R&& r, flags f = {}); template requires ranges::@\libconcept{sized_range}@ && @\libconcept{indirectly_writable}@, T> - constexpr void simd_partial_store(const basic_simd& v, R&& r, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, R&& r, + const typename basic_simd::mask_type& mask, flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store(const basic_simd& v, I first, iter_difference_t n, - simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, I first, iter_difference_t n, + flags f = {}); template requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store(const basic_simd& v, I first, iter_difference_t n, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, I first, iter_difference_t n, + const typename basic_simd::mask_type& mask, flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store(const basic_simd& v, I first, S last, - simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, I first, S last, + flags f = {}); template S, class... Flags> requires @\libconcept{indirectly_writable}@ - constexpr void simd_partial_store(const basic_simd& v, I first, S last, - const typename basic_simd::mask_type& mask, simd_flags f = {}); + constexpr void partial_store(const basic_simd& v, I first, S last, + const typename basic_simd::mask_type& mask, flags f = {}); \end{itemdecl} \begin{itemdescr} @@ -18099,7 +18212,7 @@ \item If the template parameter pack \tcode{Flags} contains \tcode{\exposid{aligned-flag}}, \tcode{ranges::data(r)} points to storage - aligned by \tcode{simd_alignment_v, + aligned by \tcode{alignment_v, ranges::range_value_t>}. \item If the template parameter pack \tcode{Flags} contains @@ -18118,9 +18231,9 @@ \begin{itemdecl} template - constexpr auto simd_chunk(const basic_simd& x) noexcept; + constexpr auto chunk(const basic_simd& x) noexcept; template - constexpr auto simd_chunk(const basic_simd_mask<@\exposid{mask-element-size}@, Abi>& x) noexcept; + constexpr auto chunk(const basic_simd_mask<@\exposid{mask-element-size}@, Abi>& x) noexcept; \end{itemdecl} \begin{itemdescr} @@ -18132,7 +18245,7 @@ \tcode{basic_simd}. If \tcode{basic_simd<\brk{}typename T::\brk{}value_type, Abi>::size() \% T::size()} is not \tcode{0} then - \tcode{resize_simd_t::size() + \tcode{resize_t::size() \% T::size(), T>} is valid and denotes a type. \item @@ -18140,7 +18253,7 @@ \tcode{basic_simd\-_\-mask}. If \tcode{basic_simd_mask<\exposid{mask-element-size}, Abi>::size() \% T::size()} is not \tcode{0} then - \tcode{resize_simd_t<\brk{}ba\-sic\-_\-simd_mask<\brk{}\exposid{mask-element-size}, + \tcode{resize_t<\brk{}ba\-sic\-_\-simd_mask<\brk{}\exposid{mask-element-size}, Abi>::size() \% T::size(), T>} is valid and denotes a type. \end{itemize} @@ -18158,7 +18271,7 @@ \item Otherwise, a \tcode{tuple} of $N$ objects of type \tcode{T} and one object - of type \tcode{resize_simd_t}. + of type \tcode{resize_t}. The $i^\text{th}$ \tcode{basic_simd} or \tcode{basic_simd_mask} element of the $j^\text{th}$ \tcode{tuple} element of type \tcode{T} is initialized to the value of the element in \tcode{x} with index \tcode{$i$ + $j$ * @@ -18171,40 +18284,34 @@ \begin{itemdecl} template - constexpr auto simd_chunk(const basic_simd& x) noexcept; + constexpr auto chunk(const basic_simd& x) noexcept; \end{itemdecl} \begin{itemdescr} \pnum \effects -Equivalent to: -\begin{codeblock} -return simd_chunk>>(x); -\end{codeblock} +Equivalent to: \tcode{return chunk>>(x);} \end{itemdescr} \begin{itemdecl} template - constexpr auto simd_chunk(const basic_simd_mask& x) noexcept; + constexpr auto chunk(const basic_simd_mask& x) noexcept; \end{itemdecl} \begin{itemdescr} \pnum \effects -Equivalent to: -\begin{codeblock} -return simd_chunk>>(x); -\end{codeblock} +Equivalent to: \tcode{return chunk>>(x);} \end{itemdescr} \begin{itemdecl} template constexpr simd::size() + ...)> - simd_cat(const basic_simd&... xs) noexcept; + cat(const basic_simd&... xs) noexcept; template constexpr basic_simd_mask, (basic_simd_mask::size() + ...)>> - simd_cat(const basic_simd_mask&... xs) noexcept; + cat(const basic_simd_mask&... xs) noexcept; \end{itemdecl} \begin{itemdescr} @@ -18303,7 +18410,7 @@ \begin{itemdecl} template - constexpr auto simd_select(bool c, const T& a, const U& b) + constexpr auto select(bool c, const T& a, const U& b) -> remove_cvref_t; \end{itemdecl} @@ -18315,7 +18422,7 @@ \begin{itemdecl} template - constexpr auto simd_select(const basic_simd_mask& c, const T& a, const U& b) + constexpr auto select(const basic_simd_mask& c, const T& a, const U& b) noexcept -> decltype(@\exposid{simd-select-impl}@(c, a, b)); \end{itemdecl} @@ -18334,14 +18441,14 @@ \begin{itemdecl} template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> ilogb(const V& x); + constexpr rebind_t> ilogb(const V& x); template<@\exposconcept{math-floating-point}@ V> - constexpr @\exposid{deduced-simd-t}@ ldexp(const V& x, const rebind_simd_t>& exp); + constexpr @\exposid{deduced-simd-t}@ ldexp(const V& x, const rebind_t>& exp); template<@\exposconcept{math-floating-point}@ V> - constexpr @\exposid{deduced-simd-t}@ scalbn(const V& x, const rebind_simd_t>& n); + constexpr @\exposid{deduced-simd-t}@ scalbn(const V& x, const rebind_t>& n); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ - scalbln(const V& x, const rebind_simd_t>& n); + scalbln(const V& x, const rebind_t>& n); template<@\libconcept{signed_integral}@ T, class Abi> constexpr basic_simd abs(const basic_simd& j); template<@\exposconcept{math-floating-point}@ V> @@ -18357,15 +18464,15 @@ template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ rint(const V& x); template<@\exposconcept{math-floating-point}@ V> - rebind_simd_t> lrint(const V& x); + rebind_t> lrint(const V& x); template<@\exposconcept{math-floating-point}@ V> - rebind_simd_t> llrint(const V& x); + rebind_t> llrint(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr @\exposid{deduced-simd-t}@ round(const V& x); template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> lround(const V& x); + constexpr rebind_t> lround(const V& x); template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> llround(const V& x); + constexpr rebind_t> llround(const V& x); template constexpr @\exposid{math-common-simd-t}@ fmod(const V0& x, const V1& y); template<@\exposconcept{math-floating-point}@ V> @@ -18385,7 +18492,7 @@ template constexpr @\exposid{math-common-simd-t}@ fma(const V0& x, const V1& y, const V2& z); template<@\exposconcept{math-floating-point}@ V> - constexpr rebind_simd_t> fpclassify(const V& x); + constexpr rebind_t> fpclassify(const V& x); template<@\exposconcept{math-floating-point}@ V> constexpr typename @\exposid{deduced-simd-t}@::mask_type isfinite(const V& x); template<@\exposconcept{math-floating-point}@ V> @@ -18477,12 +18584,12 @@ template constexpr @\exposid{math-common-simd-t}@ lerp(const V0& a, const V1& b, const V2& t) noexcept; template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ assoc_laguerre(const rebind_simd_t>& n, const - rebind_simd_t>& m, + @\exposid{deduced-simd-t}@ assoc_laguerre(const rebind_t>& n, const + rebind_t>& m, const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ assoc_legendre(const rebind_simd_t>& l, const - rebind_simd_t>& m, + @\exposid{deduced-simd-t}@ assoc_legendre(const rebind_t>& l, const + rebind_t>& m, const V& x); template @\exposid{math-common-simd-t}@ beta(const V0& x, const V1& y); @@ -18505,20 +18612,20 @@ template @\exposid{math-common-simd-t}@ ellint_3(const V0& k, const V1& nu, const V2& phi); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ expint(const V& x); -template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ hermite(const rebind_simd_t @\exposid{deduced-simd-t}@ hermite(const rebind_t>& n, const V& x); -template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ laguerre(const rebind_simd_t @\exposid{deduced-simd-t}@ laguerre(const rebind_t>& n, const V& x); -template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ legendre(const rebind_simd_t @\exposid{deduced-simd-t}@ legendre(const rebind_t>& l, const V& x); template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ riemann_zeta(const V& x); -template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ sph_bessel(const rebind_simd_t @\exposid{deduced-simd-t}@ sph_bessel(const rebind_t>& n, const V& x); template<@\exposconcept{math-floating-point}@ V> - @\exposid{deduced-simd-t}@ sph_legendre(const rebind_simd_t>& l, - const rebind_simd_t>& m, + @\exposid{deduced-simd-t}@ sph_legendre(const rebind_t>& l, + const rebind_t>& m, const V& theta); -template<@\exposconcept{math-floating-point}@ V> @\exposid{deduced-simd-t}@ sph_neumann(const rebind_simd_t @\exposid{deduced-simd-t}@ sph_neumann(const rebind_t>& n, const V& x); \end{itemdecl} @@ -18552,7 +18659,7 @@ \begin{itemdecl} template<@\exposconcept{math-floating-point}@ V> - constexpr @\exposid{deduced-simd-t}@ frexp(const V& value, rebind_simd_t>* exp); + constexpr @\exposid{deduced-simd-t}@ frexp(const V& value, rebind_t>* exp); \end{itemdecl} \begin{itemdescr} @@ -18561,15 +18668,15 @@ Let \placeholder{frexp-simd} denote: \begin{codeblock} template -pair> @\placeholder{frexp-simd}@(const V& x) { +pair> @\placeholder{frexp-simd}@(const V& x) { int r1[Ret::size()]; Ret r0([&](@\exposid{simd-size-type}@ i) { frexp(@\exposid{make-compatible-simd-t}@(x)[i], &r1[i]); }); - return {r0, rebind_simd_t(r1)}; + return {r0, rebind_t(r1)}; } \end{codeblock} -Let \tcode{ret} be a value of type \tcode{pair>} +Let \tcode{ret} be a value of type \tcode{pair>} that is the same value as the result of calling \placeholder{frexp-simd}\tcode{(x)}. @@ -18585,7 +18692,7 @@ \begin{itemdecl} template constexpr @\exposid{math-common-simd-t}@ remquo(const V0& x, const V1& y, - rebind_simd_t>* quo); + rebind_t>* quo); \end{itemdecl} \begin{itemdescr} @@ -18594,16 +18701,16 @@ Let \placeholder{remquo-simd} denote: \begin{codeblock} template -pair> @\placeholder{remquo-simd}@(const V0& x, const V1& y) { +pair> @\placeholder{remquo-simd}@(const V0& x, const V1& y) { int r1[Ret::size()]; Ret r0([&](@\exposid{simd-size-type}@ i) { remquo(@\exposid{make-compatible-simd-t}@(x)[i], @\exposid{make-compatible-simd-t}@(y)[i], &r1[i]); }); - return {r0, rebind_simd_t(r1)}; + return {r0, rebind_t(r1)}; } \end{codeblock} -Let \tcode{ret} be a value of type \tcode{pair>} +Let \tcode{ret} be a value of type \tcode{pair>} that is the same value as the result of calling \placeholder{remquo-simd}\tcode{(x, y)}. If in an invocation of a scalar overload of \tcode{remquo} for index \tcode{i} @@ -18781,23 +18888,17 @@ \begin{itemdecl} template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - bit_width(const V& v) noexcept; + constexpr rebind_t, V> bit_width(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - countl_zero(const V& v) noexcept; + constexpr rebind_t, V> countl_zero(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - countl_one(const V& v) noexcept; + constexpr rebind_t, V> countl_one(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - countr_zero(const V& v) noexcept; + constexpr rebind_t, V> countr_zero(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - countr_one(const V& v) noexcept; + constexpr rebind_t, V> countr_one(const V& v) noexcept; template<@\exposconcept{simd-type}@ V> - constexpr rebind_simd_t, V> - popcount(const V& v) noexcept; + constexpr rebind_t, V> popcount(const V& v) noexcept; \end{itemdecl} \begin{itemdescr} @@ -18817,16 +18918,16 @@ \begin{itemdecl} template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> real(const V&) noexcept; + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> real(const V&) noexcept; template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> imag(const V&) noexcept; + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> imag(const V&) noexcept; template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> abs(const V&); + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> abs(const V&); template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> arg(const V&); + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> arg(const V&); template<@\exposconcept{simd-complex}@ V> - constexpr rebind_simd_t<@\exposid{simd-complex-value-type}@, V> norm(const V&); + constexpr rebind_t<@\exposid{simd-complex-value-type}@, V> norm(const V&); template<@\exposconcept{simd-complex}@ V> constexpr V conj(const V&); template<@\exposconcept{simd-complex}@ V> constexpr V proj(const V&); @@ -18866,7 +18967,7 @@ \begin{itemdecl} template<@\exposconcept{simd-floating-point}@ V> - rebind_simd_t, V> polar(const V& x, const V& y = {}); + rebind_t, V> polar(const V& x, const V& y = {}); template<@\exposconcept{simd-complex}@ V> constexpr V pow(const V& x, const V& y); \end{itemdecl} @@ -18891,7 +18992,7 @@ \rSec3[simd.mask.overview]{Class template \tcode{basic_simd_mask} overview} \begin{codeblock} -namespace std { +namespace std::datapar { template class basic_simd_mask { public: using value_type = bool;