99#define FALSE 0
1010
1111// Not used below, but helpful for debugging.
12- void print_f16x8 (v128_t v1 ) {
12+ void print_f16x8 (v128_t v ) {
1313 printf ("[%g, %g, %g, %g, %g, %g, %g, %g]\n" ,
14- wasm_f16x8_extract_lane (v1 , 0 ),
15- wasm_f16x8_extract_lane (v1 , 1 ),
16- wasm_f16x8_extract_lane (v1 , 2 ),
17- wasm_f16x8_extract_lane (v1 , 3 ),
18- wasm_f16x8_extract_lane (v1 , 4 ),
19- wasm_f16x8_extract_lane (v1 , 5 ),
20- wasm_f16x8_extract_lane (v1 , 6 ),
21- wasm_f16x8_extract_lane (v1 , 7 ));
14+ wasm_f16x8_extract_lane (v , 0 ),
15+ wasm_f16x8_extract_lane (v , 1 ),
16+ wasm_f16x8_extract_lane (v , 2 ),
17+ wasm_f16x8_extract_lane (v , 3 ),
18+ wasm_f16x8_extract_lane (v , 4 ),
19+ wasm_f16x8_extract_lane (v , 5 ),
20+ wasm_f16x8_extract_lane (v , 6 ),
21+ wasm_f16x8_extract_lane (v , 7 ));
22+ }
23+ void print_i16x8 (v128_t v ) {
24+ printf ("[%d, %d, %d, %d, %d, %d, %d, %d]\n" ,
25+ wasm_i16x8_extract_lane (v , 0 ),
26+ wasm_i16x8_extract_lane (v , 1 ),
27+ wasm_i16x8_extract_lane (v , 2 ),
28+ wasm_i16x8_extract_lane (v , 3 ),
29+ wasm_i16x8_extract_lane (v , 4 ),
30+ wasm_i16x8_extract_lane (v , 5 ),
31+ wasm_i16x8_extract_lane (v , 6 ),
32+ wasm_i16x8_extract_lane (v , 7 ));
33+ }
34+ void print_u16x8 (v128_t v ) {
35+ printf ("[%d, %d, %d, %d, %d, %d, %d, %d]\n" ,
36+ wasm_u16x8_extract_lane (v , 0 ),
37+ wasm_u16x8_extract_lane (v , 1 ),
38+ wasm_u16x8_extract_lane (v , 2 ),
39+ wasm_u16x8_extract_lane (v , 3 ),
40+ wasm_u16x8_extract_lane (v , 4 ),
41+ wasm_u16x8_extract_lane (v , 5 ),
42+ wasm_u16x8_extract_lane (v , 6 ),
43+ wasm_u16x8_extract_lane (v , 7 ));
2244}
2345
2446void assert_lanes_eq_uint16 (v128_t v ,
@@ -40,6 +62,25 @@ void assert_lanes_eq_uint16(v128_t v,
4062 assert (wasm_u16x8_extract_lane (v , 7 ) == l7 );
4163}
4264
65+ void assert_lanes_eq_int16 (v128_t v ,
66+ int16_t l0 ,
67+ int16_t l1 ,
68+ int16_t l2 ,
69+ int16_t l3 ,
70+ int16_t l4 ,
71+ int16_t l5 ,
72+ int16_t l6 ,
73+ int16_t l7 ) {
74+ assert (wasm_i16x8_extract_lane (v , 0 ) == l0 );
75+ assert (wasm_i16x8_extract_lane (v , 1 ) == l1 );
76+ assert (wasm_i16x8_extract_lane (v , 2 ) == l2 );
77+ assert (wasm_i16x8_extract_lane (v , 3 ) == l3 );
78+ assert (wasm_i16x8_extract_lane (v , 4 ) == l4 );
79+ assert (wasm_i16x8_extract_lane (v , 5 ) == l5 );
80+ assert (wasm_i16x8_extract_lane (v , 6 ) == l6 );
81+ assert (wasm_i16x8_extract_lane (v , 7 ) == l7 );
82+ }
83+
4384void assert_lanes_eq_float (v128_t v ,
4485 float l0 ,
4586 float l1 ,
@@ -96,6 +137,46 @@ v128_t create_f16x8(float l0,
96137 return v ;
97138}
98139
140+ v128_t create_i16x8 (int16_t l0 ,
141+ int16_t l1 ,
142+ int16_t l2 ,
143+ int16_t l3 ,
144+ int16_t l4 ,
145+ int16_t l5 ,
146+ int16_t l6 ,
147+ int16_t l7 ) {
148+ v128_t v ;
149+ v = wasm_i16x8_replace_lane (v , 0 , l0 );
150+ v = wasm_i16x8_replace_lane (v , 1 , l1 );
151+ v = wasm_i16x8_replace_lane (v , 2 , l2 );
152+ v = wasm_i16x8_replace_lane (v , 3 , l3 );
153+ v = wasm_i16x8_replace_lane (v , 4 , l4 );
154+ v = wasm_i16x8_replace_lane (v , 5 , l5 );
155+ v = wasm_i16x8_replace_lane (v , 6 , l6 );
156+ v = wasm_i16x8_replace_lane (v , 7 , l7 );
157+ return v ;
158+ }
159+
160+ v128_t create_u16x8 (uint16_t l0 ,
161+ uint16_t l1 ,
162+ uint16_t l2 ,
163+ uint16_t l3 ,
164+ uint16_t l4 ,
165+ uint16_t l5 ,
166+ uint16_t l6 ,
167+ uint16_t l7 ) {
168+ v128_t v ;
169+ v = wasm_u16x8_replace_lane (v , 0 , l0 );
170+ v = wasm_u16x8_replace_lane (v , 1 , l1 );
171+ v = wasm_u16x8_replace_lane (v , 2 , l2 );
172+ v = wasm_u16x8_replace_lane (v , 3 , l3 );
173+ v = wasm_u16x8_replace_lane (v , 4 , l4 );
174+ v = wasm_u16x8_replace_lane (v , 5 , l5 );
175+ v = wasm_u16x8_replace_lane (v , 6 , l6 );
176+ v = wasm_u16x8_replace_lane (v , 7 , l7 );
177+ return v ;
178+ }
179+
99180int main () {
100181 v128_t a , b , c ;
101182 a = wasm_f16x8_splat (2.0f );
@@ -207,4 +288,18 @@ int main() {
207288 create_f16x8 ( 1e4 , INFINITY , -1.0f , 0.0f , 1.0f , 1.5f , 4.0f , 1.0f ),
208289 create_f16x8 (INFINITY , INFINITY , -1.0f , 0.0f , 1.0f , 2.0f , 1.0f , -1.0f ));
209290 assert_lanes_eq_float (a , INFINITY , INFINITY , -2.0f , 0.0f , 0.0f , -0.25f , 9.0f , -2.0f );
291+
292+ a = wasm_i16x8_trunc_sat_f16x8 (create_f16x8 (42.0f , -42.0f , NAN , INFINITY , - INFINITY , 65504.0f , -65504.0f , 0 ));
293+ assert_lanes_eq_int16 (a , 42 , -42 , 0 , 32767 , -32768 , 32767 , -32768 , 0 );
294+
295+ a = wasm_u16x8_trunc_sat_f16x8 (create_f16x8 (42.0f , -42.0f , NAN , INFINITY , - INFINITY , 65504.0f , -65504.0f , 0 ));
296+ assert_lanes_eq_uint16 (a , 42 , 0 , 0 , 65535 , 0 , 65504 , 0 , 0 );
297+
298+ // One confusing one below is 32767 which cannot be represented in FP16, so it becomes 32768.
299+ a = wasm_f16x8_convert_i16x8 (create_i16x8 (0 , 1 , -1 , 32767 , -32768 , 0 , 0 , 0 ));
300+ assert_lanes_eq_float (a , 0 , 1.0f , -1.0f , 32768.0f , -32768 , 0 , 0 , 0 );
301+
302+ // Another tricky one below is 65535, FP16 can't represent the max of uint16 so it becomes INFINITY.
303+ a = wasm_f16x8_convert_u16x8 (create_u16x8 (0 , 1 , 65535 , 65504U , 0 , 0 , 0 , 0 ));
304+ assert_lanes_eq_float (a , 0 , 1.0f , INFINITY , 65504.0f , 0 , 0 , 0 , 0 );
210305}
0 commit comments