Changed the implementation of bsrli to match bslli in avx2 intrinsics
This commit is contained in:
committed by
Amanieu d'Antras
parent
1c5b2a659d
commit
09475721a8
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user