#pragma once #include #include #include // using ARRAY_TYPE = uint16_t; // using ARRAY_TYPE = uint32_t; using ARRAY_TYPE = uint64_t; // using ARRAY_TYPE = uint64_t; template void memcpy_1by1(ARRAY_TYPE *dst, const ARRAY_TYPE *src) { for (std::size_t i{0}; i < S; ++i) { dst[i] = src[i]; } } template 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)); // } }