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")]
|
#[stable(feature = "simd_x86", since = "1.27.0")]
|
||||||
pub fn _mm256_bsrli_epi128<const IMM8: i32>(a: __m256i) -> __m256i {
|
pub fn _mm256_bsrli_epi128<const IMM8: i32>(a: __m256i) -> __m256i {
|
||||||
static_assert_uimm_bits!(IMM8, 8);
|
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 {
|
unsafe {
|
||||||
let a = a.as_i8x32();
|
let a = a.as_i8x32();
|
||||||
let zero = i8x32::ZERO;
|
let r: i8x32 = simd_shuffle!(
|
||||||
let r: i8x32 = match IMM8 {
|
i8x32::ZERO,
|
||||||
0 => simd_shuffle!(
|
a,
|
||||||
a,
|
[
|
||||||
zero,
|
mask(IMM8, 0),
|
||||||
[
|
mask(IMM8, 1),
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
|
mask(IMM8, 2),
|
||||||
22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
mask(IMM8, 3),
|
||||||
],
|
mask(IMM8, 4),
|
||||||
),
|
mask(IMM8, 5),
|
||||||
1 => simd_shuffle!(
|
mask(IMM8, 6),
|
||||||
a,
|
mask(IMM8, 7),
|
||||||
zero,
|
mask(IMM8, 8),
|
||||||
[
|
mask(IMM8, 9),
|
||||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 17, 18, 19, 20, 21, 22,
|
mask(IMM8, 10),
|
||||||
23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
|
mask(IMM8, 11),
|
||||||
],
|
mask(IMM8, 12),
|
||||||
),
|
mask(IMM8, 13),
|
||||||
2 => simd_shuffle!(
|
mask(IMM8, 14),
|
||||||
a,
|
mask(IMM8, 15),
|
||||||
zero,
|
mask(IMM8, 16),
|
||||||
[
|
mask(IMM8, 17),
|
||||||
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 18, 19, 20, 21, 22, 23,
|
mask(IMM8, 18),
|
||||||
24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
|
mask(IMM8, 19),
|
||||||
],
|
mask(IMM8, 20),
|
||||||
),
|
mask(IMM8, 21),
|
||||||
3 => simd_shuffle!(
|
mask(IMM8, 22),
|
||||||
a,
|
mask(IMM8, 23),
|
||||||
zero,
|
mask(IMM8, 24),
|
||||||
[
|
mask(IMM8, 25),
|
||||||
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 19, 20, 21, 22, 23,
|
mask(IMM8, 26),
|
||||||
24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32,
|
mask(IMM8, 27),
|
||||||
],
|
mask(IMM8, 28),
|
||||||
),
|
mask(IMM8, 29),
|
||||||
4 => simd_shuffle!(
|
mask(IMM8, 30),
|
||||||
a,
|
mask(IMM8, 31),
|
||||||
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,
|
|
||||||
};
|
|
||||||
transmute(r)
|
transmute(r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user