macro_rules! impl_avx512_bf16 {
() => {
#[inline(always)]
unsafe fn f32_to_bf16(src: &[f32], dest: &mut [u16]) {
unsafe { crate::math::common::ops::f32_to_bf16_avx512(src, dest) }
}
#[inline(always)]
unsafe fn store_bf16(ptr: *mut u16, v: Self::V) {
unsafe {
let v_i = _mm512_castps_si512(v);
let v_shifted = _mm512_srli_epi32(v_i, 16);
let packed = _mm512_cvtepi32_epi16(v_shifted);
_mm256_storeu_si256(ptr as *mut __m256i, packed);
}
}
};
}
macro_rules! impl_avx512vnni_bf16_bf16 {
() => {
#[inline(always)]
unsafe fn f32_to_bf16(src: &[f32], dest: &mut [u16]) {
Avx512Math::f32_to_bf16(src, dest)
}
#[inline(always)]
unsafe fn store_bf16(ptr: *mut u16, v: Self::V) {
Avx512Math::store_bf16(ptr, v)
}
};
}
pub(super) use impl_avx512_bf16;
pub(super) use impl_avx512vnni_bf16_bf16;