From: Alyssa Rosenzweig Date: Wed, 1 Apr 2020 17:08:00 +0000 (-0400) Subject: pan/bit: Implement outmods X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dbb8a564f2661fe8f665ea0f2e277c19259ba968;p=mesa.git pan/bit: Implement outmods Signed-off-by: Alyssa Rosenzweig Part-of: --- diff --git a/src/panfrost/bifrost/test/bi_interpret.c b/src/panfrost/bifrost/test/bi_interpret.c index ccfd09548ea..8a4781b538e 100644 --- a/src/panfrost/bifrost/test/bi_interpret.c +++ b/src/panfrost/bifrost/test/bi_interpret.c @@ -184,6 +184,23 @@ bit_make_poly(add, a + b); bit_make_float(fma, (a * b) + c); bit_make_poly(mov, a); +/* Modifiers */ + +static float +bit_outmod(float raw, enum bifrost_outmod mod) +{ + switch (mod) { + case BIFROST_POS: + return MAX2(raw, 0.0); + case BIFROST_SAT_SIGNED: + return CLAMP(raw, -1.0, 1.0); + case BIFROST_SAT: + return CLAMP(raw, 0.0, 1.0); + default: + return raw; + } +} + void bit_step(struct bit_state *s, bi_instruction *ins, bool FMA) { @@ -247,6 +264,16 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA) unreachable("Unsupported op"); } + /* Apply outmod */ + if (bi_has_outmod(ins) && ins->outmod != BIFROST_NONE) { + if (ins->dest_type == nir_type_float16) { + for (unsigned c = 0; c < 2; ++c) + dest.f16[c] = bh(bit_outmod(bf(dest.f16[c]), ins->outmod)); + } else { + dest.f32 = bit_outmod(dest.f32, ins->outmod); + } + } + /* Finally, store the result */ bit_write(s, ins->dest, ins->dest_type, dest, FMA);