Skip to content

Commit 0eebfde

Browse files
bitshiftergnzlbg
authored andcommitted
Added implementation and test of _MM_SHUFFLE macro.
1 parent f37d6e7 commit 0eebfde

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

coresimd/x86/sse.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,14 @@ pub unsafe fn _mm_setzero_ps() -> __m128 {
976976
__m128(0.0, 0.0, 0.0, 0.0)
977977
}
978978

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+
979987
/// Shuffle packed single-precision (32-bit) floating-point elements in `a` and
980988
/// `b` using `mask`.
981989
///
@@ -3585,6 +3593,13 @@ mod tests {
35853593
assert_eq_m128(r, _mm_set1_ps(0.0));
35863594
}
35873595

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+
35883603
#[simd_test(enable = "sse")]
35893604
unsafe fn test_mm_shuffle_ps() {
35903605
let a = _mm_setr_ps(1.0, 2.0, 3.0, 4.0);

0 commit comments

Comments
 (0)