5#include "argon/argon_full.hpp"
6#include "arm_simd/helpers/vec128.hpp"
8#ifdef __ARM_FEATURE_MVE
14namespace argon::vectorize {
16template <
typename ScalarType>
17struct store : std::ranges::view_interface<store<ScalarType>> {
18 using intrinsic_type = simd::Vec128_t<ScalarType>;
19 static constexpr size_t lanes =
sizeof(intrinsic_type) /
sizeof(ScalarType);
20 static constexpr size_t vectorizeable_size(
size_t size) {
return size & ~(lanes - 1); }
23 struct StoreIterator {
25 using difference_type = std::ptrdiff_t;
28 StoreIterator() =
default;
29 StoreIterator(ScalarType*
ptr) : ptr_{
ptr} {}
34 StoreIterator& operator+=(
int n) {
41 StoreIterator& operator-=(
int n) {
48 StoreIterator operator++(
int) {
49 StoreIterator tmp = *
this;
54 StoreIterator operator--(
int) {
55 StoreIterator tmp = *
this;
60 StoreIterator& operator++() {
67 StoreIterator& operator--() {
78 StoreIterator it = *
this;
87 StoreIterator it = *
this;
98 friend StoreIterator
operator+(
const int n,
const StoreIterator& it) {
return it + n; }
101 friend bool operator==(
const StoreIterator& a,
const ScalarType*
ptr) {
return a.ptr_ ==
ptr; }
102 friend bool operator!=(
const StoreIterator& a,
const StoreIterator& b) {
return a.ptr_ != b.ptr_; }
103 friend bool operator!=(
const StoreIterator& a,
const ScalarType* ptr) {
return a.ptr_ != ptr; }
104 friend auto operator<=>(
const StoreIterator& a,
const StoreIterator& b) {
return a.ptr_ <=> b.ptr_; }
107 Argon<ScalarType> vec_{};
108 ScalarType* ptr_ =
nullptr;
110 static_assert(std::sized_sentinel_for<StoreIterator, StoreIterator>);
111 static_assert(std::output_iterator<StoreIterator, Argon<ScalarType>>);
115 iterator begin() {
return start_; }
116 ScalarType* end() {
return start_ + size_; }
117 size_t size()
const {
return size_ / lanes; }
119 template <std::ranges::contiguous_range R>
120 store(R&& r) : start_{&*std::ranges::begin(r)}, size_{vectorizeable_size(std::ranges::size(r))} {}
126static_assert(std::ranges::range<store<int32_t>>);
127static_assert(std::ranges::view<store<int32_t>>);
128static_assert(std::movable<store<int32_t>>);
129static_assert(std::ranges::viewable_range<store<int32_t>>);
131template <std::ranges::contiguous_range R>
134template <
typename ScalarType>
Definition argon_full.hpp:24
friend StoreIterator operator+(const int n, const StoreIterator &it)
Adds an integer to the iterator and returns a new iterator.
Definition store.hpp:98
StoreIterator operator+(int n) const
Adds an integer to the iterator and returns a new iterator.
Definition store.hpp:77
std::input_iterator_tag iterator_category
The iterator category.
Definition store.hpp:24
StoreIterator operator-(int n) const
Subtracts an integer from the iterator and returns a new iterator.
Definition store.hpp:86