use crate::common::gf256::Gf256;
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
mod x86;
#[cfg(target_arch = "aarch64")]
mod aarch64;
pub fn gf256_inplace_mul_vec_by_scalar(vec: &mut [u8], scalar: u8) {
if vec.is_empty() {
return;
}
if scalar == 0 {
vec.fill(0);
return;
}
if scalar == 1 {
return;
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if x86::gf256_inplace_mul_vec_by_scalar(vec, scalar) {
return;
}
}
#[cfg(target_arch = "aarch64")]
{
if aarch64::gf256_inplace_mul_vec_by_scalar(vec, scalar) {
return;
}
}
vec.iter_mut().for_each(|src_symbol| {
*src_symbol = Gf256::mul_const(*src_symbol, scalar);
});
}
pub fn gf256_inplace_add_vectors(vec_dst: &mut [u8], vec_src: &[u8]) {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if x86::gf256_inplace_add_vectors(vec_dst, vec_src) {
return;
}
}
#[cfg(target_arch = "aarch64")]
{
if aarch64::gf256_inplace_add_vectors(vec_dst, vec_src) {
return;
}
}
vec_dst.iter_mut().zip(vec_src).for_each(|(a, b)| {
*a ^= b;
});
}
pub fn gf256_mul_vec_by_scalar_then_add_into_vec(add_into_vec: &mut [u8], mul_vec: &[u8], scalar: u8) {
if add_into_vec.is_empty() {
return;
}
if scalar == 0 {
return;
}
if scalar == 1 {
gf256_inplace_add_vectors(add_into_vec, mul_vec);
return;
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if x86::gf256_mul_vec_by_scalar_then_add_into_vec(add_into_vec, mul_vec, scalar) {
return;
}
}
#[cfg(target_arch = "aarch64")]
{
if aarch64::gf256_mul_vec_by_scalar_then_add_into_vec(add_into_vec, mul_vec, scalar) {
return;
}
}
add_into_vec
.iter_mut()
.zip(mul_vec.iter().map(|&src_symbol| Gf256::mul_const(src_symbol, scalar)))
.for_each(|(res, scaled)| *res ^= scaled);
}