about summary refs log tree commit diff
path: root/library
diff options
context:
space:
mode:
authorMartin Liska <martin.liska@hey.com>2024-11-18 19:16:13 +0100
committerAmanieu d'Antras <amanieu@gmail.com>2024-11-30 23:07:21 +0000
commit1d10adfa38b15a052be41bffff3e7ef5911f1b47 (patch)
tree4b51b90586abe3176cbf294d07892284e38cf050 /library
parent6d24a9f72ba60f193adec30d4b6e8f1311555eb8 (diff)
downloadrust-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.rs21
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")]