From af70987b36364c5c6447d7bf66dc06b8e31886ff Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 6 Nov 2020 11:51:48 +0100 Subject: [PATCH] pan/bi: Add support for ishr Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bi_pack.c | 4 ++++ src/panfrost/bifrost/bifrost_compile.c | 9 +++++++++ src/panfrost/bifrost/compiler.h | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/panfrost/bifrost/bi_pack.c b/src/panfrost/bifrost/bi_pack.c index 47ee8c8..79f03ca 100644 --- a/src/panfrost/bifrost/bi_pack.c +++ b/src/panfrost/bifrost/bi_pack.c @@ -426,6 +426,7 @@ BI_PACK_SHIFT(rshift_or) BI_PACK_SHIFT(lshift_or) BI_PACK_SHIFT(rshift_xor) BI_PACK_SHIFT(lshift_xor) +BI_PACK_SHIFT(arshift) static unsigned bi_pack_fma_bitwise(bi_clause *clause, bi_instruction *ins, bi_registers *regs) @@ -443,6 +444,9 @@ bi_pack_fma_bitwise(bi_clause *clause, bi_instruction *ins, bi_registers *regs) return ins->bitwise.rshift ? bi_pack_fma_rshift_xor(clause, ins, regs) : bi_pack_fma_lshift_xor(clause, ins, regs); + case BI_BITWISE_ARSHIFT: + assert(ins->bitwise.rshift); + return bi_pack_fma_arshift(clause, ins, regs); default: unreachable("Invalid bitwise op"); } diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 116bd1d..9fbd595 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -896,6 +896,7 @@ bi_class_for_nir_alu(nir_op op) case nir_op_ixor: case nir_op_inot: case nir_op_ishl: + case nir_op_ishr: return BI_BITWISE; BI_CASE_CMP(nir_op_flt) @@ -1210,6 +1211,14 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr) alu.src_types[2] = nir_type_uint8; alu.src[1] = BIR_INDEX_ZERO; break; + case nir_op_ishr: + alu.op.bitwise = BI_BITWISE_ARSHIFT; + alu.bitwise.rshift = true; + /* move src1 to src2 and replace with zero. underlying op is (src0 >> src2) */ + alu.src[2] = alu.src[1]; + alu.src_types[2] = nir_type_uint8; + alu.src[1] = BIR_INDEX_ZERO; + break; case nir_op_imul: alu.op.imul = BI_IMUL_IMUL; break; diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index 11689c4..7a581c4 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -193,7 +193,8 @@ enum bi_minmax_op { enum bi_bitwise_op { BI_BITWISE_AND, BI_BITWISE_OR, - BI_BITWISE_XOR + BI_BITWISE_XOR, + BI_BITWISE_ARSHIFT, }; enum bi_imath_op { -- 2.7.4