9
9
#define FALSE 0
10
10
11
11
// Not used below, but helpful for debugging.
12
- void print_f16x8 (v128_t v1 ) {
12
+ void print_f16x8 (v128_t v ) {
13
13
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 ));
22
44
}
23
45
24
46
void assert_lanes_eq_uint16 (v128_t v ,
@@ -40,6 +62,25 @@ void assert_lanes_eq_uint16(v128_t v,
40
62
assert (wasm_u16x8_extract_lane (v , 7 ) == l7 );
41
63
}
42
64
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
+
43
84
void assert_lanes_eq_float (v128_t v ,
44
85
float l0 ,
45
86
float l1 ,
@@ -96,6 +137,46 @@ v128_t create_f16x8(float l0,
96
137
return v ;
97
138
}
98
139
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
+
99
180
int main () {
100
181
v128_t a , b , c ;
101
182
a = wasm_f16x8_splat (2.0f );
@@ -207,4 +288,18 @@ int main() {
207
288
create_f16x8 ( 1e4 , INFINITY , -1.0f , 0.0f , 1.0f , 1.5f , 4.0f , 1.0f ),
208
289
create_f16x8 (INFINITY , INFINITY , -1.0f , 0.0f , 1.0f , 2.0f , 1.0f , -1.0f ));
209
290
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 );
210
305
}
0 commit comments