//! Architecture-specific routines and operations. //! //! LLVM will already optimize calls to some of these in cases that there are hardware //! instructions. Providing an implementation here just ensures that the faster implementation //! is used when calling the function directly. This helps anyone who uses `libm` directly, as //! well as improving things when these routines are called as part of other implementations. // Most implementations should be defined here, to ensure they are not made available when // soft floats are required. #[cfg(arch_enabled)] cfg_if! { if #[cfg(all(target_arch = "wasm32", intrinsics_enabled))] { mod wasm32; pub use wasm32::{ ceil, ceilf, fabs, fabsf, floor, floorf, rint, rintf, sqrt, sqrtf, trunc, truncf, }; } else if #[cfg(target_feature = "sse2")] { mod x86; pub use x86::{sqrt, sqrtf, fma, fmaf}; } else if #[cfg(all( any(target_arch = "aarch64", target_arch = "arm64ec"), target_feature = "neon" ))] { mod aarch64; pub use aarch64::{ fma, fmaf, rint, rintf, sqrt, sqrtf, }; #[cfg(all(f16_enabled, target_feature = "fp16"))] pub use aarch64::{ rintf16, sqrtf16, }; } } // There are certain architecture-specific implementations that are needed for correctness // even with `force-soft-float`. These are configured here. cfg_if! { if #[cfg(all(target_arch = "x86", not(target_feature = "sse2")))] { mod i586; pub use i586::{ceil, floor}; } }