#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
pub mod avx512bf16;
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
pub mod avx512fp16;
#[cfg(target_arch = "aarch64")]
pub mod sve1;
#[cfg(target_arch = "aarch64")]
pub mod sve2;
#[cfg(target_arch = "aarch64")]
pub mod sme1;
#[cfg(target_arch = "aarch64")]
pub mod sme2;
#[cfg(target_arch = "riscv64")]
pub mod rvv;
#[cfg(all(target_arch = "x86_64", feature = "std"))]
pub mod amx;
#[cfg(all(target_arch = "aarch64", target_vendor = "apple"))]
pub(crate) fn apple_sysctl_flag(name: &core::ffi::CStr) -> bool {
use core::ffi::{c_char, c_int, c_void};
unsafe extern "C" {
fn sysctlbyname(
name: *const c_char,
oldp: *mut c_void,
oldlenp: *mut usize,
newp: *mut c_void,
newlen: usize,
) -> c_int;
}
let mut val: i32 = 0;
let mut len = core::mem::size_of::<i32>();
let rc = unsafe {
sysctlbyname(name.as_ptr(), (&mut val as *mut i32).cast(), &mut len, core::ptr::null_mut(), 0)
};
rc == 0 && val != 0
}
#[cfg(target_arch = "aarch64")]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum ArmPath {
Neon,
Sme { svl_bytes: usize, v2: bool },
Sve { vl_bytes: usize, v2: bool },
}
#[cfg(target_arch = "aarch64")]
#[inline]
#[allow(unreachable_code)]
pub fn select() -> ArmPath {
#[cfg(target_vendor = "apple")]
{
return ArmPath::Neon;
}
#[cfg(any(hp_no_sve, hp_neon_over_sve))]
{
return ArmPath::Neon;
}
#[cfg(all(not(target_vendor = "apple"), not(hp_no_sve), not(hp_neon_over_sve), feature = "std"))]
{
#[cfg(not(hp_no_sme))]
if sme1::is_supported() {
return ArmPath::Sme {
svl_bytes: sme1::streaming_vl_bytes(),
v2: sme2::is_supported(),
};
}
if std::arch::is_aarch64_feature_detected!("sve") {
return ArmPath::Sve {
vl_bytes: sve2::vl_bytes(),
v2: std::arch::is_aarch64_feature_detected!("sve2"),
};
}
}
ArmPath::Neon
}