diff options
| author | Caleb Zulawski <caleb.zulawski@gmail.com> | 2022-07-29 11:57:05 -0400 |
|---|---|---|
| committer | Caleb Zulawski <caleb.zulawski@gmail.com> | 2022-07-29 11:57:05 -0400 |
| commit | 3183afb6b5fcbf688bb90cf1db3f635406f868dc (patch) | |
| tree | bf88475cae84c564a3c7bf7456c3a37ce420574d | |
| parent | b5f9d43ff1139fb5dbd1a919dbf63e48c2c56012 (diff) | |
| download | rust-3183afb6b5fcbf688bb90cf1db3f635406f868dc.tar.gz rust-3183afb6b5fcbf688bb90cf1db3f635406f868dc.zip | |
Fix interleave/deinterleave for vectors with only one lane
| -rw-r--r-- | crates/core_simd/src/swizzle.rs | 12 | ||||
| -rw-r--r-- | crates/core_simd/tests/swizzle.rs | 14 |
2 files changed, 24 insertions, 2 deletions
diff --git a/crates/core_simd/src/swizzle.rs b/crates/core_simd/src/swizzle.rs index 22999d24950..02567252a63 100644 --- a/crates/core_simd/src/swizzle.rs +++ b/crates/core_simd/src/swizzle.rs @@ -325,7 +325,11 @@ where const INDEX: [Which; LANES] = hi::<LANES>(); } - (Lo::swizzle2(self, other), Hi::swizzle2(self, other)) + if LANES == 1 { + (self, other) + } else { + (Lo::swizzle2(self, other), Hi::swizzle2(self, other)) + } } /// Deinterleave two vectors. @@ -380,6 +384,10 @@ where const INDEX: [Which; LANES] = odd::<LANES>(); } - (Even::swizzle2(self, other), Odd::swizzle2(self, other)) + if LANES == 1 { + (self, other) + } else { + (Even::swizzle2(self, other), Odd::swizzle2(self, other)) + } } } diff --git a/crates/core_simd/tests/swizzle.rs b/crates/core_simd/tests/swizzle.rs index 51c63611aba..33a7becb421 100644 --- a/crates/core_simd/tests/swizzle.rs +++ b/crates/core_simd/tests/swizzle.rs @@ -60,3 +60,17 @@ fn interleave() { assert_eq!(even, a); assert_eq!(odd, b); } + +// portable-simd#298 +#[test] +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] +fn interleave_one() { + let a = Simd::from_array([0]); + let b = Simd::from_array([1]); + let (lo, hi) = a.interleave(b); + assert_eq!(lo.to_array(), [0]); + assert_eq!(hi.to_array(), [1]); + let (even, odd) = lo.deinterleave(hi); + assert_eq!(even, a); + assert_eq!(odd, b); +} |
