Diffstat (limited to 'src/fast.rs')
-rw-r--r--src/fast.rs88
1 files changed, 0 insertions, 88 deletions
diff --git a/src/fast.rs b/src/fast.rs
deleted file mode 100644
index e375172..0000000
--- a/src/fast.rs
+++ /dev/null
@@ -1,88 +0,0 @@
-//! Provides the fast math trait and macro. See terms and conditions[^1].
-//!
-//! [^1]: <https://simonbyrne.github.io/notes/fastmath>
-#[allow(unused_imports)]
-use std::f32::{INFINITY as INF, NAN};
-
-macro_rules! s {
- ($($x:tt)+) => {
- #[doc = include_str!("fast.safety.md")]
- $($x)+;
- };
-}
-
-#[rustfmt::skip]
-/// Trait for fast math floats. Try to use [`fast::math`](crate::fast::math).
-/// These functions all assume that your float is NOT [`INF`] | [`NAN`].
-/// If so undefined behaviour is incurred.
-pub unsafe trait Float: Copy {
- s!(unsafe fn add(self, other: Self) -> Self);
- s!(unsafe fn sub(self, other: Self) -> Self);
- s!(unsafe fn mul(self, other: Self) -> Self);
- s!(unsafe fn div(self, other: Self) -> Self);
- s!(unsafe fn rem(self, other: Self) -> Self);
-
- s!(unsafe fn eq(self, other: Self) -> bool);
- s!(unsafe fn lt(self, other: Self) -> bool);
- s!(unsafe fn le(self, other: Self) -> bool);
- s!(unsafe fn ne(self, other: Self) -> bool);
- s!(unsafe fn ge(self, other: Self) -> bool);
- s!(unsafe fn gt(self, other: Self) -> bool);
-
- fn deref(&self) -> Self {
- *self
- }
- fn neg(self) -> Self;
-
- #[doc(hidden)]
- unsafe fn finite(self, other: Self) -> Self;
-}
-
-use std::intrinsics::*;
-macro_rules! imp {
- ($this:ty) => {
-#[rustfmt::skip]
-unsafe impl Float for $this {
- #[inline(always)]
- unsafe fn finite(self, other: Self) -> Self {
- core::hint::assert_unchecked(self.is_finite());
- core::hint::assert_unchecked(other.is_finite());
- self
- }
- unsafe fn add(self, other: Self) -> Self { fadd_fast(self.finite(other), other) }
- unsafe fn sub(self, other: Self) -> Self { fsub_fast(self.finite(other), other) }
- unsafe fn mul(self, other: Self) -> Self { fmul_fast(self.finite(other), other) }
- unsafe fn div(self, other: Self) -> Self { fdiv_fast(self.finite(other), other) }
- unsafe fn rem(self, other: Self) -> Self { frem_fast(self.finite(other), other) }
-
- unsafe fn eq(self, other: Self) -> bool { (self.finite(other) + 0.0).to_bits() == (other + 0.0).to_bits() }
- unsafe fn lt(self, other: Self) -> bool { self.finite(other) < other }
- unsafe fn le(self, other: Self) -> bool { self.finite(other) <= other }
- unsafe fn ne(self, other: Self) -> bool { self.finite(other) != other }
- unsafe fn ge(self, other: Self) -> bool { self.finite(other) >= other }
- unsafe fn gt(self, other: Self) -> bool { self.finite(other) > other }
-
- fn deref(&self) -> Self { *self }
- fn neg(self) -> Self { -self }
-}
- };
-}
-imp!(f32);
-imp!(f64);
-
-/// Changes all the math to fast float math. See [`fadd_fast`].
-///
-/// This allows automatic vectorization of float math for the compiler, among other things.
-/// If you intend to create a function in this, first import [`lower::fast::Float`](crate::fast::Float), use [`lower::math`](crate::math).
-///
-/// This would lower `a * b + c` to `fadd(fmul(a, b), c)`.
-#[macro_export]
-#[doc(hidden)]
-macro_rules! fast {
- ($($x:tt)+) => {{
- use $crate::fast::Float as _;
- lower_macros::math! { $($x)+ }
- }}
-}
-#[doc(inline)]
-pub use fast as math;