Skip to content

Commit 085df43

Browse files
committed
pull out ShuffleMask
1 parent 9088dd7 commit 085df43

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::*;
@@ -1007,21 +1050,6 @@ mod sealed {
10071050
unsafe fn vec_reve(self) -> Self;
10081051
}
10091052

1010-
#[repr(simd)]
1011-
struct ReverseMask<const N: usize>([u32; N]);
1012-
1013-
impl<const N: usize> ReverseMask<N> {
1014-
const fn new() -> Self {
1015-
let mut index = [0; N];
1016-
let mut i = 0;
1017-
while i < N {
1018-
index[i] = (N - i - 1) as u32;
1019-
i += 1;
1020-
}
1021-
ReverseMask(index)
1022-
}
1023-
}
1024-
10251053
macro_rules! impl_reve {
10261054
($($ty:ident, $fun:ident, $instr:ident),*) => {
10271055
$(
@@ -1030,7 +1058,7 @@ mod sealed {
10301058
#[cfg_attr(test, assert_instr($instr))]
10311059
unsafe fn $fun(a: $ty) -> $ty {
10321060
const N: usize = core::mem::size_of::<$ty>() / core::mem::size_of::<l_t_t!($ty)>();
1033-
simd_shuffle(a, a, const { ReverseMask::<N>::new() })
1061+
simd_shuffle(a, a, const { ShuffleMask::<N>::reverse() })
10341062
}
10351063

10361064
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -1125,39 +1153,6 @@ mod sealed {
11251153
}
11261154
}
11271155

1128-
#[repr(simd)]
1129-
struct MergeMask<const N: usize>([u32; N]);
1130-
1131-
impl<const N: usize> MergeMask<N> {
1132-
const fn merge_low() -> Self {
1133-
let mut mask = [0; N];
1134-
let mut i = N / 2;
1135-
let mut index = 0;
1136-
while index < N {
1137-
mask[index] = i as u32;
1138-
mask[index + 1] = (i + N) as u32;
1139-
1140-
i += 1;
1141-
index += 2;
1142-
}
1143-
MergeMask(mask)
1144-
}
1145-
1146-
const fn merge_high() -> Self {
1147-
let mut mask = [0; N];
1148-
let mut i = 0;
1149-
let mut index = 0;
1150-
while index < N {
1151-
mask[index] = i as u32;
1152-
mask[index + 1] = (i + N) as u32;
1153-
1154-
i += 1;
1155-
index += 2;
1156-
}
1157-
MergeMask(mask)
1158-
}
1159-
}
1160-
11611156
#[unstable(feature = "stdarch_s390x", issue = "135681")]
11621157
pub trait VectorMergel {
11631158
unsafe fn vec_mergel(self, other: Self) -> Self;
@@ -1176,7 +1171,7 @@ mod sealed {
11761171
#[cfg_attr(test, assert_instr($mergel))]
11771172
unsafe fn $mergel(a: $ty, b: $ty) -> $ty {
11781173
const N: usize = core::mem::size_of::<$ty>() / core::mem::size_of::<l_t_t!($ty)>();
1179-
simd_shuffle(a, b, const { MergeMask::<N>::merge_low() })
1174+
simd_shuffle(a, b, const { ShuffleMask::<N>::merge_low() })
11801175
}
11811176

11821177
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -1202,7 +1197,7 @@ mod sealed {
12021197
#[cfg_attr(test, assert_instr($mergeh))]
12031198
unsafe fn $mergeh(a: $ty, b: $ty) -> $ty {
12041199
const N: usize = core::mem::size_of::<$ty>() / core::mem::size_of::<l_t_t!($ty)>();
1205-
simd_shuffle(a, b, const { MergeMask::<N>::merge_high() })
1200+
simd_shuffle(a, b, const { ShuffleMask::<N>::merge_high() })
12061201
}
12071202

12081203
#[unstable(feature = "stdarch_s390x", issue = "135681")]
@@ -1745,6 +1740,21 @@ mod tests {
17451740
use crate::core_arch::simd::*;
17461741
use stdarch_test::simd_test;
17471742

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

0 commit comments

Comments
 (0)