macro_rules! impl_avx2_bf16 {
() => {
#[inline(always)]
unsafe fn dot_product_bf16(_a: &[u16], _b: &[u16]) -> f32 {
unreachable!("AVX2 IS_BF16=false; BF16 paths are never reached at runtime")
}
#[inline(always)]
unsafe fn dot_product_bf16_4x(
_w0: &[u16],
_w1: &[u16],
_w2: &[u16],
_w3: &[u16],
_in_frame: &[u16],
) -> [f32; 4] {
unreachable!("AVX2 IS_BF16=false; BF16 paths are never reached at runtime")
}
#[inline(always)]
unsafe fn f32_to_bf16(_src: &[f32], _dest: &mut [u16]) {
unreachable!("AVX2 IS_BF16=false; BF16 paths are never reached at runtime")
}
#[inline(always)]
unsafe fn store_bf16(ptr: *mut u16, v: Self::V) {
unsafe {
let v_i = _mm256_castps_si256(v);
let v_shifted = _mm256_srli_epi32(v_i, 16);
let packed = _mm256_packus_epi32(v_shifted, v_shifted);
let permuted = _mm256_permute4x64_epi64(packed, 8);
let v_low = _mm256_castsi256_si128(permuted);
_mm_storeu_si128(ptr as *mut __m128i, v_low);
}
}
};
}
pub(crate) use impl_avx2_bf16;