From c07535ca79899bee12ac4299d13bab1e7a6b56f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20S=C3=A1nchez=20Mu=C3=B1oz?= Date: Mon, 16 Oct 2023 18:52:17 +0200 Subject: [PATCH] Extend SSSE3 hadd/hsub tests to check overflow behavior (wrapping or saturating) --- .../stdarch/crates/core_arch/src/x86/ssse3.rs | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/library/stdarch/crates/core_arch/src/x86/ssse3.rs b/library/stdarch/crates/core_arch/src/x86/ssse3.rs index 3bd39b6fb104..bd6944a3759e 100644 --- a/library/stdarch/crates/core_arch/src/x86/ssse3.rs +++ b/library/stdarch/crates/core_arch/src/x86/ssse3.rs @@ -426,6 +426,22 @@ mod tests { let expected = _mm_setr_epi16(3, 7, 11, 15, 132, 7, 36, 25); let r = _mm_hadd_epi16(a, b); assert_eq_m128i(r, expected); + + // Test wrapping on overflow + let a = _mm_setr_epi16(i16::MAX, 1, i16::MAX, 2, i16::MAX, 3, i16::MAX, 4); + let b = _mm_setr_epi16(i16::MIN, -1, i16::MIN, -2, i16::MIN, -3, i16::MIN, -4); + let expected = _mm_setr_epi16( + i16::MIN, + i16::MIN + 1, + i16::MIN + 2, + i16::MIN + 3, + i16::MAX, + i16::MAX - 1, + i16::MAX - 2, + i16::MAX - 3, + ); + let r = _mm_hadd_epi16(a, b); + assert_eq_m128i(r, expected); } #[simd_test(enable = "ssse3")] @@ -435,6 +451,22 @@ mod tests { let expected = _mm_setr_epi16(3, 7, 11, 15, 132, 7, 32767, -32768); let r = _mm_hadds_epi16(a, b); assert_eq_m128i(r, expected); + + // Test saturating on overflow + let a = _mm_setr_epi16(i16::MAX, 1, i16::MAX, 2, i16::MAX, 3, i16::MAX, 4); + let b = _mm_setr_epi16(i16::MIN, -1, i16::MIN, -2, i16::MIN, -3, i16::MIN, -4); + let expected = _mm_setr_epi16( + i16::MAX, + i16::MAX, + i16::MAX, + i16::MAX, + i16::MIN, + i16::MIN, + i16::MIN, + i16::MIN, + ); + let r = _mm_hadds_epi16(a, b); + assert_eq_m128i(r, expected); } #[simd_test(enable = "ssse3")] @@ -444,6 +476,13 @@ mod tests { let expected = _mm_setr_epi32(3, 7, 132, 7); let r = _mm_hadd_epi32(a, b); assert_eq_m128i(r, expected); + + // Test wrapping on overflow + let a = _mm_setr_epi32(i32::MAX, 1, i32::MAX, 2); + let b = _mm_setr_epi32(i32::MIN, -1, i32::MIN, -2); + let expected = _mm_setr_epi32(i32::MIN, i32::MIN + 1, i32::MAX, i32::MAX - 1); + let r = _mm_hadd_epi32(a, b); + assert_eq_m128i(r, expected); } #[simd_test(enable = "ssse3")] @@ -453,6 +492,22 @@ mod tests { let expected = _mm_setr_epi16(-1, -1, -1, -1, -124, 1, 12, -13); let r = _mm_hsub_epi16(a, b); assert_eq_m128i(r, expected); + + // Test wrapping on overflow + let a = _mm_setr_epi16(i16::MAX, -1, i16::MAX, -2, i16::MAX, -3, i16::MAX, -4); + let b = _mm_setr_epi16(i16::MIN, 1, i16::MIN, 2, i16::MIN, 3, i16::MIN, 4); + let expected = _mm_setr_epi16( + i16::MIN, + i16::MIN + 1, + i16::MIN + 2, + i16::MIN + 3, + i16::MAX, + i16::MAX - 1, + i16::MAX - 2, + i16::MAX - 3, + ); + let r = _mm_hsub_epi16(a, b); + assert_eq_m128i(r, expected); } #[simd_test(enable = "ssse3")] @@ -462,6 +517,22 @@ mod tests { let expected = _mm_setr_epi16(-1, -1, -1, -1, -124, 1, 32767, -32768); let r = _mm_hsubs_epi16(a, b); assert_eq_m128i(r, expected); + + // Test saturating on overflow + let a = _mm_setr_epi16(i16::MAX, -1, i16::MAX, -2, i16::MAX, -3, i16::MAX, -4); + let b = _mm_setr_epi16(i16::MIN, 1, i16::MIN, 2, i16::MIN, 3, i16::MIN, 4); + let expected = _mm_setr_epi16( + i16::MAX, + i16::MAX, + i16::MAX, + i16::MAX, + i16::MIN, + i16::MIN, + i16::MIN, + i16::MIN, + ); + let r = _mm_hsubs_epi16(a, b); + assert_eq_m128i(r, expected); } #[simd_test(enable = "ssse3")] @@ -471,6 +542,13 @@ mod tests { let expected = _mm_setr_epi32(-1, -1, -124, 1); let r = _mm_hsub_epi32(a, b); assert_eq_m128i(r, expected); + + // Test wrapping on overflow + let a = _mm_setr_epi32(i32::MAX, -1, i32::MAX, -2); + let b = _mm_setr_epi32(i32::MIN, 1, i32::MIN, 2); + let expected = _mm_setr_epi32(i32::MIN, i32::MIN + 1, i32::MAX, i32::MAX - 1); + let r = _mm_hsub_epi32(a, b); + assert_eq_m128i(r, expected); } #[simd_test(enable = "ssse3")]