about summary refs log tree commit diff
path: root/library/compiler-builtins/libm/src/math/ilogbf.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/compiler-builtins/libm/src/math/ilogbf.rs')
-rw-r--r--library/compiler-builtins/libm/src/math/ilogbf.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/library/compiler-builtins/libm/src/math/ilogbf.rs b/library/compiler-builtins/libm/src/math/ilogbf.rs
new file mode 100644
index 00000000000..3585d6d36f1
--- /dev/null
+++ b/library/compiler-builtins/libm/src/math/ilogbf.rs
@@ -0,0 +1,28 @@
+const FP_ILOGBNAN: i32 = -1 - 0x7fffffff;
+const FP_ILOGB0: i32 = FP_ILOGBNAN;
+
+#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
+pub fn ilogbf(x: f32) -> i32 {
+    let mut i = x.to_bits();
+    let e = ((i >> 23) & 0xff) as i32;
+
+    if e == 0 {
+        i <<= 9;
+        if i == 0 {
+            force_eval!(0.0 / 0.0);
+            return FP_ILOGB0;
+        }
+        /* subnormal x */
+        let mut e = -0x7f;
+        while (i >> 31) == 0 {
+            e -= 1;
+            i <<= 1;
+        }
+        e
+    } else if e == 0xff {
+        force_eval!(0.0 / 0.0);
+        if (i << 9) != 0 { FP_ILOGBNAN } else { i32::MAX }
+    } else {
+        e - 0x7f
+    }
+}