Improve coverage for half-float fallbacks
authorMatthias Clasen <mclasen@redhat.com>
Wed, 10 May 2023 03:02:30 +0000 (23:02 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 10 May 2023 03:02:30 +0000 (23:02 -0400)
testsuite/gsk/half-float.c

index 5f74072a84e6b29d7e5cab0cfdabb1b7724bacc5..3b06d7df2286ae3470221977619e29ee67bc9ed0 100644 (file)
@@ -32,6 +32,36 @@ test_constants (void)
     }
 }
 
+static void
+test_constants_c (void)
+{
+  struct {
+    float f;
+    guint16 h;
+  } tests[] = {
+    { 0.0, FP16_ZERO },
+    { 1.0, FP16_ONE },
+    { -1.0, FP16_MINUS_ONE },
+  };
+
+  for (int i = 0; i < G_N_ELEMENTS (tests); i++)
+    {
+      float f[4];
+      guint16 h[4];
+
+      memset (f, 0, sizeof (f));
+      f[0] = tests[i].f;
+      float_to_half4_c (f, h);
+      g_assert_cmpuint (h[0], ==, tests[i].h);
+
+
+      memset (h, 0, sizeof (h));
+      h[0] = tests[i].h;
+      half_to_float4_c (h, f);
+      g_assert_cmpfloat (f[0], ==, tests[i].f);
+    }
+}
+
 static float
 random_representable_float (void)
 {
@@ -69,6 +99,26 @@ test_roundtrip (void)
     }
 }
 
+static void
+test_roundtrip_c (void)
+{
+  for (int i = 0; i < 100; i++)
+    {
+      float f[4];
+      float f2[4];
+      guint16 h[4];
+
+      f2[0] = random_representable_float ();
+      memset (f, 0, sizeof (f));
+      f[0] = f2[0];
+
+      float_to_half4_c (f, h);
+      half_to_float4_c (h, f2);
+
+      g_assert_cmpfloat (f[0], ==, f2[0]);
+    }
+}
+
 /* Test that the array version work as expected,
  * in particular with unaligned boundaries.
  */
@@ -95,6 +145,29 @@ test_many (void)
     }
 }
 
+static void
+test_many_c (void)
+{
+  for (int i = 0; i < 100; i++)
+    {
+      int size = g_random_int_range (100, 200);
+      int offset = g_random_int_range (0, 20);
+
+      guint16 *h = g_new0 (guint16, size);
+      float *f = g_new0 (float, size);
+      float *f2 = g_new0 (float, size);
+
+      for (int j = offset; j < size; j++)
+        f[j] = random_representable_float ();
+
+      float_to_half_c (f + offset, h + offset, size - offset);
+      half_to_float_c (h + offset, f2 + offset, size - offset);
+
+      for (int j = offset; j < size; j++)
+        g_assert_cmpfloat (f[j], ==, f2[j]);
+    }
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -103,6 +176,9 @@ main (int argc, char *argv[])
   g_test_add_func ("/half-float/constants", test_constants);
   g_test_add_func ("/half-float/roundtrip", test_roundtrip);
   g_test_add_func ("/half-float/many", test_many);
+  g_test_add_func ("/half-float/constants/c", test_constants_c);
+  g_test_add_func ("/half-float/roundtrip/c", test_roundtrip_c);
+  g_test_add_func ("/half-float/many/c", test_many_c);
 
   return g_test_run ();
 }