diff options
Diffstat (limited to 'vendor/libm/src/math/truncf.rs')
-rw-r--r-- | vendor/libm/src/math/truncf.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/vendor/libm/src/math/truncf.rs b/vendor/libm/src/math/truncf.rs new file mode 100644 index 000000000..f93383269 --- /dev/null +++ b/vendor/libm/src/math/truncf.rs @@ -0,0 +1,41 @@ +use core::f32; + +#[inline] +#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)] +pub fn truncf(x: f32) -> f32 { + // On wasm32 we know that LLVM's intrinsic will compile to an optimized + // `f32.trunc` native instruction, so we can leverage this for both code size + // and speed. + llvm_intrinsically_optimized! { + #[cfg(target_arch = "wasm32")] { + return unsafe { ::core::intrinsics::truncf32(x) } + } + } + let x1p120 = f32::from_bits(0x7b800000); // 0x1p120f === 2 ^ 120 + + let mut i: u32 = x.to_bits(); + let mut e: i32 = (i >> 23 & 0xff) as i32 - 0x7f + 9; + let m: u32; + + if e >= 23 + 9 { + return x; + } + if e < 9 { + e = 1; + } + m = -1i32 as u32 >> e; + if (i & m) == 0 { + return x; + } + force_eval!(x + x1p120); + i &= !m; + f32::from_bits(i) +} + +#[cfg(test)] +mod tests { + #[test] + fn sanity_check() { + assert_eq!(super::truncf(1.1), 1.0); + } +} |