@@ -45,12 +45,17 @@ pub unsafe fn _mm_shuffle_pi8(a: u8x8, b: u8x8) -> u8x8 {
45
45
46
46
/// Concatenates the two 64-bit integer vector operands, and right-shifts
47
47
/// the result by the number of bytes specified in the immediate operand.
48
- /* #[inline(always)]
48
+ #[ inline( always) ]
49
49
#[ target_feature = "+ssse3" ]
50
50
#[ cfg_attr( test, assert_instr( palignr, n = 15 ) ) ]
51
- pub unsafe fn _mm_alignr_pi8(a: i8x8, b: i8x8, n: i32) -> i8x8 {
52
- mem::transmute(palignrb(mem::transmute(a), mem::transmute(b), n))
53
- }*/
51
+ pub unsafe fn _mm_alignr_pi8 ( a : u8x8 , b : u8x8 , n : u8 ) -> u8x8 {
52
+ macro_rules! call {
53
+ ( $imm8: expr) => {
54
+ mem:: transmute( palignrb( mem:: transmute( a) , mem:: transmute( b) , $imm8) )
55
+ }
56
+ }
57
+ constify_imm8 ! ( n, call)
58
+ }
54
59
55
60
/// Horizontally add the adjacent pairs of values contained in 2 packed
56
61
/// 64-bit vectors of [4 x i16].
@@ -178,8 +183,8 @@ extern "C" {
178
183
#[ link_name = "llvm.x86.ssse3.pshuf.b" ]
179
184
fn pshufb ( a : __m64 , b : __m64 ) -> __m64 ;
180
185
181
- /* #[link_name = "llvm.x86.mmx.palignr.b"]
182
- fn palignrb(a: __m64, b: __m64, n: i32 ) -> __m64;*/
186
+ #[ link_name = "llvm.x86.mmx.palignr.b" ]
187
+ fn palignrb ( a : __m64 , b : __m64 , n : u8 ) -> __m64 ;
183
188
184
189
#[ link_name = "llvm.x86.ssse3.phadd.w" ]
185
190
fn phaddw ( a : __m64 , b : __m64 ) -> __m64 ;
@@ -249,27 +254,13 @@ mod tests {
249
254
assert_eq ! ( r, expected) ;
250
255
}
251
256
252
- /* #[simd_test = "ssse3"]
257
+ #[ simd_test = "ssse3" ]
253
258
unsafe fn _mm_alignr_pi8 ( ) {
254
- let a = i8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
255
- let b = i8x8::new(4, 63, 4, 3, 24, 12, 6, 19);
256
- let r = ssse3::_mm_alignr_pi8(a, b, 33);
257
- assert_eq!(r, i8x8::splat(0));
258
-
259
- let r = ssse3::_mm_alignr_pi8(a, b, 17);
260
- let expected = i8x8::new(2, 3, 4, 5, 6, 7, 8, 0);
261
- assert_eq!(r, expected);
262
-
263
- let r = ssse3::_mm_alignr_pi8(a, b, 16);
264
- assert_eq!(r, a);
265
-
266
- let r = ssse3::_mm_alignr_pi8(a, b, 15);
267
- let expected = i8x8::new(0, 1, 2, 3, 4, 5, 6, 7);
268
- assert_eq!(r, expected);
269
-
270
- let r = ssse3::_mm_alignr_pi8(a, b, 0);
271
- assert_eq!(r, b);
272
- }*/
259
+ let a = u32x2:: new ( 0x89ABCDEF_u32 , 0x01234567_u32 ) ;
260
+ let b = u32x2:: new ( 0xBBAA9988_u32 , 0xFFDDEECC_u32 ) ;
261
+ let r = ssse3:: _mm_alignr_pi8 ( u8x8:: from ( a) , u8x8:: from ( b) , 4 ) ;
262
+ assert_eq ! ( r, :: std:: mem:: transmute( 0x89abcdefffddeecc_u64 ) ) ;
263
+ }
273
264
274
265
#[ simd_test = "ssse3" ]
275
266
unsafe fn _mm_hadd_pi16 ( ) {
0 commit comments