11#include "argon/argon_full.hpp"
12#include "arm_simd/helpers/scalar.hpp"
13#include "arm_simd/helpers/vec128.hpp"
16#ifdef __ARM_FEATURE_MVE
23template <
typename ScalarType>
25 using intrinsic_type = simd::Vec128_t<ScalarType>;
26 static constexpr size_t lanes =
sizeof(intrinsic_type) /
sizeof(ScalarType);
27 static constexpr size_t vectorizeable_size(
size_t size) {
return size & ~(lanes - 1); }
29 using difference_type = std::ptrdiff_t;
34 ArgonPtr(
const ArgonPtr&) =
default;
35 ArgonPtr& operator=(
const ArgonPtr&) =
default;
36 ArgonPtr(ArgonPtr&&) =
default;
44 pointer operator->() {
49 value_type& operator*() {
54 const value_type& operator*()
const {
return vec_; }
55 const pointer operator->()
const {
return &vec_; }
57 void store() { vec_.StoreTo(ptr_); }
60 friend bool operator==(
const ArgonPtr& a,
const ArgonPtr& b) {
return a.ptr_ == b.ptr_; }
61 friend bool operator==(
const ArgonPtr& a,
const ScalarType* ptr) {
return a.ptr_ == ptr; }
62 friend bool operator!=(
const ArgonPtr& a,
const ArgonPtr& b) {
return a.ptr_ != b.ptr_; }
63 friend bool operator!=(
const ArgonPtr& a,
const ScalarType* ptr) {
return a.ptr_ != ptr; }
71namespace argon::vectorize {
73template <
typename ScalarType>
74struct ptr : std::ranges::view_interface<ptr<ScalarType>> {
75 using intrinsic_type = simd::Vec128_t<ScalarType>;
76 static constexpr size_t lanes =
sizeof(intrinsic_type) /
sizeof(ScalarType);
77 static constexpr size_t vectorizeable_size(
size_t size) {
return size & ~(lanes - 1); }
81 using difference_type = std::ptrdiff_t;
84 Iterator(ScalarType* pointer) : ptr_{pointer} {}
88 Iterator& operator++() {
93 void operator++(
int) { ++*
this; }
94 friend bool operator==(
const Iterator& a,
const Iterator& b) {
return a.ptr_ == b.ptr_; }
95 friend bool operator==(
const Iterator& a,
const ScalarType* pointer) {
return a.ptr_ == pointer; }
96 friend bool operator!=(
const Iterator& a,
const Iterator& b) {
return a.ptr_ != b.ptr_; }
97 friend bool operator!=(
const Iterator& a,
const ScalarType* pointer) {
return a.ptr_ != pointer; }
100 ScalarType* ptr_ =
nullptr;
102 static_assert(std::input_iterator<Iterator>);
106 iterator begin() {
return start_; }
107 ScalarType* end() {
return start_ + size_; }
108 size_t size()
const {
return size_ / lanes; }
110 template <std::ranges::contiguous_range R>
111 ptr(R&& r) : start_{&*
std::ranges::begin(r)}, size_{vectorizeable_size(
std::ranges::size(r))} {}
117template <std::ranges::contiguous_range R>
120static_assert(std::ranges::range<ptr<int32_t>>);
121static_assert(std::ranges::view<ptr<int32_t>>);
122static_assert(std::movable<ptr<int32_t>>);
123static_assert(std::ranges::viewable_range<ptr<int32_t>>);
Definition argon_full.hpp:24
static ace argon_type Load(const scalar_type *ptr)
Definition vector.hpp:788
Lane deconstruction feature.
Definition argon_full.hpp:302