3#include "argon/utility.hpp"
9#ifdef __ARM_FEATURE_MVE
15#ifdef ARGON_PLATFORM_SIMDE
18#define nce [[gnu::always_inline]] constexpr
20#define nce [[gnu::always_inline]] inline
24#ifndef ARGON_PLATFORM_MVE
26nce T load1_lane(T vec,
const int i, Scalar_t<T>
const* ptr) {
27 constexpr size_t lanes =
sizeof(T) /
sizeof(Scalar_t<T>);
30 if constexpr (lanes == 2) {
33 return neon::load1_lane_quad<0>(ptr, vec);
35 return neon::load1_lane_quad<1>(ptr, vec);
39 }
else if constexpr (lanes == 4) {
42 return neon::load1_lane_quad<0>(ptr, vec);
44 return neon::load1_lane_quad<1>(ptr, vec);
46 return neon::load1_lane_quad<2>(ptr, vec);
48 return neon::load1_lane_quad<3>(ptr, vec);
52 }
else if constexpr (lanes == 8) {
55 return neon::load1_lane_quad<0>(ptr, vec);
57 return neon::load1_lane_quad<1>(ptr, vec);
59 return neon::load1_lane_quad<2>(ptr, vec);
61 return neon::load1_lane_quad<3>(ptr, vec);
63 return neon::load1_lane_quad<4>(ptr, vec);
65 return neon::load1_lane_quad<5>(ptr, vec);
67 return neon::load1_lane_quad<6>(ptr, vec);
69 return neon::load1_lane_quad<7>(ptr, vec);
73 }
else if constexpr (lanes == 16) {
76 return neon::load1_lane_quad<0>(ptr, vec);
78 return neon::load1_lane_quad<1>(ptr, vec);
80 return neon::load1_lane_quad<2>(ptr, vec);
82 return neon::load1_lane_quad<3>(ptr, vec);
84 return neon::load1_lane_quad<4>(ptr, vec);
86 return neon::load1_lane_quad<5>(ptr, vec);
88 return neon::load1_lane_quad<6>(ptr, vec);
90 return neon::load1_lane_quad<7>(ptr, vec);
92 return neon::load1_lane_quad<8>(ptr, vec);
94 return neon::load1_lane_quad<9>(ptr, vec);
96 return neon::load1_lane_quad<10>(ptr, vec);
98 return neon::load1_lane_quad<11>(ptr, vec);
100 return neon::load1_lane_quad<12>(ptr, vec);
102 return neon::load1_lane_quad<13>(ptr, vec);
104 return neon::load1_lane_quad<14>(ptr, vec);
106 return neon::load1_lane_quad<15>(ptr, vec);
114 if constexpr (lanes == 2) {
117 return neon::load1_lane<0>(ptr, vec);
119 return neon::load1_lane<1>(ptr, vec);
123 }
else if constexpr (lanes == 4) {
126 return neon::load1_lane<0>(ptr, vec);
128 return neon::load1_lane<1>(ptr, vec);
130 return neon::load1_lane<2>(ptr, vec);
132 return neon::load1_lane<3>(ptr, vec);
136 }
else if constexpr (lanes == 8) {
139 return neon::load1_lane<0>(ptr, vec);
141 return neon::load1_lane<1>(ptr, vec);
143 return neon::load1_lane<2>(ptr, vec);
145 return neon::load1_lane<3>(ptr, vec);
147 return neon::load1_lane<4>(ptr, vec);
149 return neon::load1_lane<5>(ptr, vec);
151 return neon::load1_lane<6>(ptr, vec);
153 return neon::load1_lane<7>(ptr, vec);
Concept to check if a type is a quad-word SIMD vector type.
Definition concepts.hpp:57