@@ -426,6 +426,22 @@ mod tests {
426
426
let expected = _mm_setr_epi16 ( 3 , 7 , 11 , 15 , 132 , 7 , 36 , 25 ) ;
427
427
let r = _mm_hadd_epi16 ( a, b) ;
428
428
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) ;
429
445
}
430
446
431
447
#[ simd_test( enable = "ssse3" ) ]
@@ -435,6 +451,22 @@ mod tests {
435
451
let expected = _mm_setr_epi16 ( 3 , 7 , 11 , 15 , 132 , 7 , 32767 , -32768 ) ;
436
452
let r = _mm_hadds_epi16 ( a, b) ;
437
453
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) ;
438
470
}
439
471
440
472
#[ simd_test( enable = "ssse3" ) ]
@@ -444,6 +476,13 @@ mod tests {
444
476
let expected = _mm_setr_epi32 ( 3 , 7 , 132 , 7 ) ;
445
477
let r = _mm_hadd_epi32 ( a, b) ;
446
478
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) ;
447
486
}
448
487
449
488
#[ simd_test( enable = "ssse3" ) ]
@@ -453,6 +492,22 @@ mod tests {
453
492
let expected = _mm_setr_epi16 ( -1 , -1 , -1 , -1 , -124 , 1 , 12 , -13 ) ;
454
493
let r = _mm_hsub_epi16 ( a, b) ;
455
494
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) ;
456
511
}
457
512
458
513
#[ simd_test( enable = "ssse3" ) ]
@@ -462,6 +517,22 @@ mod tests {
462
517
let expected = _mm_setr_epi16 ( -1 , -1 , -1 , -1 , -124 , 1 , 32767 , -32768 ) ;
463
518
let r = _mm_hsubs_epi16 ( a, b) ;
464
519
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) ;
465
536
}
466
537
467
538
#[ simd_test( enable = "ssse3" ) ]
@@ -471,6 +542,13 @@ mod tests {
471
542
let expected = _mm_setr_epi32 ( -1 , -1 , -124 , 1 ) ;
472
543
let r = _mm_hsub_epi32 ( a, b) ;
473
544
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) ;
474
552
}
475
553
476
554
#[ simd_test( enable = "ssse3" ) ]
0 commit comments