blob: cb5f17953fa91f1f001a35bf0ee5b3386d71a1f6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#pragma once
#include <cstddef>
#include <iostream>
#include <arm_neon.h>
// using ARRAY_TYPE = uint16_t;
// using ARRAY_TYPE = uint32_t;
using ARRAY_TYPE = uint64_t;
// using ARRAY_TYPE = uint64_t;
template<std::size_t S>
void memcpy_1by1(ARRAY_TYPE *dst, const ARRAY_TYPE *src)
{
for (std::size_t i{0}; i < S; ++i) {
dst[i] = src[i];
}
}
template<std::size_t S>
inline void memcpy_neon(ARRAY_TYPE *dst, const ARRAY_TYPE *src)
{
// for (std::size_t i{0}; i < S; i += 4) {
// vst1q_u32(&dst[i], vld1q_u32(src + i));
// }
// if (uint64_t(src) % 16 != 0) {
// std::cerr << "src misaligned" << std::endl;
// }
// if (uint64_t(dst) % 16 != 0) {
// std::cerr << "dst misaligned" << std::endl;
// }
for (std::size_t i{0}; i < S; i += 2) {
vst1q_u64(&dst[i], vld1q_u64(src + i));
}
// for (std::size_t i{0}; i < S; i += 8) {
// vst1q_u16(&dst[i], vld1q_u16(src + i));
// }
// for (std::size_t i{0}; i < S; i += 4) {
// vst1q_u64(&dst[i], vld1q_u64(src + i));
// }
}
|