11// SPDX-License-Identifier: Apache-2.0
22// ----------------------------------------------------------------------------
3- // Copyright 2020-2025 Arm Limited
3+ // Copyright 2020-2026 Arm Limited
44//
55// Licensed under the Apache License, Version 2.0 (the "License"); you may not
66// use this file except in compliance with the License. You may obtain a copy
1717
1818/* *
1919 * @brief Unit tests for the vectorized SIMD functionality.
20+ *
21+ * One of the implementation requirements for astcenc is to provide a platform
22+ * invariant results, so tests deliberately use EXPECT_EQ() for floating-point
23+ * functions that might more typically use EXPECT_NEAR(). If we change an
24+ * implementation of a function so it rounds differently, the tests may start
25+ * failing and the values in the test may need updating.
2026 */
2127
2228#include < limits>
@@ -145,19 +151,19 @@ TEST(SuiteVfloat, Atan)
145151{
146152 vfloat a0 (-0 .15f );
147153 vfloat r0 = atan (a0);
148- EXPECT_NEAR (r0.lane <0 >(), -0 .149061f , 0 . 005f );
154+ EXPECT_EQ (r0.lane <0 >(), -0 .149060920f );
149155
150156 vfloat a1 (0 .0f );
151157 vfloat r1 = atan (a1);
152- EXPECT_NEAR (r1.lane <0 >(), 0 .000000f , 0 . 005f );
158+ EXPECT_EQ (r1.lane <0 >(), 0 .000000000f );
153159
154160 vfloat a2 (0 .9f );
155161 vfloat r2 = atan (a2);
156- EXPECT_NEAR (r2.lane <0 >(), 0 .733616f , 0 . 005f );
162+ EXPECT_EQ (r2.lane <0 >(), 0 .733615935f );
157163
158164 vfloat a3 (2 .1f );
159165 vfloat r3 = atan (a3);
160- EXPECT_NEAR (r3.lane <0 >(), 1 .123040f , 0 . 005f );
166+ EXPECT_EQ (r3.lane <0 >(), 1 .123035190f );
161167}
162168
163169/* * @brief Test VLA atan2. */
@@ -166,22 +172,22 @@ TEST(SuiteVfloat, Atan2)
166172 vfloat a0 (-0 .15f );
167173 vfloat b0 ( 1 .15f );
168174 vfloat r0 = atan2 (a0, b0);
169- EXPECT_NEAR (r0.lane <0 >(), -0 .129816f , 0 . 005f );
175+ EXPECT_EQ (r0.lane <0 >(), -0 .129816383f );
170176
171177 vfloat a1 ( 0 .0f );
172178 vfloat b1 (-3 .0f );
173179 vfloat r1 = atan2 (a1, b1);
174- EXPECT_NEAR (r1.lane <0 >(), 3 .141592f , 0 . 005f );
180+ EXPECT_EQ (r1.lane <0 >(), 3 .141592740f );
175181
176182 vfloat a2 ( 0 .9f );
177183 vfloat b2 (-0 .9f );
178184 vfloat r2 = atan2 (a2, b2);
179- EXPECT_NEAR (r2.lane <0 >(), 2 .360342f , 0 . 005f );
185+ EXPECT_EQ (r2.lane <0 >(), 2 .360342740f );
180186
181187 vfloat a3 ( 2 .1f );
182188 vfloat b3 ( 1 .1f );
183189 vfloat r3 = atan2 (a3, b3);
184- EXPECT_NEAR (r3.lane <0 >(), 1 .084357f , 0 . 005f );
190+ EXPECT_EQ (r3.lane <0 >(), 1 .084357620f );
185191}
186192
187193#elif ASTCENC_SIMD_WIDTH == 4
@@ -207,10 +213,10 @@ TEST(SuiteVfloat, Atan)
207213 vfloat4 a (-0 .15f , 0 .0f , 0 .9f , 2 .1f );
208214 vfloat4 r = atan (a);
209215
210- EXPECT_NEAR (r.lane <0 >(), -0 .149061f , 0 . 005f );
211- EXPECT_NEAR (r.lane <1 >(), 0 .000000f , 0 . 005f );
212- EXPECT_NEAR (r.lane <2 >(), 0 .733616f , 0 . 005f );
213- EXPECT_NEAR (r.lane <3 >(), 1 .123040f , 0 . 005f );
216+ EXPECT_EQ (r.lane <0 >(), -0 .149060920f );
217+ EXPECT_EQ (r.lane <1 >(), 0 .000000000f );
218+ EXPECT_EQ (r.lane <2 >(), 0 .733615935f );
219+ EXPECT_EQ (r.lane <3 >(), 1 .123035190f );
214220}
215221
216222/* * @brief Test VLA atan2. */
@@ -220,10 +226,10 @@ TEST(SuiteVfloat, Atan2)
220226 vfloat4 b (1 .15f , -3 .0f , -0 .9f , 1 .1f );
221227 vfloat4 r = atan2 (a, b);
222228
223- EXPECT_NEAR (r.lane <0 >(), -0 .129816f , 0 . 005f );
224- EXPECT_NEAR (r.lane <1 >(), 3 .141592f , 0 . 005f );
225- EXPECT_NEAR (r.lane <2 >(), 2 .360342f , 0 . 005f );
226- EXPECT_NEAR (r.lane <3 >(), 1 .084357f , 0 . 005f );
229+ EXPECT_EQ (r.lane <0 >(), -0 .129816383f );
230+ EXPECT_EQ (r.lane <1 >(), 3 .141592740f );
231+ EXPECT_EQ (r.lane <2 >(), 2 .360342740f );
232+ EXPECT_EQ (r.lane <3 >(), 1 .084357620f );
227233}
228234
229235#elif ASTCENC_SIMD_WIDTH == 8
@@ -259,14 +265,14 @@ TEST(SuiteVfloat, Atan)
259265 alignas (32 ) float ra[8 ];
260266 storea (r, ra);
261267
262- EXPECT_NEAR (ra[0 ], -0 .149061f , 0 . 005f );
263- EXPECT_NEAR (ra[1 ], 0 .000000f , 0 . 005f );
264- EXPECT_NEAR (ra[2 ], 0 .733616f , 0 . 005f );
265- EXPECT_NEAR (ra[3 ], 1 .123040f , 0 . 005f );
266- EXPECT_NEAR (ra[4 ], -0 .149061f , 0 . 005f );
267- EXPECT_NEAR (ra[5 ], 0 .000000f , 0 . 005f );
268- EXPECT_NEAR (ra[6 ], 0 .733616f , 0 . 005f );
269- EXPECT_NEAR (ra[7 ], 1 .123040f , 0 . 005f );
268+ EXPECT_EQ (ra[0 ], -0 .149060920f );
269+ EXPECT_EQ (ra[1 ], 0 .000000000f );
270+ EXPECT_EQ (ra[2 ], 0 .733615935f );
271+ EXPECT_EQ (ra[3 ], 1 .123035190f );
272+ EXPECT_EQ (ra[4 ], -0 .149060920f );
273+ EXPECT_EQ (ra[5 ], 0 .000000000f );
274+ EXPECT_EQ (ra[6 ], 0 .733615935f );
275+ EXPECT_EQ (ra[7 ], 1 .123035190f );
270276}
271277
272278/* * @brief Test VLA atan2. */
@@ -279,14 +285,14 @@ TEST(SuiteVfloat, Atan2)
279285 alignas (32 ) float ra[8 ];
280286 storea (r, ra);
281287
282- EXPECT_NEAR (ra[0 ], -0 .129816f , 0 . 005f );
283- EXPECT_NEAR (ra[1 ], 3 .141592f , 0 . 005f );
284- EXPECT_NEAR (ra[2 ], 2 .360342f , 0 . 005f );
285- EXPECT_NEAR (ra[3 ], 1 .084357f , 0 . 005f );
286- EXPECT_NEAR (ra[4 ], -0 .129816f , 0 . 005f );
287- EXPECT_NEAR (ra[5 ], 3 .141592f , 0 . 005f );
288- EXPECT_NEAR (ra[6 ], 2 .360342f , 0 . 005f );
289- EXPECT_NEAR (ra[7 ], 1 .084357f , 0 . 005f );
288+ EXPECT_EQ (ra[0 ], -0 .129816383f );
289+ EXPECT_EQ (ra[1 ], 3 .141592740f );
290+ EXPECT_EQ (ra[2 ], 2 .360342740f );
291+ EXPECT_EQ (ra[3 ], 1 .084357620f );
292+ EXPECT_EQ (ra[4 ], -0 .129816383f );
293+ EXPECT_EQ (ra[5 ], 3 .141592740f );
294+ EXPECT_EQ (ra[6 ], 2 .360342740f );
295+ EXPECT_EQ (ra[7 ], 1 .084357620f );
290296}
291297
292298#endif
@@ -483,10 +489,10 @@ TEST(SuiteVfloat4, vselfadd1)
483489
484490 // Test increment by an expression
485491 a += b + b;
486- EXPECT_NEAR (a.lane <0 >(), 1 .0f + 0 . 3f , 0 . 001f );
487- EXPECT_NEAR (a.lane <1 >(), 2 .0f + 0 . 6f , 0 . 001f );
488- EXPECT_NEAR (a.lane <2 >(), 3 .0f + 0 . 9f , 0 . 001f );
489- EXPECT_NEAR (a.lane <3 >(), 4 . 0f + 1 . 2f , 0 . 001f );
492+ EXPECT_EQ (a.lane <0 >(), 1 .30000007f );
493+ EXPECT_EQ (a.lane <1 >(), 2 .60000014f );
494+ EXPECT_EQ (a.lane <2 >(), 3 .90000010f );
495+ EXPECT_EQ (a.lane <3 >(), 5 . 20000029f );
490496}
491497
492498/* * @brief Test vfloat4 sub. */
@@ -862,9 +868,9 @@ TEST(SuiteVfloat4, hmax_s)
862868TEST (SuiteVfloat4, hadd_s)
863869{
864870 vfloat4 a1 (1 .1f , 1 .5f , 1 .6f , 4 .0f );
865- float sum = 1 .1f + 1 .5f + 1 . 6f + 4 .0f ;
871+ float sum = ( 1 .1f + 1 .6f ) + ( 1 . 5f + 4 .0f ) ;
866872 float r = hadd_s (a1);
867- EXPECT_NEAR (r, sum, 0 . 005f );
873+ EXPECT_EQ (r, sum);
868874}
869875
870876/* * @brief Test vfloat4 hadd_rgb_s. */
@@ -873,7 +879,7 @@ TEST(SuiteVfloat4, hadd_rgb_s)
873879 vfloat4 a1 (1 .1f , 1 .5f , 1 .6f , 4 .0f );
874880 float sum = 1 .1f + 1 .5f + 1 .6f ;
875881 float r = hadd_rgb_s (a1);
876- EXPECT_NEAR (r, sum, 0 . 005f );
882+ EXPECT_EQ (r, sum);
877883}
878884
879885/* * @brief Test vfloat4 sqrt. */
@@ -1026,10 +1032,10 @@ TEST(SuiteVfloat4, normalize)
10261032{
10271033 vfloat4 a (1 .0f , 2 .0f , 3 .0f , 4 .0f );
10281034 vfloat4 r = normalize (a);
1029- EXPECT_NEAR (r.lane <0 >(), 1 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1030- EXPECT_NEAR (r.lane <1 >(), 2 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1031- EXPECT_NEAR (r.lane <2 >(), 3 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1032- EXPECT_NEAR (r.lane <3 >(), 4 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1035+ EXPECT_EQ (r.lane <0 >(), 1 .0f / astc::sqrt (30 .0f ));
1036+ EXPECT_EQ (r.lane <1 >(), 2 .0f / astc::sqrt (30 .0f ));
1037+ EXPECT_EQ (r.lane <2 >(), 3 .0f / astc::sqrt (30 .0f ));
1038+ EXPECT_EQ (r.lane <3 >(), 4 .0f / astc::sqrt (30 .0f ));
10331039}
10341040
10351041/* * @brief Test vfloat4 normalize_safe. */
@@ -1039,10 +1045,10 @@ TEST(SuiteVfloat4, normalize_safe)
10391045
10401046 vfloat4 a1 (1 .0f , 2 .0f , 3 .0f , 4 .0f );
10411047 vfloat4 r1 = normalize_safe (a1, s);
1042- EXPECT_NEAR (r1.lane <0 >(), 1 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1043- EXPECT_NEAR (r1.lane <1 >(), 2 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1044- EXPECT_NEAR (r1.lane <2 >(), 3 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1045- EXPECT_NEAR (r1.lane <3 >(), 4 .0f / astc::sqrt (30 .0f ), 0 . 0005f );
1048+ EXPECT_EQ (r1.lane <0 >(), 1 .0f / astc::sqrt (30 .0f ));
1049+ EXPECT_EQ (r1.lane <1 >(), 2 .0f / astc::sqrt (30 .0f ));
1050+ EXPECT_EQ (r1.lane <2 >(), 3 .0f / astc::sqrt (30 .0f ));
1051+ EXPECT_EQ (r1.lane <3 >(), 4 .0f / astc::sqrt (30 .0f ));
10461052
10471053 vfloat4 a2 (0 .0f , 0 .0f , 0 .0f , 0 .0f );
10481054 vfloat4 r2 = normalize_safe (a2, s);
@@ -2656,9 +2662,10 @@ TEST(SuiteVfloat8, hmax_s)
26562662TEST (SuiteVfloat8, hadd_s)
26572663{
26582664 vfloat8 a1 = vfloat8_lit (1 .1f , 1 .5f , 1 .6f , 4 .0f , 1 .1f , 1 .5f , 1 .6f , 4 .0f );
2659- float sum = 1 .1f + 1 .5f + 1 .6f + 4 .0f + 1 .1f + 1 .5f + 1 .6f + 4 .0f ;
2665+ float sum = ((1 .1f + 1 .6f ) + (1 .5f + 4 .0f )) +
2666+ ((1 .1f + 1 .6f ) + (1 .5f + 4 .0f ));
26602667 float r = hadd_s (a1);
2661- EXPECT_NEAR (r, sum, 0 . 005f );
2668+ EXPECT_EQ (r, sum);
26622669}
26632670
26642671/* * @brief Test vfloat8 sqrt. */
0 commit comments