From 5e3e32e368caabc50b669967b1a81b0f32102194 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 1 Apr 2020 13:13:50 -0400 Subject: [PATCH] pan/bit: Implement floating source mods Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/test/bi_interpret.c | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/panfrost/bifrost/test/bi_interpret.c b/src/panfrost/bifrost/test/bi_interpret.c index 8a4781b538e..2ad1a21df25 100644 --- a/src/panfrost/bifrost/test/bi_interpret.c +++ b/src/panfrost/bifrost/test/bi_interpret.c @@ -24,6 +24,7 @@ * Alyssa Rosenzweig */ +#include #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 }; -- 2.30.2