bifrost: Add support for nir_op_iabs
authorChris Forbes <chrisforbes@google.com>
Mon, 27 Jul 2020 18:51:31 +0000 (11:51 -0700)
committerMarge Bot <eric+marge@anholt.net>
Tue, 28 Jul 2020 15:40:00 +0000 (15:40 +0000)
Signed-off-by: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6098>

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

index b7ae11327934ec4a42000f044ffd3144f3a32f1d..5fb8213d0a7b0ff64ad26815fcda4d1680237fa2 100644 (file)
@@ -1434,6 +1434,9 @@ bi_pack_add_special(bi_instruction *ins, bi_registers *regs)
         } else if (ins->op.special == BI_SPECIAL_EXP2_LOW) {
                 assert(!fp16);
                 op = BIFROST_ADD_OP_FEXP2_FAST;
+        } else if (ins->op.special == BI_SPECIAL_IABS) {
+                assert(ins->src_types[0] == nir_type_int32);
+                op = BIFROST_ADD_OP_IABS_32;
         } else {
                 unreachable("Unknown special op");
         }
index a41076bcea3122edf3b67fdd8bcd58ddfb629141..085b3296f2a5f0003f2a32eb863484b645a46f92 100644 (file)
@@ -164,6 +164,7 @@ struct bifrost_fma_mscale {
 #define BIFROST_ADD_OP_FRSQ_FAST_F16_Y (0x0ce70)
 #define BIFROST_ADD_OP_LOG2_HELP  (0x0cc68)
 #define BIFROST_ADD_OP_FEXP2_FAST (0x0cd58)
+#define BIFROST_ADD_OP_IABS_32 (0x07bd4)
 
 struct bifrost_add_inst {
         unsigned src0 : 3;
index 2419a4fbcf5fa39b2b274a19f57c5289cb1dd806..ed8741ddb5a5eb07d4098942eb5a0f6275229b05 100644 (file)
@@ -600,6 +600,7 @@ bi_class_for_nir_alu(nir_op op)
 
         case nir_op_frcp:
         case nir_op_frsq:
+        case nir_op_iabs:
                 return BI_SPECIAL;
 
         default:
@@ -808,6 +809,9 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr)
         case nir_op_isub:
                 alu.op.imath = BI_IMATH_SUB;
                 break;
+        case nir_op_iabs:
+                alu.op.special = BI_SPECIAL_IABS;
+                break;
         case nir_op_inot:
                 /* no dedicated bitwise not, but we can invert sources. convert to ~a | 0 */
                 alu.op.bitwise = BI_BITWISE_OR;
index 4c77ac5edf9fda197c7fe61b3b86e2fc8a968f64..32361cc37e1c44d16776bb90eb64332f92c1a7f9 100644 (file)
@@ -204,6 +204,7 @@ enum bi_special_op {
          * exp2() in GL. In the first argument, it takes f2i_rte(x * 2^24). In
          * the second, it takes x itself. */
         BI_SPECIAL_EXP2_LOW,
+        BI_SPECIAL_IABS,
 };
 
 enum bi_tex_op {
index 92fbf20a17f34b126a0d85cf3e3619a18b7ee151..93afbee3896df3836aed3e9f10eadae203b2d31e 100644 (file)
@@ -1013,6 +1013,7 @@ static const struct add_op_info add_op_infos[] = {
         { 0x07ba5, "FSQRT_FREXPE", ADD_ONE_SRC },
         { 0x07bad, "FRSQ_FREXPE", ADD_ONE_SRC },
         { 0x07bc5, "FLOG_FREXPE", ADD_ONE_SRC },
+        { 0x07bd4, "IABS.i32", ADD_ONE_SRC },
         { 0x07d42, "CEIL.v2f16", ADD_ONE_SRC },
         { 0x07d45, "CEIL.f32", ADD_ONE_SRC },
         { 0x07d82, "FLOOR.v2f16", ADD_ONE_SRC },