Skip to content

Commit

Permalink
Add copy_to_slice
Browse files Browse the repository at this point in the history
  • Loading branch information
calebzulawski committed Feb 19, 2023
1 parent 9bd30e7 commit 0fd7c8e
Showing 1 changed file with 30 additions and 1 deletion.
31 changes: 30 additions & 1 deletion crates/core_simd/src/vector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ where
///
/// Panics if the slice's length is less than the vector's `Simd::LANES`.
///
/// # Examples
/// # Example
///
/// ```
/// # #![feature(portable_simd)]
Expand All @@ -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
Expand Down

0 comments on commit 0fd7c8e

Please sign in to comment.