#![allow(unsafe_code)]
#[cfg(all(target_arch = "x86_64", feature = "simd-avx2"))]
use core::arch::x86_64::{
__m256i,
_mm256_loadu_si256,
_mm256_storeu_si256,
_mm256_xor_si256,
};
#[cfg(all(target_arch = "x86_64", feature = "simd-avx2"))]
pub fn vect_add_avx2(output: &mut [u8], a: &[u8], b: &[u8]) {
unsafe {
let chunks = output.len() / 32;
for i in 0..chunks {
let offset = i * 32;
let vec_a = _mm256_loadu_si256(a.as_ptr().add(offset) as *const __m256i);
let vec_b = _mm256_loadu_si256(b.as_ptr().add(offset) as *const __m256i);
let result = _mm256_xor_si256(vec_a, vec_b);
_mm256_storeu_si256(output.as_mut_ptr().add(offset) as *mut __m256i, result);
}
let remaining = output.len() % 32;
if remaining > 0 {
let offset = chunks * 32;
for j in 0..remaining {
output[offset + j] = a[offset + j] ^ b[offset + j];
}
}
}
}
#[cfg(all(target_arch = "x86_64", feature = "simd-avx2"))]
pub fn shift_xor_avx2(dest: &mut [u64], source: &[u64], distance: usize) {
super::super::portable::shift_xor_portable(dest, source, distance);
}
#[cfg(not(all(target_arch = "x86_64", feature = "simd-avx2")))]
pub fn vect_add_avx2(output: &mut [u8], a: &[u8], b: &[u8]) {
super::super::portable::vect_add_portable(output, a, b);
}
#[cfg(not(all(target_arch = "x86_64", feature = "simd-avx2")))]
pub fn shift_xor_avx2(dest: &mut [u64], source: &[u64], distance: usize) {
super::super::portable::shift_xor_portable(dest, source, distance);
}