Skip to content

Commit 7028a58

Browse files
committed
Attempt to clarify interleave/deinterleave
1 parent 1999c54 commit 7028a58

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

crates/core_simd/src/permute.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,24 @@ macro_rules! impl_shuffle_lane {
3131

3232
/// Interleave two vectors.
3333
///
34-
/// The even lanes of the first result contain the lower half of `self`, and the odd
35-
/// lanes contain the lower half of `other`.
34+
/// Produces two vectors with lanes taken alternately from `self` and `other`.
3635
///
37-
/// The even lanes of the second result contain the upper half of `self`, and the odd
38-
/// lanes contain the upper half of `other`.
36+
/// The first result contains the first `LANES / 2` lanes from `self` and `other`,
37+
/// alternating, starting with the first lane of `self`.
38+
///
39+
/// The second result contains the last `LANES / 2` lanes from `self` and `other`,
40+
/// alternating, starting with the lane `LANES / 2` from the start of `self`.
41+
///
42+
/// This particular permutation is efficient on many architectures.
43+
///
44+
/// ```
45+
/// # use core_simd::SimdU32;
46+
/// let a = SimdU32::from_array([0, 1, 2, 3]);
47+
/// let b = SimdU32::from_array([4, 5, 6, 7]);
48+
/// let (x, y) = a.interleave(b);
49+
/// assert_eq!(x.to_array(), [0, 4, 1, 5]);
50+
/// assert_eq!(y.to_array(), [2, 6, 3, 7]);
51+
/// ```
3952
#[inline]
4053
pub fn interleave(self, other: Self) -> (Self, Self) {
4154
const fn lo() -> [u32; $n] {
@@ -71,9 +84,22 @@ macro_rules! impl_shuffle_lane {
7184

7285
/// Deinterleave two vectors.
7386
///
74-
/// The first result contains the even lanes of `self` and then `other`, concatenated.
87+
/// The first result takes every other lane of `self` and then `other`, starting with
88+
/// the first lane.
89+
///
90+
/// The second result takes every other lane of `self` and then `other`, starting with
91+
/// the second lane.
92+
///
93+
/// This particular permutation is efficient on many architectures.
7594
///
76-
/// The second result contains the odd lanes of `self` and then `other`, concatenated.
95+
/// ```
96+
/// # use core_simd::SimdU32;
97+
/// let a = SimdU32::from_array([0, 4, 1, 5]);
98+
/// let b = SimdU32::from_array([2, 6, 3, 7]);
99+
/// let (x, y) = a.deinterleave(b);
100+
/// assert_eq!(x.to_array(), [0, 1, 2, 3]);
101+
/// assert_eq!(y.to_array(), [4, 5, 6, 7]);
102+
/// ```
77103
#[inline]
78104
pub fn deinterleave(self, other: Self) -> (Self, Self) {
79105
const fn even() -> [u32; $n] {

0 commit comments

Comments
 (0)