Skip to content

Commit 3392f21

Browse files
folkertdevAmanieu
authored andcommitted
pull out ShuffleMask
1 parent 348592f commit 3392f21

File tree

1 file changed

+61
-51
lines changed

1 file changed

+61
-51
lines changed

crates/core_arch/src/s390x/vector.rs

Lines changed: 61 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,49 @@ impl_neg! { i64x2 : 0 }
111111
impl_neg! { f32x4 : 0f32 }
112112
impl_neg! { f64x2 : 0f64 }
113113

114+
#[repr(simd)]
115+
struct ShuffleMask<const N: usize>([u32; N]);
116+
117+
impl<const N: usize> ShuffleMask<N> {
118+
const fn reverse() -> Self {
119+
let mut index = [0; N];
120+
let mut i = 0;
121+
while i < N {
122+
index[i] = (N - i - 1) as u32;
123+
i += 1;
124+
}
125+
ShuffleMask(index)
126+
}
127+
128+
const fn merge_low() -> Self {
129+
let mut mask = [0; N];
130+
let mut i = N / 2;
131+
let mut index = 0;
132+
while index < N {
133+
mask[index] = i as u32;
134+
mask[index + 1] = (i + N) as u32;
135+
136+
i += 1;
137+
index += 2;
138+
}
139+
ShuffleMask(mask)
140+
}
141+
142+
const fn merge_high() -> Self {
143+
let mut mask = [0; N];
144+
let mut i = 0;
145+
let mut index = 0;
146+
while index < N {
147+
mask[index] = i as u32;
148+
mask[index + 1] = (i + N) as u32;
149+
150+
i += 1;
151+
index += 2;
152+
}
153+
ShuffleMask(mask)
154+
}
155+
}
156+
114157
#[macro_use]
115158
mod sealed {
116159
use super::*;
@@ -1003,21 +1046,6 @@ mod sealed {
10031046
unsafe fn vec_reve(self) -> Self;
10041047
}
10051048

1006-
#[repr(simd)]
1007-
struct ReverseMask<const N: usize>([u32; N]);
1008-
1009-
impl<const N: usize> ReverseMask<N> {
1010-
const fn new() -> Self {
1011-
let mut index = [0; N];
1012-
let mut i = 0;
1013-
while i < N {
1014-
index[i] = (N - i - 1) as u32;
1015-
i += 1;
1016-
}
1017-
ReverseMask(index)
1018-
}
1019-
}
1020-
10211049
macro_rules! impl_reve {
10221050
($($ty:ident, $fun:ident, $instr:ident),*) => {
10231051
$(
@@ -1026,7 +1054,7 @@ mod sealed {
10261054
#[cfg_attr(test, assert_instr($instr))]
10271055
unsafe fn $fun(a: $ty) -> $ty {
10281056
const N: usize = core::mem::size_of::<$ty>() / core::mem::size_of::<l_t_t!($ty)>();
1029-
simd_shuffle(a, a, const { ReverseMask::<N>::new() })
1057+
simd_shuffle(a, a, const { ShuffleMask::<N>::reverse() })
10301058
}
10311059

10321060
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -1121,39 +1149,6 @@ mod sealed {
11211149
}
11221150
}
11231151

1124-
#[repr(simd)]
1125-
struct MergeMask<const N: usize>([u32; N]);
1126-
1127-
impl<const N: usize> MergeMask<N> {
1128-
const fn merge_low() -> Self {
1129-
let mut mask = [0; N];
1130-
let mut i = N / 2;
1131-
let mut index = 0;
1132-
while index < N {
1133-
mask[index] = i as u32;
1134-
mask[index + 1] = (i + N) as u32;
1135-
1136-
i += 1;
1137-
index += 2;
1138-
}
1139-
MergeMask(mask)
1140-
}
1141-
1142-
const fn merge_high() -> Self {
1143-
let mut mask = [0; N];
1144-
let mut i = 0;
1145-
let mut index = 0;
1146-
while index < N {
1147-
mask[index] = i as u32;
1148-
mask[index + 1] = (i + N) as u32;
1149-
1150-
i += 1;
1151-
index += 2;
1152-
}
1153-
MergeMask(mask)
1154-
}
1155-
}
1156-
11571152
#[unstable(feature = "stdarch_s390x", issue = "135681")]
11581153
pub trait VectorMergel {
11591154
unsafe fn vec_mergel(self, other: Self) -> Self;
@@ -1172,7 +1167,7 @@ mod sealed {
11721167
#[cfg_attr(test, assert_instr($mergel))]
11731168
unsafe fn $mergel(a: $ty, b: $ty) -> $ty {
11741169
const N: usize = core::mem::size_of::<$ty>() / core::mem::size_of::<l_t_t!($ty)>();
1175-
simd_shuffle(a, b, const { MergeMask::<N>::merge_low() })
1170+
simd_shuffle(a, b, const { ShuffleMask::<N>::merge_low() })
11761171
}
11771172

11781173
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -1198,7 +1193,7 @@ mod sealed {
11981193
#[cfg_attr(test, assert_instr($mergeh))]
11991194
unsafe fn $mergeh(a: $ty, b: $ty) -> $ty {
12001195
const N: usize = core::mem::size_of::<$ty>() / core::mem::size_of::<l_t_t!($ty)>();
1201-
simd_shuffle(a, b, const { MergeMask::<N>::merge_high() })
1196+
simd_shuffle(a, b, const { ShuffleMask::<N>::merge_high() })
12021197
}
12031198

12041199
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -1741,6 +1736,21 @@ mod tests {
17411736
use crate::core_arch::simd::*;
17421737
use stdarch_test::simd_test;
17431738

1739+
#[test]
1740+
fn reverse_mask() {
1741+
assert_eq!(ShuffleMask::<4>::reverse().0, [3, 2, 1, 0]);
1742+
}
1743+
1744+
#[test]
1745+
fn mergel_mask() {
1746+
assert_eq!(ShuffleMask::<4>::merge_low().0, [2, 6, 3, 7]);
1747+
}
1748+
1749+
#[test]
1750+
fn mergeh_mask() {
1751+
assert_eq!(ShuffleMask::<4>::merge_high().0, [0, 4, 1, 5]);
1752+
}
1753+
17441754
macro_rules! test_vec_1 {
17451755
{ $name: ident, $fn:ident, f32x4, [$($a:expr),+], ~[$($d:expr),+] } => {
17461756
#[simd_test(enable = "vector")]

0 commit comments

Comments
 (0)