rlnc 0.8.7

Random Linear Network Coding
Documentation
mod avx2;
mod avx512;
mod gfni;
mod ssse3;

pub(super) fn gf256_inplace_mul_vec_by_scalar(vec: &mut [u8], scalar: u8) -> bool {
    if is_x86_feature_detected!("gfni") && is_x86_feature_detected!("avx512f") {
        unsafe { gfni::m512i::mul_vec_by_scalar(vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("gfni") && is_x86_feature_detected!("avx512vl") {
        unsafe { gfni::m256i::mul_vec_by_scalar(vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("gfni") && is_x86_feature_detected!("avx512vl") {
        unsafe { gfni::m128i::mul_vec_by_scalar(vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("avx512bw") {
        unsafe { avx512::mul_vec_by_scalar(vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("avx2") {
        unsafe { avx2::mul_vec_by_scalar(vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("ssse3") {
        unsafe { ssse3::mul_vec_by_scalar(vec, scalar) };
        return true;
    }

    false
}

pub(super) fn gf256_inplace_add_vectors(vec_dst: &mut [u8], vec_src: &[u8]) -> bool {
    if is_x86_feature_detected!("avx512f") {
        unsafe { avx512::add_vec_into(vec_dst, vec_src) };
        return true;
    }

    if is_x86_feature_detected!("avx2") {
        unsafe { avx2::add_vec_into(vec_dst, vec_src) };
        return true;
    }

    if is_x86_feature_detected!("ssse3") {
        unsafe { ssse3::add_vec_into(vec_dst, vec_src) };
        return true;
    }

    false
}

pub(super) fn gf256_mul_vec_by_scalar_then_add_into_vec(add_into_vec: &mut [u8], mul_vec: &[u8], scalar: u8) -> bool {
    if is_x86_feature_detected!("gfni") && is_x86_feature_detected!("avx512f") {
        unsafe { gfni::m512i::mul_vec_by_scalar_then_add_into(add_into_vec, mul_vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("gfni") && is_x86_feature_detected!("avx512vl") {
        unsafe { gfni::m256i::mul_vec_by_scalar_then_add_into(add_into_vec, mul_vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("gfni") && is_x86_feature_detected!("avx512vl") {
        unsafe { gfni::m128i::mul_vec_by_scalar_then_add_into(add_into_vec, mul_vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("avx512bw") {
        unsafe { avx512::mul_vec_by_scalar_then_add_into(add_into_vec, mul_vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("avx2") {
        unsafe { avx2::mul_vec_by_scalar_then_add_into(add_into_vec, mul_vec, scalar) };
        return true;
    }

    if is_x86_feature_detected!("ssse3") {
        unsafe { ssse3::mul_vec_by_scalar_then_add_into(add_into_vec, mul_vec, scalar) };
        return true;
    }

    false
}