Files
cppdraft_translate/cppdraft/simd/loadstore.md
2025-10-25 03:02:53 +03:00

19 KiB
Raw Permalink Blame History

[simd.loadstore]

29 Numerics library [numerics]

29.10 Data-parallel types [simd]

29.10.8 basic_vec non-member operations [simd.nonmembers]

29.10.8.6 basic_vec load and store functions [simd.loadstore]

🔗

template<class V = see below, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> constexpr V unchecked_load(R&& r, flags<Flags...> f = {}); template<class V = see below, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> constexpr V unchecked_load(R&& r, const typename V::mask_type& mask, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> constexpr V unchecked_load(I first, iter_difference_t<I> n, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> constexpr V unchecked_load(I first, iter_difference_t<I> n, const typename V::mask_type& mask, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> constexpr V unchecked_load(I first, S last, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> constexpr V unchecked_load(I first, S last, const typename V::mask_type& mask, flags<Flags...> f = {});

1

#

Let

mask be V::mask_type(true) for the overloads with no mask parameter;

R be span<const iter_value_t> for the overloads with no template parameter R;

r be R(first, n) for the overloads with an n parameter and R(first, last) for the overloads with a last parameter.

2

#

Mandates: If ranges::size(r) is a constant expression thenranges::size(r) ≥ V::size().

3

#

Preconditions:

  • (3.1)

    [first, first + n) is a valid range for the overloads with an n parameter.

  • (3.2)

    [first, last) is a valid range for the overloads with a last parameter.

  • (3.3)

    ranges::size(r) ≥ V::size()

4

#

Effects: Equivalent to: return partial_load(r, mask, f);

5

#

Remarks: The default argument for template parameter V isbasic_vec<ranges::range_value_t>.

🔗

template<class V = see below, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> constexpr V partial_load(R&& r, flags<Flags...> f = {}); template<class V = see below, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> constexpr V partial_load(R&& r, const typename V::mask_type& mask, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> constexpr V partial_load(I first, iter_difference_t<I> n, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> constexpr V partial_load(I first, iter_difference_t<I> n, const typename V::mask_type& mask, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> constexpr V partial_load(I first, S last, flags<Flags...> f = {}); template<class V = see below, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> constexpr V partial_load(I first, S last, const typename V::mask_type& mask, flags<Flags...> f = {});

6

#

Let

mask be V::mask_type(true) for the overloads with no mask parameter;

R be span<const iter_value_t> for the overloads with no template parameter R;

r be R(first, n) for the overloads with an n parameter and R(first, last) for the overloads with a last parameter.

7

#

Mandates:

ranges::range_value_t is a vectorizable type,

same_as<remove_cvref_t, V> is true,

V is an enabled specialization of basic_vec, and

if the template parameter pack Flags does not contain convert-flag, then the conversion from ranges::range_value_t to V::value_type is value-preserving.

8

#

Preconditions:

  • (8.1)

    [first, first + n) is a valid range for the overloads with an n parameter.

  • (8.2)

    [first, last) is a valid range for the overloads with a last parameter.

  • (8.3)

    If the template parameter pack Flags contains aligned-flag, ranges::data(r) points to storage aligned by alignment_v<V, ranges::range_value_t>.

  • (8.4)

    If the template parameter pack Flags contains overaligned-flag, ranges::data(r) points to storage aligned by N.

9

#

Effects: Initializes the ith element with

mask[i] && i < ranges::size(r) ?static_cast(ranges::data(r)[i]) : T() for all i in the range of [0, V::size()).

10

#

Remarks: The default argument for template parameter V isbasic_vec<ranges::range_value_t>.

🔗

template<class T, class Abi, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<ranges::iterator_t<R>, T> constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, flags<Flags...> f = {}); template<class T, class Abi, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<ranges::iterator_t<R>, T> constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last, const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});

11

#

Let

mask be basic_vec<T, Abi>::mask_type(true) for the overloads with no mask parameter;

R be span<iter_value_t> for the overloads with no template parameter R;

r be R(first, n) for the overloads with an n parameter and R(first, last) for the overloads with a last parameter.

12

#

Mandates: If ranges::size(r) is a constant expression thenranges::size(r) ≥ simd-size-v<T, Abi>.

13

#

Preconditions:

  • (13.1)

    [first, first + n) is a valid range for the overloads with an n parameter.

  • (13.2)

    [first, last) is a valid range for the overloads with a last parameter.

  • (13.3)

    ranges::size(r) ≥ simd-size-v<T, Abi>

14

#

Effects: Equivalent to: partial_store(v, r, mask, f).

🔗

template<class T, class Abi, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<ranges::iterator_t<R>, T> constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, flags<Flags...> f = {}); template<class T, class Abi, ranges::[contiguous_range](range.refinements#concept:contiguous_range "25.4.6Other range refinements[range.refinements]") R, class... Flags> requires ranges::[sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<ranges::iterator_t<R>, T> constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void partial_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void partial_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last, flags<Flags...> f = {}); template<class T, class Abi, [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<I> S, class... Flags> requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3Concept indirectly_­writable[iterator.concept.writable]")<I, T> constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last, const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {});

15

#

Let

mask be basic_vec<T, Abi>::mask_type(true) for the overloads with no mask parameter;

R be span<iter_value_t> for the overloads with no template parameter R;

r be R(first, n) for the overloads with an n parameter and R(first, last) for the overloads with a last parameter.

16

#

Mandates:

ranges::range_value_t is a vectorizable type, and

if the template parameter pack Flags does not contain convert-flag, then the conversion from T to ranges::range_value_t is value-preserving.

17

#

Preconditions:

  • (17.1)

    [first, first + n) is a valid range for the overloads with an n parameter.

  • (17.2)

    [first, last) is a valid range for the overloads with a last parameter.

  • (17.3)

    If the template parameter pack Flags contains aligned-flag, ranges::data(r) points to storage aligned by alignment_v<basic_vec<T, Abi>, ranges::range_value_t>.

  • (17.4)

    If the template parameter pack Flags contains overaligned-flag, ranges::data(r) points to storage aligned by N.

18

#

Effects: For all i in the range of [0, basic_vec<T, Abi>::size()), ifmask[i] && i < ranges::size(r) is true, evaluatesranges::data(r)[i] = v[i].