From b7bdcb6e63ee4cdd9fcdf8898ee673cdae3ac96e Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Sat, 4 Jul 2026 12:21:33 +0200 Subject: [PATCH] add better test for `permutexvar` --- crates/core_arch/src/x86/avx512vbmi.rs | 90 +++++++++++++++++++++----- 1 file changed, 73 insertions(+), 17 deletions(-) diff --git a/crates/core_arch/src/x86/avx512vbmi.rs b/crates/core_arch/src/x86/avx512vbmi.rs index 141a8c8aec..3d0662269e 100644 --- a/crates/core_arch/src/x86/avx512vbmi.rs +++ b/crates/core_arch/src/x86/avx512vbmi.rs @@ -737,15 +737,35 @@ mod tests { } #[simd_test(enable = "avx512vbmi")] - fn test_mm512_permutexvar_epi8() { - let idx = _mm512_set1_epi8(1); - #[rustfmt::skip] - let a = _mm512_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); + unsafe fn test_mm512_permutexvar_epi8() { + #[rustfmt::skip] + let idx_arr: [u8; 64] = [ + 34, 58, 27, 72, 19, 38, 53, 0, 44, 15, 29, 81, 20, 35, 62, 6, + 24, 49, 10, 68, 22, 57, 40, 13, 52, 1, 30, 95, 16, 33, 4, 55, + 26, 47, 11, 74, 21, 59, 36, 8, 50, 3, 28, 99, 14, 45, 61, 2, + 18, 39, 7, 64, 23, 54, 9,127, 12, 31, 88, 5, 42, 17, 0, 63, + ]; + + #[rustfmt::skip] + let a_arr: [i8; 64] = [ + -93, -94, -95, -96, -97, -98, -99, -100, + -101, -102, -103, -104, -105, -106, -107, -108, + -109, -110, -111, -112, -113, -114, -115, -116, + -117, -118, -119, -120, -121, -122, -123, -124, + -125, -126, -127, -128, 127, 126, 125, 124, + 123, 122, 121, 120, 119, 118, 117, 116, + 115, 114, 113, 112, 111, 110, 109, 108, + 107, 106, 105, 104, 103, 102, 101, 100, + ]; + + let idx = transmute(idx_arr); + let a = transmute(a_arr); + let r = _mm512_permutexvar_epi8(idx, a); - let e = _mm512_set1_epi8(62); + + let e_arr = std::array::from_fn(|i| a_arr[(idx_arr[i] & 0b0011_1111) as usize]); + let e = transmute::<[i8; 64], _>(e_arr); + assert_eq_m512i(r, e); } @@ -789,13 +809,30 @@ mod tests { } #[simd_test(enable = "avx512vbmi,avx512vl")] - fn test_mm256_permutexvar_epi8() { - let idx = _mm256_set1_epi8(1); + unsafe fn test_mm256_permutexvar_epi8() { #[rustfmt::skip] - let a = _mm256_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); + let idx_arr: [u8; 32] = [ + 26, 47, 11, 42, 21, 59, 36, 8, + 18, 3, 28, 31, 14, 45, 29, 2, + 24, 17, 10, 30, 22, 25, 12, 13, + 20, 1, 6, 15, 16, 9, 0, 63, + ]; + + #[rustfmt::skip] + let a_arr: [i8; 32] = [ + -93, -94, -95, -96, -97, -98, -99, -100, + -101, -102, -103, -104, -105, -106, -107, -108, + -109, -110, -111, -112, -113, -114, -115, -116, + -117, -118, -119, -120, -121, -122, -123, -124, + ]; + + let idx = transmute(idx_arr); + let a = transmute(a_arr); let r = _mm256_permutexvar_epi8(idx, a); - let e = _mm256_set1_epi8(30); + + let e_arr = std::array::from_fn(|i| a_arr[(idx_arr[i] & 0b0001_1111) as usize]); + let e = transmute::<[i8; 32], _>(e_arr); + assert_eq_m256i(r, e); } @@ -826,11 +863,30 @@ mod tests { } #[simd_test(enable = "avx512vbmi,avx512vl")] - fn test_mm_permutexvar_epi8() { - let idx = _mm_set1_epi8(1); - let a = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + unsafe fn test_mm_permutexvar_epi8() { + #[rustfmt::skip] + let idx_arr: [u8; 16] = [ + 14, 3, 12, 7, + 8, 1, 10, 15, + 4, 9, 2, 13, + 6, 11, 0, 31, + ]; + + #[rustfmt::skip] + let a_arr: [i8; 16] = [ + -93, -94, -95, -96, + -97, -98, -99, -100, + -101, -102, -103, -104, + -105, -106, -107, -108, + ]; + + let idx = transmute(idx_arr); + let a = transmute(a_arr); let r = _mm_permutexvar_epi8(idx, a); - let e = _mm_set1_epi8(14); + + let e_arr = std::array::from_fn(|i| a_arr[(idx_arr[i] & 0b0000_1111) as usize]); + let e = transmute::<[i8; 16], _>(e_arr); + assert_eq_m128i(r, e); }