@@ -111,6 +111,49 @@ impl_neg! { i64x2 : 0 }
111
111
impl_neg ! { f32x4 : 0f32 }
112
112
impl_neg ! { f64x2 : 0f64 }
113
113
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
+
114
157
#[ macro_use]
115
158
mod sealed {
116
159
use super :: * ;
@@ -1003,21 +1046,6 @@ mod sealed {
1003
1046
unsafe fn vec_reve ( self ) -> Self ;
1004
1047
}
1005
1048
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
-
1021
1049
macro_rules! impl_reve {
1022
1050
( $( $ty: ident, $fun: ident, $instr: ident) ,* ) => {
1023
1051
$(
@@ -1026,7 +1054,7 @@ mod sealed {
1026
1054
#[ cfg_attr( test, assert_instr( $instr) ) ]
1027
1055
unsafe fn $fun( a: $ty) -> $ty {
1028
1056
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 ( ) } )
1030
1058
}
1031
1059
1032
1060
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
@@ -1121,39 +1149,6 @@ mod sealed {
1121
1149
}
1122
1150
}
1123
1151
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
-
1157
1152
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
1158
1153
pub trait VectorMergel {
1159
1154
unsafe fn vec_mergel ( self , other : Self ) -> Self ;
@@ -1172,7 +1167,7 @@ mod sealed {
1172
1167
#[ cfg_attr( test, assert_instr( $mergel) ) ]
1173
1168
unsafe fn $mergel( a: $ty, b: $ty) -> $ty {
1174
1169
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( ) } )
1176
1171
}
1177
1172
1178
1173
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
@@ -1198,7 +1193,7 @@ mod sealed {
1198
1193
#[ cfg_attr( test, assert_instr( $mergeh) ) ]
1199
1194
unsafe fn $mergeh( a: $ty, b: $ty) -> $ty {
1200
1195
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( ) } )
1202
1197
}
1203
1198
1204
1199
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
@@ -1741,6 +1736,21 @@ mod tests {
1741
1736
use crate :: core_arch:: simd:: * ;
1742
1737
use stdarch_test:: simd_test;
1743
1738
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
+
1744
1754
macro_rules! test_vec_1 {
1745
1755
{ $name: ident, $fn: ident, f32x4, [ $( $a: expr) ,+] , ~[ $( $d: expr) ,+] } => {
1746
1756
#[ simd_test( enable = "vector" ) ]
0 commit comments