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
use crate::mem as basic;
use crate::RangeError;
use super::{cpuid_avx2, cpuid_sse2};
#[inline(always)]
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
pub fn _memcpy_impl(dst: &mut [u8], src: &[u8]) -> Result<(), RangeError> {
if cpuid_avx2::get() {
unsafe { _memcpy_avx2(dst, src) }
} else if cpuid_sse2::get() {
unsafe { _memcpy_sse2(dst, src) }
} else {
_memcpy_basic(dst, src)
}
}
fn _memcpy_basic(dst: &mut [u8], src: &[u8]) -> Result<(), RangeError> {
basic::_memcpy_impl(dst, src)
}
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
#[target_feature(enable = "sse2")]
#[allow(clippy::missing_safety_doc)]
pub unsafe fn _memcpy_sse2(dst: &mut [u8], src: &[u8]) -> Result<(), RangeError> {
basic::_memcpy_impl(dst, src)
}
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
#[target_feature(enable = "avx2")]
#[allow(clippy::missing_safety_doc)]
pub unsafe fn _memcpy_avx2(dst: &mut [u8], src: &[u8]) -> Result<(), RangeError> {
basic::_memcpy_impl(dst, src)
}