pan/bi: Add support for ishr
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 6 Nov 2020 10:51:48 +0000 (11:51 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Mon, 9 Nov 2020 19:36:50 +0000 (20:36 +0100)
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7472>

src/panfrost/bifrost/bi_pack.c
src/panfrost/bifrost/bifrost_compile.c
src/panfrost/bifrost/compiler.h

index 47ee8c8..79f03ca 100644 (file)
@@ -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");
         }
index 116bd1d..9fbd595 100644 (file)
@@ -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;
index 11689c4..7a581c4 100644 (file)
@@ -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 {