about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCaleb Zulawski <caleb.zulawski@gmail.com>2021-04-16 21:35:11 -0400
committerGitHub <noreply@github.com>2021-04-16 21:35:11 -0400
commite73985f25d1616c48caf9f66786320f05cc0b1db (patch)
tree284f5a46ab855556548481d219770d526735c719
parent1c3d957f98a3f0dfde1c1bd82384fd1de085c130 (diff)
parent87b7207acd6bfb07f0f82b72511b22c866a74553 (diff)
downloadrust-e73985f25d1616c48caf9f66786320f05cc0b1db.tar.gz
rust-e73985f25d1616c48caf9f66786320f05cc0b1db.zip
Merge pull request #89 from rust-lang/intrinsic-neg
Use neg intrinsics
-rw-r--r--crates/core_simd/src/intrinsics.rs3
-rw-r--r--crates/core_simd/src/ops.rs22
2 files changed, 5 insertions, 20 deletions
diff --git a/crates/core_simd/src/intrinsics.rs b/crates/core_simd/src/intrinsics.rs
index fafeed6a62a..4f89d00deb2 100644
--- a/crates/core_simd/src/intrinsics.rs
+++ b/crates/core_simd/src/intrinsics.rs
@@ -40,6 +40,9 @@ extern "platform-intrinsic" {
     /// fptoui/fptosi/uitofp/sitofp
     pub(crate) fn simd_cast<T, U>(x: T) -> U;
 
+    /// neg/fneg
+    pub(crate) fn simd_neg<T>(x: T) -> T;
+
     // floor
     #[cfg(feature = "std")]
     pub(crate) fn simd_floor<T>(x: T) -> T;
diff --git a/crates/core_simd/src/ops.rs b/crates/core_simd/src/ops.rs
index 12d675a0640..513eeb423d9 100644
--- a/crates/core_simd/src/ops.rs
+++ b/crates/core_simd/src/ops.rs
@@ -185,25 +185,7 @@ macro_rules! impl_op {
             {
                 type Output = Self;
                 fn neg(self) -> Self::Output {
-                    Self::splat(0) - self
-                }
-            }
-        }
-    };
-
-    { impl Neg for $type:ident, $scalar:ty, @float } => {
-        impl_ref_ops! {
-            impl<const LANES: usize> core::ops::Neg for crate::$type<LANES>
-            where
-                crate::$type<LANES>: LanesAtMost32,
-                crate::SimdU32<LANES>: LanesAtMost32,
-                crate::SimdU64<LANES>: LanesAtMost32,
-            {
-                type Output = Self;
-                fn neg(self) -> Self::Output {
-                    // FIXME: Replace this with fneg intrinsic once available.
-                    // https://github.com/rust-lang/stdsimd/issues/32
-                    Self::from_bits(Self::splat(-0.0).to_bits() ^ self.to_bits())
+                    unsafe { crate::intrinsics::simd_neg(self) }
                 }
             }
         }
@@ -318,7 +300,7 @@ macro_rules! impl_float_ops {
                 impl_op! { impl Mul for $vector, $scalar }
                 impl_op! { impl Div for $vector, $scalar }
                 impl_op! { impl Rem for $vector, $scalar }
-                impl_op! { impl Neg for $vector, $scalar, @float }
+                impl_op! { impl Neg for $vector, $scalar }
                 impl_op! { impl Index for $vector, $scalar }
             )*
         )*