about summary refs log tree commit diff
path: root/library/compiler-builtins/libm/src/math/ilogb.rs
diff options
context:
space:
mode:
authorTrevor Gross <tmgross@umich.edu>2025-04-19 21:09:49 +0000
committerTrevor Gross <t.gross35@gmail.com>2025-04-19 17:20:24 -0400
commit8b8bd8a0fd75e43a9b282284b849e651828ceec2 (patch)
treecc6eba464cba2cb43a51c912a97029a01572a7e0 /library/compiler-builtins/libm/src/math/ilogb.rs
parent911a70381a9e7c84400b156e3cbcd805f3e64034 (diff)
downloadrust-8b8bd8a0fd75e43a9b282284b849e651828ceec2.tar.gz
rust-8b8bd8a0fd75e43a9b282284b849e651828ceec2.zip
libm: Flatten the `libm/libm` directory
Diffstat (limited to 'library/compiler-builtins/libm/src/math/ilogb.rs')
-rw-r--r--library/compiler-builtins/libm/src/math/ilogb.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/library/compiler-builtins/libm/src/math/ilogb.rs b/library/compiler-builtins/libm/src/math/ilogb.rs
new file mode 100644
index 00000000000..ccc4914be2b
--- /dev/null
+++ b/library/compiler-builtins/libm/src/math/ilogb.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 ilogb(x: f64) -> i32 {
+    let mut i: u64 = x.to_bits();
+    let e = ((i >> 52) & 0x7ff) as i32;
+
+    if e == 0 {
+        i <<= 12;
+        if i == 0 {
+            force_eval!(0.0 / 0.0);
+            return FP_ILOGB0;
+        }
+        /* subnormal x */
+        let mut e = -0x3ff;
+        while (i >> 63) == 0 {
+            e -= 1;
+            i <<= 1;
+        }
+        e
+    } else if e == 0x7ff {
+        force_eval!(0.0 / 0.0);
+        if (i << 12) != 0 { FP_ILOGBNAN } else { i32::MAX }
+    } else {
+        e - 0x3ff
+    }
+}