pan/bit: Add special unit test
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 6 Apr 2020 13:51:56 +0000 (09:51 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 6 Apr 2020 19:41:56 +0000 (19:41 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4470>

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

index 70c8c9a88defbb64763a00e19d28d77be245e238..0b3af8a00c95efdcb33e63184dea2e7a398e3e7d 100644 (file)
@@ -251,7 +251,7 @@ bi_bitwise_op_name(enum bi_bitwise_op op)
         }
 }
 
-static const char *
+const char *
 bi_special_op_name(enum bi_special_op op)
 {
         switch (op) {
index 13ac48bd46f2418107bba180afa1379d68783c84..07632c9ab54c097c23a726025e46e4c2d2e6e71f 100644 (file)
@@ -40,6 +40,7 @@ const char * bi_interp_mode_name(enum bifrost_interp_mode mode);
 const char * bi_ldst_type_name(enum bifrost_ldst_type type);
 const char * bi_class_name(enum bi_class cl);
 const char * bi_cond_name(enum bi_cond cond);
+const char * bi_special_op_name(enum bi_special_op op);
 
 void bi_print_instruction(bi_instruction *ins, FILE *fp);
 void bi_print_bundle(bi_bundle *bundle, FILE *fp);
index e640a898f769d0745c6ba87cda2dc322a8055d74..095437b89fd4f15440583c2a0456fb43710bbb7b 100644 (file)
@@ -131,6 +131,7 @@ tests(void)
         bit_fmod(dev, BIT_DEBUG_FAIL);
         bit_fma(dev, BIT_DEBUG_FAIL);
         bit_csel(dev, BIT_DEBUG_FAIL);
+        bit_special(dev, BIT_DEBUG_FAIL);
 }
 
 static void
index 498502731c38bca08f58fc8b323acdbba49ea1d6..34e2a5cc29f998412ac687102c98bb8212154fcb 100644 (file)
@@ -259,6 +259,25 @@ bit_csel_helper(struct panfrost_device *dev,
         }
 }
 
+static void
+bit_special_helper(struct panfrost_device *dev,
+                unsigned size, uint32_t *input, enum bit_debug debug)
+{
+        bi_instruction ins = bit_ins(BI_SPECIAL, 1, nir_type_float, size);
+
+        for (enum bi_special_op op = BI_SPECIAL_FRCP; op <= BI_SPECIAL_FRSQ; ++op) {
+                for (unsigned c = 0; c < ((size == 16) ? 2 : 1); ++c) {
+                        ins.op.special = op;
+                        ins.swizzle[0][0] = c;
+
+                        if (!bit_test_single(dev, &ins, input, false, debug)) {
+                                fprintf(stderr, "FAIL: special%u.%s\n",
+                                                size, bi_special_op_name(op));
+                        }
+                }
+        }
+}
+
 void
 bit_fmod(struct panfrost_device *dev, enum bit_debug debug)
 {
@@ -320,3 +339,18 @@ bit_csel(struct panfrost_device *dev, enum bit_debug debug)
                 bit_csel_helper(dev, sz, input, debug);
         }
 }
+
+void
+bit_special(struct panfrost_device *dev, enum bit_debug debug)
+{
+        float input32[4] = { 0.9 };
+        uint32_t input16[4] = { _mesa_float_to_half(input32[0]) | (_mesa_float_to_half(0.2) << 16) };
+
+        for (unsigned sz = 16; sz <= 32; sz *= 2) {
+                uint32_t *input =
+                        (sz == 16) ? input16 :
+                        (uint32_t *) input32;
+
+                bit_special_helper(dev, sz, input, debug);
+        }
+}
index 78d80aa80b15173a8c615f9ff6060254afab9fa2..c4c72ed24058ba3d65b987517f2140b2cb0ae1b1 100644 (file)
@@ -72,6 +72,7 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA);
 void bit_fmod(struct panfrost_device *dev, enum bit_debug debug);
 void bit_fma(struct panfrost_device *dev, enum bit_debug debug);
 void bit_csel(struct panfrost_device *dev, enum bit_debug debug);
+void bit_special(struct panfrost_device *dev, enum bit_debug debug);
 
 #endif