@@ -968,6 +968,14 @@ pub unsafe fn _mm_setzero_ps() -> __m128 {
968
968
__m128 ( 0.0 , 0.0 , 0.0 , 0.0 )
969
969
}
970
970
971
+ /// A utility function for creating masks to use with Intel shuffle and permute intrinsics.
972
+ #[ inline]
973
+ #[ allow( non_snake_case) ]
974
+ #[ stable( feature = "simd_x86" , since = "1.28.0" ) ]
975
+ pub const fn _MM_SHUFFLE ( z : u32 , y : u32 , x : u32 , w : u32 ) -> u32 {
976
+ ( z << 6 ) | ( y << 4 ) | ( x << 2 ) | w
977
+ }
978
+
971
979
/// Shuffle packed single-precision (32-bit) floating-point elements in `a` and
972
980
/// `b` using `mask`.
973
981
///
@@ -3570,6 +3578,13 @@ mod tests {
3570
3578
assert_eq_m128 ( r, _mm_set1_ps ( 0.0 ) ) ;
3571
3579
}
3572
3580
3581
+ #[ simd_test( enable = "sse" ) ]
3582
+ unsafe fn test_mm_shuffle ( ) {
3583
+ assert_eq ! ( _MM_SHUFFLE( 0 , 1 , 1 , 3 ) , 0b00_01_01_11 ) ;
3584
+ assert_eq ! ( _MM_SHUFFLE( 3 , 1 , 1 , 0 ) , 0b11_01_01_00 ) ;
3585
+ assert_eq ! ( _MM_SHUFFLE( 1 , 2 , 2 , 1 ) , 0b01_10_10_01 ) ;
3586
+ }
3587
+
3573
3588
#[ simd_test( enable = "sse" ) ]
3574
3589
unsafe fn test_mm_shuffle_ps ( ) {
3575
3590
let a = _mm_setr_ps ( 1.0 , 2.0 , 3.0 , 4.0 ) ;
0 commit comments