pan/bit: Implement floating source mods
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 1 Apr 2020 17:13:50 +0000 (13:13 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 5 Apr 2020 23:26:04 +0000 (23:26 +0000)
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_interpret.c

index 8a4781b538e5aea04a552ec9962e3577ecc17a45..2ad1a21df25014aff7dbc45d0da103b91206fee6 100644 (file)
@@ -24,6 +24,7 @@
  *      Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
  */
 
+#include <math.h>
 #include "bit.h"
 #include "util/half_float.h"
 
@@ -201,6 +202,18 @@ bit_outmod(float raw, enum bifrost_outmod mod)
         }
 }
 
+static float
+bit_srcmod(float raw, bool abs, bool neg)
+{
+        if (abs)
+                raw = fabs(raw);
+
+        if (neg)
+                raw = -raw;
+
+        return raw;
+}
+
 void
 bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
 {
@@ -210,6 +223,23 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
         bi_foreach_src(ins, src)
                 srcs[src].u64 = bit_read(s, ins, ins->src[src], ins->src_types[src], FMA);
 
+        /* Apply source modifiers if we need to */
+        if (bi_has_source_mods(ins)) {
+                bi_foreach_src(ins, src) {
+                        if (ins->src_types[src] == nir_type_float16) {
+                                for (unsigned c = 0; c < 2; ++c) {
+                                        srcs[src].f16[c] = bh(bit_srcmod(bf(srcs[src].f16[c]),
+                                                        ins->src_abs[src],
+                                                        ins->src_neg[src]));
+                                }
+                        } else if (ins->src_types[src] == nir_type_float32) {
+                                srcs[src].f32 = bit_srcmod(srcs[src].f32,
+                                                        ins->src_abs[src],
+                                                        ins->src_neg[src]);
+                        }
+                }
+        }
+
         /* Next, do the action of the instruction */
         bit_t dest = { 0 };