@@ -976,6 +976,14 @@ pub unsafe fn _mm_setzero_ps() -> __m128 {
976
976
__m128 ( 0.0 , 0.0 , 0.0 , 0.0 )
977
977
}
978
978
979
+ /// A utility function for creating masks to use with Intel shuffle and permute intrinsics.
980
+ #[ inline]
981
+ #[ allow( non_snake_case) ]
982
+ #[ stable( feature = "simd_x86" , since = "1.28.0" ) ]
983
+ pub const fn _MM_SHUFFLE ( z : u32 , y : u32 , x : u32 , w : u32 ) -> u32 {
984
+ ( z << 6 ) | ( y << 4 ) | ( x << 2 ) | w
985
+ }
986
+
979
987
/// Shuffle packed single-precision (32-bit) floating-point elements in `a` and
980
988
/// `b` using `mask`.
981
989
///
@@ -3585,6 +3593,13 @@ mod tests {
3585
3593
assert_eq_m128 ( r, _mm_set1_ps ( 0.0 ) ) ;
3586
3594
}
3587
3595
3596
+ #[ simd_test( enable = "sse" ) ]
3597
+ unsafe fn test_mm_shuffle ( ) {
3598
+ assert_eq ! ( _MM_SHUFFLE( 0 , 1 , 1 , 3 ) , 0b00_01_01_11 ) ;
3599
+ assert_eq ! ( _MM_SHUFFLE( 3 , 1 , 1 , 0 ) , 0b11_01_01_00 ) ;
3600
+ assert_eq ! ( _MM_SHUFFLE( 1 , 2 , 2 , 1 ) , 0b01_10_10_01 ) ;
3601
+ }
3602
+
3588
3603
#[ simd_test( enable = "sse" ) ]
3589
3604
unsafe fn test_mm_shuffle_ps ( ) {
3590
3605
let a = _mm_setr_ps ( 1.0 , 2.0 , 3.0 , 4.0 ) ;
0 commit comments