Argon 0.1.0
Loading...
Searching...
No Matches
set_lane.hpp
1#pragma once
2#include <utility>
3#include "arm_simd.hpp"
4#include "scalar.hpp"
5
6#ifdef __ARM_NEON
7#include <arm_neon.h>
8#define simd neon
9#elifdef __ARM_FEATURE_MVE
10#include <arm_mve.h>
11#define simd mve
12#else
13#define SIMDE_ENABLE_NATIVE_ALIASES
14#include <arm/neon.h>
15#define simd neon
16#endif
17
18#ifdef ARGON_PLATFORM_SIMDE
19#define nce
20#elifdef __clang__
21#define nce [[gnu::always_inline]] constexpr
22#else
23#define nce [[gnu::always_inline]] inline
24#endif
25
26namespace simd {
27
34template <typename T>
35nce T set_lane(T vec, const int i, Scalar_t<T> a) {
36 constexpr size_t lanes = sizeof(T) / sizeof(Scalar_t<T>);
37 if constexpr (lanes == 1) {
38 return simd::set_lane<0>(a, vec);
39 } else if constexpr (lanes == 2) {
40 switch (i) {
41 case 0:
42 return simd::set_lane<0>(a, vec);
43 case 1:
44 return simd::set_lane<1>(a, vec);
45 default:
46 std::unreachable();
47 }
48 } else if constexpr (lanes == 4) {
49 switch (i) {
50 case 0:
51 return simd::set_lane<0>(a, vec);
52 case 1:
53 return simd::set_lane<1>(a, vec);
54 case 2:
55 return simd::set_lane<2>(a, vec);
56 case 3:
57 return simd::set_lane<3>(a, vec);
58 default:
59 std::unreachable();
60 }
61 } else if constexpr (lanes == 8) {
62 switch (i) {
63 case 0:
64 return simd::set_lane<0>(a, vec);
65 case 1:
66 return simd::set_lane<1>(a, vec);
67 case 2:
68 return simd::set_lane<2>(a, vec);
69 case 3:
70 return simd::set_lane<3>(a, vec);
71 case 4:
72 return simd::set_lane<4>(a, vec);
73 case 5:
74 return simd::set_lane<5>(a, vec);
75 case 6:
76 return simd::set_lane<6>(a, vec);
77 case 7:
78 return simd::set_lane<7>(a, vec);
79 default:
80 std::unreachable();
81 }
82 } else if constexpr (lanes == 16) {
83 switch (i) {
84 case 0:
85 return simd::set_lane<0>(a, vec);
86 case 1:
87 return simd::set_lane<1>(a, vec);
88 case 2:
89 return simd::set_lane<2>(a, vec);
90 case 3:
91 return simd::set_lane<3>(a, vec);
92 case 4:
93 return simd::set_lane<4>(a, vec);
94 case 5:
95 return simd::set_lane<5>(a, vec);
96 case 6:
97 return simd::set_lane<6>(a, vec);
98 case 7:
99 return simd::set_lane<7>(a, vec);
100 case 8:
101 return simd::set_lane<8>(a, vec);
102 case 9:
103 return simd::set_lane<9>(a, vec);
104 case 10:
105 return simd::set_lane<10>(a, vec);
106 case 11:
107 return simd::set_lane<11>(a, vec);
108 case 12:
109 return simd::set_lane<12>(a, vec);
110 case 13:
111 return simd::set_lane<13>(a, vec);
112 case 14:
113 return simd::set_lane<14>(a, vec);
114 case 15:
115 return simd::set_lane<15>(a, vec);
116 default:
117 std::unreachable();
118 }
119 } else {
120 std::unreachable();
121 }
122}
123
124} // namespace simd
125#undef simd
126#undef nce