Extend SSSE3 hadd/hsub tests to check overflow behavior (wrapping or saturating)

This commit is contained in:
Eduardo Sánchez Muñoz 2023-10-16 18:52:17 +02:00 committed by Amanieu d'Antras
parent 0d09b65521
commit c07535ca79

View File

@ -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")]