@@ -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 :: * ;
@@ -1007,21 +1050,6 @@ mod sealed {
1007
1050
unsafe fn vec_reve ( self ) -> Self ;
1008
1051
}
1009
1052
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
-
1025
1053
macro_rules! impl_reve {
1026
1054
( $( $ty: ident, $fun: ident, $instr: ident) ,* ) => {
1027
1055
$(
@@ -1030,7 +1058,7 @@ mod sealed {
1030
1058
#[ cfg_attr( test, assert_instr( $instr) ) ]
1031
1059
unsafe fn $fun( a: $ty) -> $ty {
1032
1060
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 ( ) } )
1034
1062
}
1035
1063
1036
1064
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
@@ -1125,39 +1153,6 @@ mod sealed {
1125
1153
}
1126
1154
}
1127
1155
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
-
1161
1156
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
1162
1157
pub trait VectorMergel {
1163
1158
unsafe fn vec_mergel ( self , other : Self ) -> Self ;
@@ -1176,7 +1171,7 @@ mod sealed {
1176
1171
#[ cfg_attr( test, assert_instr( $mergel) ) ]
1177
1172
unsafe fn $mergel( a: $ty, b: $ty) -> $ty {
1178
1173
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( ) } )
1180
1175
}
1181
1176
1182
1177
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
@@ -1202,7 +1197,7 @@ mod sealed {
1202
1197
#[ cfg_attr( test, assert_instr( $mergeh) ) ]
1203
1198
unsafe fn $mergeh( a: $ty, b: $ty) -> $ty {
1204
1199
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( ) } )
1206
1201
}
1207
1202
1208
1203
#[ unstable( feature = "stdarch_s390x" , issue = "135681" ) ]
@@ -1745,6 +1740,21 @@ mod tests {
1745
1740
use crate :: core_arch:: simd:: * ;
1746
1741
use stdarch_test:: simd_test;
1747
1742
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
+
1748
1758
macro_rules! test_vec_1 {
1749
1759
{ $name: ident, $fn: ident, f32x4, [ $( $a: expr) ,+] , ~[ $( $d: expr) ,+] } => {
1750
1760
#[ simd_test( enable = "vector" ) ]
0 commit comments