summaryrefslogtreecommitdiffstats
path: root/library/std/src/sys/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/sys/mod.rs')
-rw-r--r--library/std/src/sys/mod.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/library/std/src/sys/mod.rs b/library/std/src/sys/mod.rs
index c72be1380..beea3f23c 100644
--- a/library/std/src/sys/mod.rs
+++ b/library/std/src/sys/mod.rs
@@ -23,6 +23,7 @@
#![allow(missing_debug_implementations)]
pub mod common;
+mod personality;
cfg_if::cfg_if! {
if #[cfg(unix)] {
@@ -60,3 +61,52 @@ cfg_if::cfg_if! {
pub const FULL_BACKTRACE_DEFAULT: bool = false;
}
}
+
+#[cfg(not(test))]
+cfg_if::cfg_if! {
+ if #[cfg(target_os = "android")] {
+ pub use self::android::log2f32;
+ pub use self::android::log2f64;
+ } else {
+ #[inline]
+ pub fn log2f32(n: f32) -> f32 {
+ unsafe { crate::intrinsics::log2f32(n) }
+ }
+
+ #[inline]
+ pub fn log2f64(n: f64) -> f64 {
+ unsafe { crate::intrinsics::log2f64(n) }
+ }
+ }
+}
+
+// Solaris/Illumos requires a wrapper around log, log2, and log10 functions
+// because of their non-standard behavior (e.g., log(-n) returns -Inf instead
+// of expected NaN).
+#[cfg(not(test))]
+#[cfg(any(target_os = "solaris", target_os = "illumos"))]
+#[inline]
+pub fn log_wrapper<F: Fn(f64) -> f64>(n: f64, log_fn: F) -> f64 {
+ if n.is_finite() {
+ if n > 0.0 {
+ log_fn(n)
+ } else if n == 0.0 {
+ f64::NEG_INFINITY // log(0) = -Inf
+ } else {
+ f64::NAN // log(-n) = NaN
+ }
+ } else if n.is_nan() {
+ n // log(NaN) = NaN
+ } else if n > 0.0 {
+ n // log(Inf) = Inf
+ } else {
+ f64::NAN // log(-Inf) = NaN
+ }
+}
+
+#[cfg(not(test))]
+#[cfg(not(any(target_os = "solaris", target_os = "illumos")))]
+#[inline]
+pub fn log_wrapper<F: Fn(f64) -> f64>(n: f64, log_fn: F) -> f64 {
+ log_fn(n)
+}