diff options
| author | Martin Liska <martin.liska@hey.com> | 2024-11-18 19:16:13 +0100 |
|---|---|---|
| committer | Amanieu d'Antras <amanieu@gmail.com> | 2024-11-30 23:07:21 +0000 |
| commit | 1d10adfa38b15a052be41bffff3e7ef5911f1b47 (patch) | |
| tree | 4b51b90586abe3176cbf294d07892284e38cf050 /library | |
| parent | 6d24a9f72ba60f193adec30d4b6e8f1311555eb8 (diff) | |
| download | rust-1d10adfa38b15a052be41bffff3e7ef5911f1b47.tar.gz rust-1d10adfa38b15a052be41bffff3e7ef5911f1b47.zip | |
Fix implementation of `_mm256_alignr_epi8<16>`
The function is supposed to return first argument for IMM8 == 8.
Diffstat (limited to 'library')
| -rw-r--r-- | library/stdarch/crates/core_arch/src/x86/avx2.rs | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/library/stdarch/crates/core_arch/src/x86/avx2.rs b/library/stdarch/crates/core_arch/src/x86/avx2.rs index 4c529390616..28ee02cf7fb 100644 --- a/library/stdarch/crates/core_arch/src/x86/avx2.rs +++ b/library/stdarch/crates/core_arch/src/x86/avx2.rs @@ -18,6 +18,8 @@ //! [wiki_avx]: https://en.wikipedia.org/wiki/Advanced_Vector_Extensions //! [wiki_fma]: https://en.wikipedia.org/wiki/Fused_multiply-accumulate +use core::hint::unreachable_unchecked; + use crate::core_arch::{simd::*, x86::*}; use crate::intrinsics::simd::*; @@ -178,6 +180,10 @@ pub unsafe fn _mm256_alignr_epi8<const IMM8: i32>(a: __m256i, b: __m256i) -> __m let a = a.as_i8x32(); let b = b.as_i8x32(); + if IMM8 == 16 { + return transmute(a); + } + let r: i8x32 = match IMM8 % 16 { 0 => simd_shuffle!( b, @@ -307,7 +313,7 @@ pub unsafe fn _mm256_alignr_epi8<const IMM8: i32>(a: __m256i, b: __m256i) -> __m 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ], ), - _ => b, + _ => unreachable_unchecked(), }; transmute(r) } @@ -5305,16 +5311,6 @@ mod tests { ); assert_eq_m256i(r, expected); - #[rustfmt::skip] - let expected = _mm256_setr_epi8( - -1, -2, -3, -4, -5, -6, -7, -8, - -9, -10, -11, -12, -13, -14, -15, -16, -17, - -18, -19, -20, -21, -22, -23, -24, -25, - -26, -27, -28, -29, -30, -31, -32, - ); - let r = _mm256_alignr_epi8::<16>(a, b); - assert_eq_m256i(r, expected); - let r = _mm256_alignr_epi8::<15>(a, b); #[rustfmt::skip] let expected = _mm256_setr_epi8( @@ -5327,6 +5323,9 @@ mod tests { let r = _mm256_alignr_epi8::<0>(a, b); assert_eq_m256i(r, b); + + let r = _mm256_alignr_epi8::<16>(a, b); + assert_eq_m256i(r, a); } #[simd_test(enable = "avx2")] |
