about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCaleb Zulawski <caleb.zulawski@gmail.com>2023-02-19 12:21:27 -0500
committerCaleb Zulawski <caleb.zulawski@gmail.com>2023-02-19 12:33:40 -0500
commit0fd7c8e138db1362e3cba9cdb40403dc7a83364b (patch)
tree9059235e344c5c95f936496442872fb199144654
parent9bd30e77b3a3c699af102ebb3df0f6110f8aa02e (diff)
downloadrust-0fd7c8e138db1362e3cba9cdb40403dc7a83364b.tar.gz
rust-0fd7c8e138db1362e3cba9cdb40403dc7a83364b.zip
Add copy_to_slice
-rw-r--r--crates/core_simd/src/vector.rs31
1 files changed, 30 insertions, 1 deletions
diff --git a/crates/core_simd/src/vector.rs b/crates/core_simd/src/vector.rs
index 51b0d999a81..870c2eefee1 100644
--- a/crates/core_simd/src/vector.rs
+++ b/crates/core_simd/src/vector.rs
@@ -159,7 +159,7 @@ where
     ///
     /// Panics if the slice's length is less than the vector's `Simd::LANES`.
     ///
-    /// # Examples
+    /// # Example
     ///
     /// ```
     /// # #![feature(portable_simd)]
@@ -180,6 +180,35 @@ where
         unsafe { slice.as_ptr().cast::<Self>().read_unaligned() }
     }
 
+    /// Writes a SIMD vector to the first `LANES` elements of a slice.
+    ///
+    /// # Panics
+    ///
+    /// Panics if the slice's length is less than the vector's `Simd::LANES`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # #![feature(portable_simd)]
+    /// # #[cfg(feature = "as_crate")] use core_simd::simd;
+    /// # #[cfg(not(feature = "as_crate"))] use core::simd;
+    /// # use simd::u32x4;
+    /// let mut dest = vec![0; 6];
+    /// let v = u32x4::from_array([1, 2, 3, 4]);
+    /// v.copy_to_slice(&mut dest);
+    /// assert_eq!(&dest, &[1, 2, 3, 4, 0, 0]);
+    /// ```
+    pub fn copy_to_slice(self, slice: &mut [T]) {
+        assert!(
+            slice.len() >= LANES,
+            "slice length must be at least the number of lanes"
+        );
+        // Safety:
+        // - We've checked the length is sufficient
+        // - `T` and `Simd<T, N>` are Copy types.
+        unsafe { slice.as_mut_ptr().cast::<Self>().write_unaligned(self) }
+    }
+
     /// Performs lanewise conversion of a SIMD vector's elements to another SIMD-valid type.
     ///
     /// This follows the semantics of Rust's `as` conversion for casting