From d7bb7b79a8b0a86ee3fbd21fffa8e3d0c8dd03a2 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 6 Apr 2020 10:15:34 -0400 Subject: [PATCH] pan/bi: Add 32-bit _FAST packing For frcp/frsq on newer Bifrost. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bi_pack.c | 26 ++++++++++++++++++++++++++ src/panfrost/bifrost/bifrost.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/src/panfrost/bifrost/bi_pack.c b/src/panfrost/bifrost/bi_pack.c index ea68aa41b37..c6439c39e0c 100644 --- a/src/panfrost/bifrost/bi_pack.c +++ b/src/panfrost/bifrost/bi_pack.c @@ -634,6 +634,17 @@ bi_pack_fma_1src(bi_instruction *ins, struct bi_registers *regs, unsigned op) RETURN_PACKED(pack); } +static unsigned +bi_pack_add_1src(bi_instruction *ins, struct bi_registers *regs, unsigned op) +{ + struct bifrost_add_inst pack = { + .src0 = bi_get_src(ins, regs, 0, true), + .op = op + }; + + RETURN_PACKED(pack); +} + static enum bifrost_csel_cond bi_cond_to_csel(enum bi_cond cond, bool *flip, bool *invert, nir_alu_type T) { @@ -974,6 +985,20 @@ bi_pack_add_blend(bi_instruction *ins, struct bi_registers *regs) RETURN_PACKED(pack); } +static unsigned +bi_pack_add_special(bi_instruction *ins, struct bi_registers *regs) +{ + unsigned op = 0; + + if (ins->op.special == BI_SPECIAL_FRCP) { + op = BIFROST_ADD_OP_FRCP_FAST_F32; + } else { + op = BIFROST_ADD_OP_FRSQ_FAST_F32; + } + + return bi_pack_add_1src(ins, regs, op); +} + static unsigned bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs) { @@ -1013,6 +1038,7 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs) case BI_STORE_VAR: return bi_pack_add_st_vary(clause, bundle.add, regs); case BI_SPECIAL: + return bi_pack_add_special(bundle.add, regs); case BI_SWIZZLE: case BI_TEX: case BI_ROUND: diff --git a/src/panfrost/bifrost/bifrost.h b/src/panfrost/bifrost/bifrost.h index 4dc3c741b38..31ea14db63c 100644 --- a/src/panfrost/bifrost/bifrost.h +++ b/src/panfrost/bifrost/bifrost.h @@ -110,6 +110,8 @@ struct bifrost_fma_2src { } __attribute__((packed)); #define BIFROST_ADD_OP_BLEND (0x1952c) +#define BIFROST_ADD_OP_FRCP_FAST_F32 (0x0cc00) +#define BIFROST_ADD_OP_FRSQ_FAST_F32 (0x0cc20) struct bifrost_add_inst { unsigned src0 : 3;