Argon 0.1.0
Loading...
Searching...
No Matches
store.hpp
1#pragma once
2#ifdef __ARM_FEATURE_MVE
3#include "argon/utility.hpp"
4#include "multivector.hpp"
5#include "scalar.hpp"
6
7namespace mve {
8template <typename T>
9void store1_x2(Scalar_t<T>* ptr, MultiVector_t<T, 2> value) {
10 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
11 argon::utility::constexpr_for<0, 2, 1>([&](auto i) { //<
12 *ptr = value[i];
13 ptr += lanes;
14 });
15}
16template <typename T>
17void store1_x3(Scalar_t<T>* ptr, MultiVector_t<T, 3> value) {
18 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
19 argon::utility::constexpr_for<0, 3, 1>([&](auto i) { //<
20 *ptr = value[i];
21 ptr += lanes;
22 });
23}
24template <typename T>
25void store1_x4(Scalar_t<T>* ptr, MultiVector_t<T, 4> value) {
26 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
27 argon::utility::constexpr_for<0, 4, 1>([&](auto i) { //<
28 *ptr = value[i];
29 ptr += lanes;
30 });
31}
32
33template <size_t LaneIndex, typename T>
34void store2_lane(Scalar_t<T>* ptr, MultiVector_t<T, 2> value) {
35 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
36 argon::utility::constexpr_for<0, 2, 1>([&](auto i) { //<
37 *ptr = value[i][LaneIndex];
38 ptr += lanes;
39 });
40}
41
42template <size_t LaneIndex, typename T>
43void store3_lane(Scalar_t<T>* ptr, MultiVector_t<T, 3> value) {
44 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
45 argon::utility::constexpr_for<0, 3, 1>([&](auto i) { //<
46 *ptr = value[i][LaneIndex];
47 ptr += lanes;
48 });
49}
50
51template <size_t LaneIndex, typename T>
52void store4_lane(Scalar_t<T>* ptr, MultiVector_t<T, 4> value) {
53 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
54 argon::utility::constexpr_for<0, 4, 1>([&](auto i) { //<
55 *ptr = value[i][LaneIndex];
56 ptr += lanes;
57 });
58}
59} // namespace mve
60#endif