77use std:: intrinsics:: simd:: { simd_saturating_add, simd_saturating_sub} ;
88
99#[ repr( simd) ]
10- #[ derive( Copy , Clone , PartialEq , Debug ) ]
10+ #[ derive( Copy , Clone ) ]
1111struct u32x4 ( pub [ u32 ; 4 ] ) ;
12+ impl u32x4 {
13+ fn to_array ( self ) -> [ u32 ; 4 ] { unsafe { std:: mem:: transmute ( self ) } }
14+ }
1215
1316#[ repr( simd) ]
1417#[ derive( Copy , Clone ) ]
1518struct I32 < const N : usize > ( [ i32 ; N ] ) ;
19+ impl < const N : usize > I32 < N > {
20+ fn to_array ( self ) -> [ i32 ; N ] { unsafe { std:: intrinsics:: transmute_unchecked ( self ) } }
21+ }
22+
23+ macro_rules! all_eq {
24+ ( $a: expr, $b: expr) => { {
25+ let a = $a;
26+ let b = $b;
27+ assert_eq!( a. to_array( ) , b. to_array( ) ) ;
28+ } } ;
29+ }
1630
1731fn main ( ) {
1832 // unsigned
@@ -26,20 +40,20 @@ fn main() {
2640 let z = u32x4 ( [ 0 , 0 , 0 , 0 ] ) ;
2741
2842 unsafe {
29- assert_eq ! ( simd_saturating_add( z, z) , z) ;
30- assert_eq ! ( simd_saturating_add( z, a) , a) ;
31- assert_eq ! ( simd_saturating_add( b, z) , b) ;
32- assert_eq ! ( simd_saturating_add( a, a) , b) ;
33- assert_eq ! ( simd_saturating_add( a, m) , m) ;
34- assert_eq ! ( simd_saturating_add( m, b) , m) ;
35- assert_eq ! ( simd_saturating_add( m1, a) , m) ;
43+ all_eq ! ( simd_saturating_add( z, z) , z) ;
44+ all_eq ! ( simd_saturating_add( z, a) , a) ;
45+ all_eq ! ( simd_saturating_add( b, z) , b) ;
46+ all_eq ! ( simd_saturating_add( a, a) , b) ;
47+ all_eq ! ( simd_saturating_add( a, m) , m) ;
48+ all_eq ! ( simd_saturating_add( m, b) , m) ;
49+ all_eq ! ( simd_saturating_add( m1, a) , m) ;
3650
37- assert_eq ! ( simd_saturating_sub( b, z) , b) ;
38- assert_eq ! ( simd_saturating_sub( b, a) , a) ;
39- assert_eq ! ( simd_saturating_sub( a, a) , z) ;
40- assert_eq ! ( simd_saturating_sub( a, b) , z) ;
41- assert_eq ! ( simd_saturating_sub( a, m1) , z) ;
42- assert_eq ! ( simd_saturating_sub( b, m1) , z) ;
51+ all_eq ! ( simd_saturating_sub( b, z) , b) ;
52+ all_eq ! ( simd_saturating_sub( b, a) , a) ;
53+ all_eq ! ( simd_saturating_sub( a, a) , z) ;
54+ all_eq ! ( simd_saturating_sub( a, b) , z) ;
55+ all_eq ! ( simd_saturating_sub( a, m1) , z) ;
56+ all_eq ! ( simd_saturating_sub( b, m1) , z) ;
4357 }
4458 }
4559
@@ -61,28 +75,28 @@ fn main() {
6175 let z = I32 :: < 4 > ( [ 0 , 0 , 0 , 0 ] ) ;
6276
6377 unsafe {
64- assert_eq ! ( simd_saturating_add( z, z) . 0 , z. 0 ) ;
65- assert_eq ! ( simd_saturating_add( z, a) . 0 , a. 0 ) ;
66- assert_eq ! ( simd_saturating_add( b, z) . 0 , b. 0 ) ;
67- assert_eq ! ( simd_saturating_add( a, a) . 0 , b. 0 ) ;
68- assert_eq ! ( simd_saturating_add( a, max) . 0 , max. 0 ) ;
69- assert_eq ! ( simd_saturating_add( max, b) . 0 , max. 0 ) ;
70- assert_eq ! ( simd_saturating_add( max1, a) . 0 , max. 0 ) ;
71- assert_eq ! ( simd_saturating_add( min1, z) . 0 , min1. 0 ) ;
72- assert_eq ! ( simd_saturating_add( min, z) . 0 , min. 0 ) ;
73- assert_eq ! ( simd_saturating_add( min1, c) . 0 , min. 0 ) ;
74- assert_eq ! ( simd_saturating_add( min, c) . 0 , min. 0 ) ;
75- assert_eq ! ( simd_saturating_add( min1, d) . 0 , min. 0 ) ;
76- assert_eq ! ( simd_saturating_add( min, d) . 0 , min. 0 ) ;
78+ all_eq ! ( simd_saturating_add( z, z) , z) ;
79+ all_eq ! ( simd_saturating_add( z, a) , a) ;
80+ all_eq ! ( simd_saturating_add( b, z) , b) ;
81+ all_eq ! ( simd_saturating_add( a, a) , b) ;
82+ all_eq ! ( simd_saturating_add( a, max) , max) ;
83+ all_eq ! ( simd_saturating_add( max, b) , max) ;
84+ all_eq ! ( simd_saturating_add( max1, a) , max) ;
85+ all_eq ! ( simd_saturating_add( min1, z) , min1) ;
86+ all_eq ! ( simd_saturating_add( min, z) , min) ;
87+ all_eq ! ( simd_saturating_add( min1, c) , min) ;
88+ all_eq ! ( simd_saturating_add( min, c) , min) ;
89+ all_eq ! ( simd_saturating_add( min1, d) , min) ;
90+ all_eq ! ( simd_saturating_add( min, d) , min) ;
7791
78- assert_eq ! ( simd_saturating_sub( b, z) . 0 , b. 0 ) ;
79- assert_eq ! ( simd_saturating_sub( b, a) . 0 , a. 0 ) ;
80- assert_eq ! ( simd_saturating_sub( a, a) . 0 , z. 0 ) ;
81- assert_eq ! ( simd_saturating_sub( a, b) . 0 , c. 0 ) ;
82- assert_eq ! ( simd_saturating_sub( z, max) . 0 , min1. 0 ) ;
83- assert_eq ! ( simd_saturating_sub( min1, z) . 0 , min1. 0 ) ;
84- assert_eq ! ( simd_saturating_sub( min1, a) . 0 , min. 0 ) ;
85- assert_eq ! ( simd_saturating_sub( min1, b) . 0 , min. 0 ) ;
92+ all_eq ! ( simd_saturating_sub( b, z) , b) ;
93+ all_eq ! ( simd_saturating_sub( b, a) , a) ;
94+ all_eq ! ( simd_saturating_sub( a, a) , z) ;
95+ all_eq ! ( simd_saturating_sub( a, b) , c) ;
96+ all_eq ! ( simd_saturating_sub( z, max) , min1) ;
97+ all_eq ! ( simd_saturating_sub( min1, z) , min1) ;
98+ all_eq ! ( simd_saturating_sub( min1, a) , min) ;
99+ all_eq ! ( simd_saturating_sub( min1, b) , min) ;
86100 }
87101 }
88102}
0 commit comments