Skip to content

Commit e6027c2

Browse files
eduardosmAmanieu
authored andcommitted
Extend SSSE3 hadd/hsub tests to check overflow behavior (wrapping or saturating)
1 parent 30dea92 commit e6027c2

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

crates/core_arch/src/x86/ssse3.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,22 @@ mod tests {
426426
let expected = _mm_setr_epi16(3, 7, 11, 15, 132, 7, 36, 25);
427427
let r = _mm_hadd_epi16(a, b);
428428
assert_eq_m128i(r, expected);
429+
430+
// Test wrapping on overflow
431+
let a = _mm_setr_epi16(i16::MAX, 1, i16::MAX, 2, i16::MAX, 3, i16::MAX, 4);
432+
let b = _mm_setr_epi16(i16::MIN, -1, i16::MIN, -2, i16::MIN, -3, i16::MIN, -4);
433+
let expected = _mm_setr_epi16(
434+
i16::MIN,
435+
i16::MIN + 1,
436+
i16::MIN + 2,
437+
i16::MIN + 3,
438+
i16::MAX,
439+
i16::MAX - 1,
440+
i16::MAX - 2,
441+
i16::MAX - 3,
442+
);
443+
let r = _mm_hadd_epi16(a, b);
444+
assert_eq_m128i(r, expected);
429445
}
430446

431447
#[simd_test(enable = "ssse3")]
@@ -435,6 +451,22 @@ mod tests {
435451
let expected = _mm_setr_epi16(3, 7, 11, 15, 132, 7, 32767, -32768);
436452
let r = _mm_hadds_epi16(a, b);
437453
assert_eq_m128i(r, expected);
454+
455+
// Test saturating on overflow
456+
let a = _mm_setr_epi16(i16::MAX, 1, i16::MAX, 2, i16::MAX, 3, i16::MAX, 4);
457+
let b = _mm_setr_epi16(i16::MIN, -1, i16::MIN, -2, i16::MIN, -3, i16::MIN, -4);
458+
let expected = _mm_setr_epi16(
459+
i16::MAX,
460+
i16::MAX,
461+
i16::MAX,
462+
i16::MAX,
463+
i16::MIN,
464+
i16::MIN,
465+
i16::MIN,
466+
i16::MIN,
467+
);
468+
let r = _mm_hadds_epi16(a, b);
469+
assert_eq_m128i(r, expected);
438470
}
439471

440472
#[simd_test(enable = "ssse3")]
@@ -444,6 +476,13 @@ mod tests {
444476
let expected = _mm_setr_epi32(3, 7, 132, 7);
445477
let r = _mm_hadd_epi32(a, b);
446478
assert_eq_m128i(r, expected);
479+
480+
// Test wrapping on overflow
481+
let a = _mm_setr_epi32(i32::MAX, 1, i32::MAX, 2);
482+
let b = _mm_setr_epi32(i32::MIN, -1, i32::MIN, -2);
483+
let expected = _mm_setr_epi32(i32::MIN, i32::MIN + 1, i32::MAX, i32::MAX - 1);
484+
let r = _mm_hadd_epi32(a, b);
485+
assert_eq_m128i(r, expected);
447486
}
448487

449488
#[simd_test(enable = "ssse3")]
@@ -453,6 +492,22 @@ mod tests {
453492
let expected = _mm_setr_epi16(-1, -1, -1, -1, -124, 1, 12, -13);
454493
let r = _mm_hsub_epi16(a, b);
455494
assert_eq_m128i(r, expected);
495+
496+
// Test wrapping on overflow
497+
let a = _mm_setr_epi16(i16::MAX, -1, i16::MAX, -2, i16::MAX, -3, i16::MAX, -4);
498+
let b = _mm_setr_epi16(i16::MIN, 1, i16::MIN, 2, i16::MIN, 3, i16::MIN, 4);
499+
let expected = _mm_setr_epi16(
500+
i16::MIN,
501+
i16::MIN + 1,
502+
i16::MIN + 2,
503+
i16::MIN + 3,
504+
i16::MAX,
505+
i16::MAX - 1,
506+
i16::MAX - 2,
507+
i16::MAX - 3,
508+
);
509+
let r = _mm_hsub_epi16(a, b);
510+
assert_eq_m128i(r, expected);
456511
}
457512

458513
#[simd_test(enable = "ssse3")]
@@ -462,6 +517,22 @@ mod tests {
462517
let expected = _mm_setr_epi16(-1, -1, -1, -1, -124, 1, 32767, -32768);
463518
let r = _mm_hsubs_epi16(a, b);
464519
assert_eq_m128i(r, expected);
520+
521+
// Test saturating on overflow
522+
let a = _mm_setr_epi16(i16::MAX, -1, i16::MAX, -2, i16::MAX, -3, i16::MAX, -4);
523+
let b = _mm_setr_epi16(i16::MIN, 1, i16::MIN, 2, i16::MIN, 3, i16::MIN, 4);
524+
let expected = _mm_setr_epi16(
525+
i16::MAX,
526+
i16::MAX,
527+
i16::MAX,
528+
i16::MAX,
529+
i16::MIN,
530+
i16::MIN,
531+
i16::MIN,
532+
i16::MIN,
533+
);
534+
let r = _mm_hsubs_epi16(a, b);
535+
assert_eq_m128i(r, expected);
465536
}
466537

467538
#[simd_test(enable = "ssse3")]
@@ -471,6 +542,13 @@ mod tests {
471542
let expected = _mm_setr_epi32(-1, -1, -124, 1);
472543
let r = _mm_hsub_epi32(a, b);
473544
assert_eq_m128i(r, expected);
545+
546+
// Test wrapping on overflow
547+
let a = _mm_setr_epi32(i32::MAX, -1, i32::MAX, -2);
548+
let b = _mm_setr_epi32(i32::MIN, 1, i32::MIN, 2);
549+
let expected = _mm_setr_epi32(i32::MIN, i32::MIN + 1, i32::MAX, i32::MAX - 1);
550+
let r = _mm_hsub_epi32(a, b);
551+
assert_eq_m128i(r, expected);
474552
}
475553

476554
#[simd_test(enable = "ssse3")]

0 commit comments

Comments
 (0)