Skip to content

Commit aa5778e

Browse files
authored
[FP16] Add end to end tests for conversion instructions. (#22679)
1 parent dd47be4 commit aa5778e

File tree

1 file changed

+104
-9
lines changed

1 file changed

+104
-9
lines changed

test/test_fp16.c

Lines changed: 104 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,38 @@
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

2446
void 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+
4384
void 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+
99180
int 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

Comments
 (0)