Argon 0.1.0
Loading...
Searching...
No Matches
load.hpp
1#pragma once
2#include <utility>
3#include "argon/utility.hpp"
4#include "arm_simd.hpp"
5#include "concepts.hpp"
6#include "scalar.hpp"
7#include "vec128.hpp"
8
9#ifdef __ARM_FEATURE_MVE
10#define simd mve
11#else
12#define simd neon
13#endif
14
15#ifdef ARGON_PLATFORM_SIMDE
16#define nce
17#elifdef __clang__
18#define nce [[gnu::always_inline]] constexpr
19#else
20#define nce [[gnu::always_inline]] inline
21#endif
22
23namespace simd {
24#ifndef ARGON_PLATFORM_MVE
25template <typename T>
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>);
28 constexpr bool is_quadword = is_quadword_v<T>;
29 if constexpr (is_quadword) {
30 if constexpr (lanes == 2) {
31 switch (i) {
32 case 0:
33 return neon::load1_lane_quad<0>(ptr, vec);
34 case 1:
35 return neon::load1_lane_quad<1>(ptr, vec);
36 default:
37 std::unreachable();
38 }
39 } else if constexpr (lanes == 4) {
40 switch (i) {
41 case 0:
42 return neon::load1_lane_quad<0>(ptr, vec);
43 case 1:
44 return neon::load1_lane_quad<1>(ptr, vec);
45 case 2:
46 return neon::load1_lane_quad<2>(ptr, vec);
47 case 3:
48 return neon::load1_lane_quad<3>(ptr, vec);
49 default:
50 std::unreachable();
51 }
52 } else if constexpr (lanes == 8) {
53 switch (i) {
54 case 0:
55 return neon::load1_lane_quad<0>(ptr, vec);
56 case 1:
57 return neon::load1_lane_quad<1>(ptr, vec);
58 case 2:
59 return neon::load1_lane_quad<2>(ptr, vec);
60 case 3:
61 return neon::load1_lane_quad<3>(ptr, vec);
62 case 4:
63 return neon::load1_lane_quad<4>(ptr, vec);
64 case 5:
65 return neon::load1_lane_quad<5>(ptr, vec);
66 case 6:
67 return neon::load1_lane_quad<6>(ptr, vec);
68 case 7:
69 return neon::load1_lane_quad<7>(ptr, vec);
70 default:
71 std::unreachable();
72 }
73 } else if constexpr (lanes == 16) {
74 switch (i) {
75 case 0:
76 return neon::load1_lane_quad<0>(ptr, vec);
77 case 1:
78 return neon::load1_lane_quad<1>(ptr, vec);
79 case 2:
80 return neon::load1_lane_quad<2>(ptr, vec);
81 case 3:
82 return neon::load1_lane_quad<3>(ptr, vec);
83 case 4:
84 return neon::load1_lane_quad<4>(ptr, vec);
85 case 5:
86 return neon::load1_lane_quad<5>(ptr, vec);
87 case 6:
88 return neon::load1_lane_quad<6>(ptr, vec);
89 case 7:
90 return neon::load1_lane_quad<7>(ptr, vec);
91 case 8:
92 return neon::load1_lane_quad<8>(ptr, vec);
93 case 9:
94 return neon::load1_lane_quad<9>(ptr, vec);
95 case 10:
96 return neon::load1_lane_quad<10>(ptr, vec);
97 case 11:
98 return neon::load1_lane_quad<11>(ptr, vec);
99 case 12:
100 return neon::load1_lane_quad<12>(ptr, vec);
101 case 13:
102 return neon::load1_lane_quad<13>(ptr, vec);
103 case 14:
104 return neon::load1_lane_quad<14>(ptr, vec);
105 case 15:
106 return neon::load1_lane_quad<15>(ptr, vec);
107 default:
108 std::unreachable();
109 }
110 } else {
111 std::unreachable();
112 }
113 } else {
114 if constexpr (lanes == 2) {
115 switch (i) {
116 case 0:
117 return neon::load1_lane<0>(ptr, vec);
118 case 1:
119 return neon::load1_lane<1>(ptr, vec);
120 default:
121 std::unreachable();
122 }
123 } else if constexpr (lanes == 4) {
124 switch (i) {
125 case 0:
126 return neon::load1_lane<0>(ptr, vec);
127 case 1:
128 return neon::load1_lane<1>(ptr, vec);
129 case 2:
130 return neon::load1_lane<2>(ptr, vec);
131 case 3:
132 return neon::load1_lane<3>(ptr, vec);
133 default:
134 std::unreachable();
135 }
136 } else if constexpr (lanes == 8) {
137 switch (i) {
138 case 0:
139 return neon::load1_lane<0>(ptr, vec);
140 case 1:
141 return neon::load1_lane<1>(ptr, vec);
142 case 2:
143 return neon::load1_lane<2>(ptr, vec);
144 case 3:
145 return neon::load1_lane<3>(ptr, vec);
146 case 4:
147 return neon::load1_lane<4>(ptr, vec);
148 case 5:
149 return neon::load1_lane<5>(ptr, vec);
150 case 6:
151 return neon::load1_lane<6>(ptr, vec);
152 case 7:
153 return neon::load1_lane<7>(ptr, vec);
154 default:
155 std::unreachable();
156 }
157 } else {
158 std::unreachable();
159 }
160 }
161}
162#endif
163
164} // namespace simd
165#undef neon
166#undef nce
Concept to check if a type is a quad-word SIMD vector type.
Definition concepts.hpp:57