pan/bit: Add 16-bit fmod tests
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 1 Apr 2020 20:45:55 +0000 (16:45 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 5 Apr 2020 23:26:04 +0000 (23:26 +0000)
These raise another set of issues -- indeed, not all of these tests are
passing, since it turns out I have an actual bug in the packing code. So
after all this work, test bringup has identified an actual issue :)

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4458>

src/panfrost/bifrost/test/bi_test_pack.c
src/panfrost/bifrost/test/bit.h

index 36e392602f5a3d86fd1cbd72db2c2e47f409773e..2755c0e879e8b0ec3586176d7fe5b3ce2f7daa9f 100644 (file)
@@ -167,7 +167,7 @@ bit_generate_vector(uint32_t *mem)
 /* Tests all 64 combinations of floating point modifiers for a given
  * instruction / floating-type / test type */
 
-void
+static void
 bit_fmod_helper(struct panfrost_device *dev,
                 enum bi_class c, unsigned size, bool fma,
                 uint32_t *input, enum bit_debug debug)
@@ -193,6 +193,10 @@ bit_fmod_helper(struct panfrost_device *dev,
                         ins.src_neg[0] = (inmod & 0x4);
                         ins.src_neg[1] = (inmod & 0x8);
 
+                        /* Skip over tests that cannot run on FMA */
+                        if (fma && (size == 16) && ins.src_abs[0] && ins.src_abs[1])
+                                continue;
+
                         if (!bit_test_single(dev, &ins, input, fma, debug)) {
                                 fprintf(stderr, "FAIL: fmod.%s%u.%s%s.%u\n",
                                                 bi_class_name(c),
@@ -204,3 +208,23 @@ bit_fmod_helper(struct panfrost_device *dev,
                 }
         }
 }
+
+void
+bit_fmod(struct panfrost_device *dev, enum bit_debug debug)
+{
+        float input32[4] = { 0.8, 1.7, 0.0, 0.0 };
+
+        uint32_t input16[4] = {
+                _mesa_float_to_half(input32[0]) | (_mesa_float_to_half(-1.2) << 16),
+                _mesa_float_to_half(input32[1]) | (_mesa_float_to_half(0.9) << 16),
+                0, 0
+        };
+
+        for (unsigned sz = 16; sz <= 32; sz *= 2) {
+                uint32_t *input =
+                        (sz == 16) ? input16 :
+                        (uint32_t *) input32;
+
+                bit_fmod_helper(dev, BI_ADD, sz, true, input, debug);
+        }
+}
index 5f01b345f0c7f0c96544ebe71083504f77024ea9..8e6279cbc7230f8a16901e1123cabfb558bc35cf 100644 (file)
@@ -70,9 +70,7 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA);
 /* Packing tests */
 
 void
-bit_fmod_helper(struct panfrost_device *dev,
-                enum bi_class c, unsigned size, bool fma,
-                uint32_t *input, enum bit_debug debug);
+bit_fmod(struct panfrost_device *dev, enum bit_debug debug);
 
 #endif