summaryrefslogtreecommitdiff
path: root/src/mem_utils.h
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));
    // }
}