libm/math/arch/mod.rs
1//! Architecture-specific routines and operations.
2//!
3//! LLVM will already optimize calls to some of these in cases that there are hardware
4//! instructions. Providing an implementation here just ensures that the faster implementation
5//! is used when calling the function directly. This helps anyone who uses `libm` directly, as
6//! well as improving things when these routines are called as part of other implementations.
7
8// Most implementations should be defined here, to ensure they are not made available when
9// soft floats are required.
10#[cfg(arch_enabled)]
11cfg_if! {
12 if #[cfg(all(target_arch = "wasm32", intrinsics_enabled))] {
13 mod wasm32;
14 pub use wasm32::{
15 ceil, ceilf, fabs, fabsf, floor, floorf, rint, rintf, sqrt, sqrtf, trunc, truncf,
16 };
17 } else if #[cfg(target_feature = "sse2")] {
18 mod x86;
19 pub use x86::{sqrt, sqrtf, fma, fmaf};
20 } else if #[cfg(all(
21 any(target_arch = "aarch64", target_arch = "arm64ec"),
22 target_feature = "neon"
23 ))] {
24 mod aarch64;
25
26 pub use aarch64::{
27 fma,
28 fmaf,
29 rint,
30 rintf,
31 sqrt,
32 sqrtf,
33 };
34
35 #[cfg(all(f16_enabled, target_feature = "fp16"))]
36 pub use aarch64::{
37 rintf16,
38 sqrtf16,
39 };
40 }
41}
42
43// There are certain architecture-specific implementations that are needed for correctness
44// even with `force-soft-float`. These are configured here.
45cfg_if! {
46 if #[cfg(all(target_arch = "x86", not(target_feature = "sse2")))] {
47 mod i586;
48 pub use i586::{ceil, floor};
49 }
50}