24
24
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
25
// DEALINGS IN THE SOFTWARE.
26
26
27
- #[ cfg( feature = "simd_opt" ) ]
28
- use std:: mem:: transmute;
29
-
30
27
pub use simdty:: { u32x4, u64x4} ;
31
-
32
- #[ cfg( feature = "simd" ) ]
33
- extern "platform-intrinsic" {
34
- fn simd_add < T > ( x : T , y : T ) -> T ;
35
- fn simd_shl < T > ( x : T , y : T ) -> T ;
36
- fn simd_shr < T > ( x : T , y : T ) -> T ;
37
- fn simd_xor < T > ( x : T , y : T ) -> T ;
38
- }
39
-
40
- #[ cfg( feature = "simd_opt" ) ]
41
- extern "platform-intrinsic" {
42
- fn simd_shuffle8 < T , Elem > ( v : T , w : T ,
43
- i0 : u32 , i1 : u32 , i2 : u32 , i3 : u32 ,
44
- i4 : u32 , i5 : u32 , i6 : u32 , i7 : u32 ) -> T ;
45
-
46
- #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
47
- fn simd_shuffle16 < T , Elem > ( v : T , w : T ,
48
- i0 : u32 , i1 : u32 , i2 : u32 , i3 : u32 ,
49
- i4 : u32 , i5 : u32 , i6 : u32 , i7 : u32 ,
50
- i8 : u32 , i9 : u32 , i10 : u32 , i11 : u32 ,
51
- i12 : u32 , i13 : u32 , i14 : u32 , i15 : u32 ,
52
- ) -> T ;
53
- }
28
+ #[ cfg( feature = "simd" ) ] use simdint;
54
29
55
30
use std:: ops:: { Add , BitXor , Shl , Shr } ;
56
31
@@ -62,16 +37,16 @@ macro_rules! impl_ops {
62
37
#[ cfg( feature = "simd" ) ]
63
38
#[ inline( always) ]
64
39
fn add( self , rhs: Self ) -> Self :: Output {
65
- unsafe { simd_add( self , rhs) }
40
+ unsafe { simdint :: simd_add( self , rhs) }
66
41
}
67
42
68
43
#[ cfg( not( feature = "simd" ) ) ]
69
44
#[ inline( always) ]
70
45
fn add( self , rhs: Self ) -> Self :: Output {
71
- $vec( self . 0 . wrapping_add( rhs. 0 ) ,
72
- self . 1 . wrapping_add( rhs. 1 ) ,
73
- self . 2 . wrapping_add( rhs. 2 ) ,
74
- self . 3 . wrapping_add( rhs. 3 ) )
46
+ $vec:: new ( self . 0 . wrapping_add( rhs. 0 ) ,
47
+ self . 1 . wrapping_add( rhs. 1 ) ,
48
+ self . 2 . wrapping_add( rhs. 2 ) ,
49
+ self . 3 . wrapping_add( rhs. 3 ) )
75
50
}
76
51
}
77
52
@@ -81,16 +56,16 @@ macro_rules! impl_ops {
81
56
#[ cfg( feature = "simd" ) ]
82
57
#[ inline( always) ]
83
58
fn bitxor( self , rhs: Self ) -> Self :: Output {
84
- unsafe { simd_xor( self , rhs) }
59
+ unsafe { simdint :: simd_xor( self , rhs) }
85
60
}
86
61
87
62
#[ cfg( not( feature = "simd" ) ) ]
88
63
#[ inline( always) ]
89
64
fn bitxor( self , rhs: Self ) -> Self :: Output {
90
- $vec( self . 0 ^ rhs. 0 ,
91
- self . 1 ^ rhs. 1 ,
92
- self . 2 ^ rhs. 2 ,
93
- self . 3 ^ rhs. 3 )
65
+ $vec:: new ( self . 0 ^ rhs. 0 ,
66
+ self . 1 ^ rhs. 1 ,
67
+ self . 2 ^ rhs. 2 ,
68
+ self . 3 ^ rhs. 3 )
94
69
}
95
70
}
96
71
@@ -100,16 +75,16 @@ macro_rules! impl_ops {
100
75
#[ cfg( feature = "simd" ) ]
101
76
#[ inline( always) ]
102
77
fn shl( self , rhs: Self ) -> Self :: Output {
103
- unsafe { simd_shl( self , rhs) }
78
+ unsafe { simdint :: simd_shl( self , rhs) }
104
79
}
105
80
106
81
#[ cfg( not( feature = "simd" ) ) ]
107
82
#[ inline( always) ]
108
83
fn shl( self , rhs: Self ) -> Self :: Output {
109
- $vec( self . 0 << rhs. 0 ,
110
- self . 1 << rhs. 1 ,
111
- self . 2 << rhs. 2 ,
112
- self . 3 << rhs. 3 )
84
+ $vec:: new ( self . 0 << rhs. 0 ,
85
+ self . 1 << rhs. 1 ,
86
+ self . 2 << rhs. 2 ,
87
+ self . 3 << rhs. 3 )
113
88
}
114
89
}
115
90
@@ -119,16 +94,16 @@ macro_rules! impl_ops {
119
94
#[ cfg( feature = "simd" ) ]
120
95
#[ inline( always) ]
121
96
fn shr( self , rhs: Self ) -> Self :: Output {
122
- unsafe { simd_shr( self , rhs) }
97
+ unsafe { simdint :: simd_shr( self , rhs) }
123
98
}
124
99
125
100
#[ cfg( not( feature = "simd" ) ) ]
126
101
#[ inline( always) ]
127
102
fn shr( self , rhs: Self ) -> Self :: Output {
128
- $vec( self . 0 >> rhs. 0 ,
129
- self . 1 >> rhs. 1 ,
130
- self . 2 >> rhs. 2 ,
131
- self . 3 >> rhs. 3 )
103
+ $vec:: new ( self . 0 >> rhs. 0 ,
104
+ self . 1 >> rhs. 1 ,
105
+ self . 2 >> rhs. 2 ,
106
+ self . 3 >> rhs. 3 )
132
107
}
133
108
}
134
109
}
@@ -163,7 +138,7 @@ macro_rules! impl_vector4_common {
163
138
#[ inline( always) ]
164
139
fn gather( src: & [ $word] , i0: usize , i1: usize ,
165
140
i2: usize , i3: usize ) -> Self {
166
- $vec( src[ i0] , src[ i1] , src[ i2] , src[ i3] )
141
+ $vec:: new ( src[ i0] , src[ i1] , src[ i2] , src[ i3] )
167
142
}
168
143
169
144
#[ cfg( target_endian = "little" ) ]
@@ -173,10 +148,10 @@ macro_rules! impl_vector4_common {
173
148
#[ cfg( not( target_endian = "little" ) ) ]
174
149
#[ inline( always) ]
175
150
fn from_le( self ) -> Self {
176
- $vec( $word:: from_le( self . 0 ) ,
177
- $word:: from_le( self . 1 ) ,
178
- $word:: from_le( self . 2 ) ,
179
- $word:: from_le( self . 3 ) )
151
+ $vec:: new ( $word:: from_le( self . 0 ) ,
152
+ $word:: from_le( self . 1 ) ,
153
+ $word:: from_le( self . 2 ) ,
154
+ $word:: from_le( self . 3 ) )
180
155
}
181
156
182
157
#[ cfg( target_endian = "little" ) ]
@@ -186,10 +161,10 @@ macro_rules! impl_vector4_common {
186
161
#[ cfg( not( target_endian = "little" ) ) ]
187
162
#[ inline( always) ]
188
163
fn to_le( self ) -> Self {
189
- $vec( self . 0 . to_le( ) ,
190
- self . 1 . to_le( ) ,
191
- self . 2 . to_le( ) ,
192
- self . 3 . to_le( ) )
164
+ $vec:: new ( self . 0 . to_le( ) ,
165
+ self . 1 . to_le( ) ,
166
+ self . 2 . to_le( ) ,
167
+ self . 3 . to_le( ) )
193
168
}
194
169
195
170
#[ inline( always) ]
@@ -201,31 +176,52 @@ macro_rules! impl_vector4_common {
201
176
let r = n as $word;
202
177
let l = $bits - r;
203
178
204
- ( self >> $vec( r, r, r, r) ) ^ ( self << $vec( l, l, l, l) )
179
+ ( self >> $vec:: new ( r, r, r, r) ) ^ ( self << $vec:: new ( l, l, l, l) )
205
180
}
206
181
207
182
#[ cfg( not( feature = "simd" ) ) ]
208
183
#[ inline( always) ]
209
184
fn rotate_right_any( self , n: u32 ) -> Self {
210
- $vec( self . 0 . rotate_right( n) ,
211
- self . 1 . rotate_right( n) ,
212
- self . 2 . rotate_right( n) ,
213
- self . 3 . rotate_right( n) )
185
+ $vec:: new( self . 0 . rotate_right( n) ,
186
+ self . 1 . rotate_right( n) ,
187
+ self . 2 . rotate_right( n) ,
188
+ self . 3 . rotate_right( n) )
189
+ }
190
+
191
+ #[ cfg( feature = "simd" ) ]
192
+ #[ inline( always) ]
193
+ fn shuffle_left_1( self ) -> Self {
194
+ unsafe { simdint:: simd_shuffle4( self , self , 1 , 2 , 3 , 0 ) }
214
195
}
215
196
197
+ #[ cfg( not( feature = "simd" ) ) ]
216
198
#[ inline( always) ]
217
199
fn shuffle_left_1( self ) -> Self {
218
- $vec( self . 1 , self . 2 , self . 3 , self . 0 )
200
+ $vec:: new( self . 1 , self . 2 , self . 3 , self . 0 )
201
+ }
202
+
203
+ #[ cfg( feature = "simd" ) ]
204
+ #[ inline( always) ]
205
+ fn shuffle_left_2( self ) -> Self {
206
+ unsafe { simdint:: simd_shuffle4( self , self , 2 , 3 , 0 , 1 ) }
219
207
}
220
208
209
+ #[ cfg( not( feature = "simd" ) ) ]
221
210
#[ inline( always) ]
222
211
fn shuffle_left_2( self ) -> Self {
223
- $vec( self . 2 , self . 3 , self . 0 , self . 1 )
212
+ $vec:: new( self . 2 , self . 3 , self . 0 , self . 1 )
213
+ }
214
+
215
+ #[ cfg( feature = "simd" ) ]
216
+ #[ inline( always) ]
217
+ fn shuffle_left_3( self ) -> Self {
218
+ unsafe { simdint:: simd_shuffle4( self , self , 3 , 0 , 1 , 2 ) }
224
219
}
225
220
221
+ #[ cfg( not( feature = "simd" ) ) ]
226
222
#[ inline( always) ]
227
223
fn shuffle_left_3( self ) -> Self {
228
- $vec( self . 3 , self . 0 , self . 1 , self . 2 )
224
+ $vec:: new ( self . 3 , self . 0 , self . 1 , self . 2 )
229
225
}
230
226
}
231
227
}
@@ -236,13 +232,16 @@ macro_rules! impl_vector4_common {
236
232
#[ inline( always) ]
237
233
fn u32x4_rotate_right_16 ( vec : u32x4 ) -> u32x4 {
238
234
use simdty:: u16x8;
235
+ use std:: mem:: transmute;
236
+
239
237
unsafe {
240
238
let tmp: u16x8 = transmute ( vec) ;
241
- transmute ( simd_shuffle8 :: < u16x8 , u16 > ( tmp, tmp,
242
- 1 , 0 ,
243
- 3 , 2 ,
244
- 5 , 4 ,
245
- 7 , 6 ) )
239
+ let tmp: u16x8 = simdint:: simd_shuffle8 ( tmp, tmp,
240
+ 1 , 0 ,
241
+ 3 , 2 ,
242
+ 5 , 4 ,
243
+ 7 , 6 ) ;
244
+ transmute ( tmp)
246
245
}
247
246
}
248
247
@@ -268,13 +267,16 @@ impl Vector4<u32> for u32x4 {
268
267
#[ inline( always) ]
269
268
fn u64x4_rotate_right_32 ( vec : u64x4 ) -> u64x4 {
270
269
use simdty:: u32x8;
270
+ use std:: mem:: transmute;
271
+
271
272
unsafe {
272
273
let tmp: u32x8 = transmute ( vec) ;
273
- transmute ( simd_shuffle8 :: < u32x8 , u32 > ( tmp, tmp,
274
- 1 , 0 ,
275
- 3 , 2 ,
276
- 5 , 4 ,
277
- 7 , 6 ) )
274
+ let tmp: u32x8 = simdint:: simd_shuffle8 ( tmp, tmp,
275
+ 1 , 0 ,
276
+ 3 , 2 ,
277
+ 5 , 4 ,
278
+ 7 , 6 ) ;
279
+ transmute ( tmp)
278
280
}
279
281
}
280
282
@@ -283,13 +285,16 @@ fn u64x4_rotate_right_32(vec: u64x4) -> u64x4 {
283
285
#[ inline( always) ]
284
286
fn u64x4_rotate_right_16 ( vec : u64x4 ) -> u64x4 {
285
287
use simdty:: u16x16;
288
+ use std:: mem:: transmute;
289
+
286
290
unsafe {
287
291
let tmp: u16x16 = transmute ( vec) ;
288
- transmute ( simd_shuffle16 :: < u16x16 , u16 > ( tmp, tmp,
289
- 1 , 2 , 3 , 0 ,
290
- 5 , 6 , 7 , 4 ,
291
- 9 , 10 , 11 , 8 ,
292
- 13 , 14 , 15 , 12 ) )
292
+ let tmp: u16x16 = simdint:: simd_shuffle16 ( tmp, tmp,
293
+ 1 , 2 , 3 , 0 ,
294
+ 5 , 6 , 7 , 4 ,
295
+ 9 , 10 , 11 , 8 ,
296
+ 13 , 14 , 15 , 12 ) ;
297
+ transmute ( tmp)
293
298
}
294
299
}
295
300
@@ -314,9 +319,11 @@ fn vext_u64_u8(a: u64x2, b: u8) -> u64x2 {
314
319
#[ cfg( target_arch = "arm" ) ]
315
320
#[ inline( always) ]
316
321
fn u64x4_rotate_right_u8 ( vec : u64x4 , n : u8 ) -> u64x4 {
317
- let tmp0 = vext_u64_u8 ( u64x2 ( vec. 0 , vec. 1 ) , n) ;
318
- let tmp1 = vext_u64_u8 ( u64x2 ( vec. 2 , vec. 3 ) , n) ;
319
- u64x4 ( tmp0. 0 , tmp0. 1 , tmp1. 0 , tmp1. 1 )
322
+ unsafe {
323
+ let tmp0 = vext_u64_u8 ( simdint:: simd_shuffle2 ( vec, vec, 0 , 1 ) , n) ;
324
+ let tmp1 = vext_u64_u8 ( simdint:: simd_shuffle2 ( vec, vec, 2 , 3 ) , n) ;
325
+ simdint:: simd_shuffle4 ( tmp0, tmp1, 0 , 1 , 2 , 3 )
326
+ }
320
327
}
321
328
322
329
impl Vector4 < u64 > for u64x4 {
0 commit comments