aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2020-04-30 18:15:09 -0400
committerMarge Bot <[email protected]>2020-05-01 00:27:23 +0000
commit130a3fba1c744dce5c052840b4f78437d4c73bf8 (patch)
tree51ea3f4f028fa08cf823888d9ae12b60a028c781
parent5f35cdaa8dd78ee97bccdab82ef21b6ad6fe1108 (diff)
pan/bi: Pack round opcodes (FMA, either 16 or 32)
Signed-off-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4844>
-rw-r--r--src/panfrost/bifrost/bi_pack.c15
-rw-r--r--src/panfrost/bifrost/bifrost.h3
2 files changed, 17 insertions, 1 deletions
diff --git a/src/panfrost/bifrost/bi_pack.c b/src/panfrost/bifrost/bi_pack.c
index 5cd902da250..6f1b6dc7c53 100644
--- a/src/panfrost/bifrost/bi_pack.c
+++ b/src/panfrost/bifrost/bi_pack.c
@@ -1127,6 +1127,19 @@ bi_pack_fma_bitwise(bi_instruction *ins, struct bi_registers *regs)
RETURN_PACKED(pack);
}
+
+static unsigned
+bi_pack_fma_round(bi_instruction *ins, struct bi_registers *regs)
+{
+ bool fp16 = ins->dest_type == nir_type_float16;
+ assert(fp16 || ins->dest_type == nir_type_float32);
+
+ unsigned op = fp16
+ ? BIFROST_FMA_ROUND_16(ins->roundmode, bi_swiz16(ins, 0))
+ : BIFROST_FMA_ROUND_32(ins->roundmode);
+
+ return bi_pack_fma_1src(ins, regs, op);
+}
static unsigned
bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
@@ -1160,7 +1173,7 @@ bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
case BI_SELECT:
return bi_pack_fma_select(bundle.fma, regs);
case BI_ROUND:
- return BIFROST_FMA_NOP;
+ return bi_pack_fma_round(bundle.fma, regs);
case BI_REDUCE_FMA:
return bi_pack_fma_reduce(bundle.fma, regs);
default:
diff --git a/src/panfrost/bifrost/bifrost.h b/src/panfrost/bifrost/bifrost.h
index bfbaa2c2e56..ad2b2ac01b7 100644
--- a/src/panfrost/bifrost/bifrost.h
+++ b/src/panfrost/bifrost/bifrost.h
@@ -101,6 +101,9 @@ enum bifrost_packed_src {
#define BIFROST_FMA_OP_ADD_FREXPM ((BIFROST_FMA_EXT | 0x1e80) >> 3)
#define BIFROST_FMA_SEL_16(swiz) (((BIFROST_FMA_EXT | 0x1e00) >> 3) | (swiz))
+#define BIFROST_FMA_ROUND_16(mode, swiz) (BIFROST_FMA_EXT | 0x1800 | (swiz) | ((mode) << 6))
+#define BIFROST_FMA_ROUND_32(mode) (BIFROST_FMA_EXT | 0x1805 | ((mode) << 6))
+
struct bifrost_fma_inst {
unsigned src0 : 3;
unsigned op : 20;