Argon 0.1.0
Loading...
Searching...
No Matches
split.hpp
1#pragma once
2#include <span>
3#include <tuple>
4#include "arm_simd/helpers/vec128.hpp"
5
6#ifdef __ARM_FEATURE_MVE
7#define simd mve
8#else
9#define simd neon
10#endif
11
12namespace argon {
13
17template <typename scalar_type>
18std::pair<std::span<scalar_type>, std::span<scalar_type>> split_head_aligned(std::span<scalar_type> span) {
19 constexpr size_t lanes = sizeof(simd::Vec128_t<scalar_type>) / sizeof(scalar_type);
20 return {span.first(span.size() & ~(lanes - 1)), span.last(span.size() & (lanes - 1))};
21}
22
26template <typename scalar_type>
27std::pair<std::span<scalar_type>, std::span<scalar_type>> split_tail_aligned(std::span<scalar_type> span) {
28 constexpr size_t lanes = sizeof(simd::Vec128_t<scalar_type>) / sizeof(scalar_type);
29 return {span.first(span.size() & (lanes - 1)), span.last(span.size() & ~(lanes - 1))};
30}
31} // namespace argon
32#undef simd