about summary refs log tree commit diff
path: root/library/stdarch/crates
diff options
context:
space:
mode:
Diffstat (limited to 'library/stdarch/crates')
-rw-r--r--library/stdarch/crates/core_arch/src/x86/avx2.rs178
1 files changed, 46 insertions, 132 deletions
diff --git a/library/stdarch/crates/core_arch/src/x86/avx2.rs b/library/stdarch/crates/core_arch/src/x86/avx2.rs
index 4c12b841d6a..2e834006333 100644
--- a/library/stdarch/crates/core_arch/src/x86/avx2.rs
+++ b/library/stdarch/crates/core_arch/src/x86/avx2.rs
@@ -2961,140 +2961,54 @@ pub fn _mm256_srli_si256<const IMM8: i32>(a: __m256i) -> __m256i {
 #[stable(feature = "simd_x86", since = "1.27.0")]
 pub fn _mm256_bsrli_epi128<const IMM8: i32>(a: __m256i) -> __m256i {
     static_assert_uimm_bits!(IMM8, 8);
+    const fn mask(shift: i32, i: u32) -> u32 {
+        let shift = shift as u32 & 0xff;
+        if shift > 15 || (15 - (i % 16)) < shift {
+            0
+        } else {
+            32 + (i + shift)
+        }
+    }
     unsafe {
         let a = a.as_i8x32();
-        let zero = i8x32::ZERO;
-        let r: i8x32 = match IMM8 {
-            0 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    0, 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,
-                ],
-            ),
-            1 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 17, 18, 19, 20, 21, 22,
-                    23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
-                ],
-            ),
-            2 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 18, 19, 20, 21, 22, 23,
-                    24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
-                ],
-            ),
-            3 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 19, 20, 21, 22, 23,
-                    24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32,
-                ],
-            ),
-            4 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 20, 21, 22, 23, 24,
-                    25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32,
-                ],
-            ),
-            5 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 21, 22, 23, 24, 25,
-                    26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32,
-                ],
-            ),
-            6 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 22, 23, 24, 25, 26,
-                    27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            7 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 23, 24, 25, 26,
-                    27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            8 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 24, 25, 26, 27,
-                    28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            9 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 25, 26, 27, 28,
-                    29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            10 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 26, 27, 28, 29,
-                    30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            11 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 27, 28, 29, 30,
-                    31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            12 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 28, 29, 30, 31,
-                    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            13 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 29, 30, 31, 32,
-                    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            14 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 30, 31, 32, 32,
-                    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            15 => simd_shuffle!(
-                a,
-                zero,
-                [
-                    15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 31, 32, 32, 32,
-                    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-                ],
-            ),
-            _ => zero,
-        };
+        let r: i8x32 = simd_shuffle!(
+            i8x32::ZERO,
+            a,
+            [
+                mask(IMM8, 0),
+                mask(IMM8, 1),
+                mask(IMM8, 2),
+                mask(IMM8, 3),
+                mask(IMM8, 4),
+                mask(IMM8, 5),
+                mask(IMM8, 6),
+                mask(IMM8, 7),
+                mask(IMM8, 8),
+                mask(IMM8, 9),
+                mask(IMM8, 10),
+                mask(IMM8, 11),
+                mask(IMM8, 12),
+                mask(IMM8, 13),
+                mask(IMM8, 14),
+                mask(IMM8, 15),
+                mask(IMM8, 16),
+                mask(IMM8, 17),
+                mask(IMM8, 18),
+                mask(IMM8, 19),
+                mask(IMM8, 20),
+                mask(IMM8, 21),
+                mask(IMM8, 22),
+                mask(IMM8, 23),
+                mask(IMM8, 24),
+                mask(IMM8, 25),
+                mask(IMM8, 26),
+                mask(IMM8, 27),
+                mask(IMM8, 28),
+                mask(IMM8, 29),
+                mask(IMM8, 30),
+                mask(IMM8, 31),
+            ],
+        );
         transmute(r)
     }
 }