pan/bi: Add isub op
[mesa.git] / src / panfrost / bifrost / bifrost_compile.c
index bbc3398602c9ced476ae5aa3427515169ef134ca..97ef06946ac96804bbd0ad48fa3c99f871248ab0 100644 (file)
@@ -229,11 +229,60 @@ static enum bi_class
 bi_class_for_nir_alu(nir_op op)
 {
         switch (op) {
-        case nir_op_fadd: return BI_ADD;
-        case nir_op_fmul: return BI_FMA;
+        case nir_op_iadd:
+        case nir_op_fadd:
+        case nir_op_fsub:
+                return BI_ADD;
+        case nir_op_isub:
+                return BI_ISUB;
+
+        case nir_op_i2i8:
+        case nir_op_i2i16:
+        case nir_op_i2i32:
+        case nir_op_i2i64:
+        case nir_op_u2u8:
+        case nir_op_u2u16:
+        case nir_op_u2u32:
+        case nir_op_u2u64:
+        case nir_op_f2i16:
+        case nir_op_f2i32:
+        case nir_op_f2i64:
+        case nir_op_f2u16:
+        case nir_op_f2u32:
+        case nir_op_f2u64:
+        case nir_op_i2f16:
+        case nir_op_i2f32:
+        case nir_op_i2f64:
+        case nir_op_u2f16:
+        case nir_op_u2f32:
+        case nir_op_u2f64:
+                return BI_CONVERT;
+
+        case nir_op_fmul:
+                return BI_FMA;
+
+        case nir_op_imin:
+        case nir_op_imax:
+        case nir_op_umin:
+        case nir_op_umax:
+        case nir_op_fmin:
+        case nir_op_fmax:
+                return BI_MINMAX;
+
         case nir_op_fsat:
-        case nir_op_mov:  return BI_MOV;
-        default: unreachable("Unknown ALU op");
+        case nir_op_fneg:
+        case nir_op_fabs:
+        case nir_op_mov:
+                return BI_MOV;
+
+        case nir_op_frcp:
+        case nir_op_frsq:
+        case nir_op_fsin:
+        case nir_op_fcos:
+                return BI_SPECIAL;
+
+        default:
+                unreachable("Unknown ALU op");
         }
 }
 
@@ -248,6 +297,9 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr)
                         | nir_dest_bit_size(instr->dest.dest),
         };
 
+        /* TODO: Implement lowering of special functions for older Bifrost */
+        assert((alu.type != BI_SPECIAL) || !(ctx->quirks & BIFROST_NO_FAST_OP));
+
         if (instr->dest.dest.is_ssa) {
                 /* Construct a writemask */
                 unsigned bits_per_comp = instr->dest.dest.ssa.bit_size;
@@ -306,6 +358,32 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr)
         case nir_op_fsat:
                 alu.outmod = BIFROST_SAT; /* MOV */
                 break;
+        case nir_op_fneg:
+                alu.src_neg[0] = true; /* MOV */
+                break;
+        case nir_op_fabs:
+                alu.src_abs[0] = true; /* MOV */
+                break;
+        case nir_op_fsub:
+                alu.src_neg[1] = true; /* ADD */
+                break;
+        case nir_op_fmax:
+        case nir_op_imax:
+        case nir_op_umax:
+                alu.op.minmax = BI_MINMAX_MAX; /* MINMAX */
+                break;
+        case nir_op_frcp:
+                alu.op.special = BI_SPECIAL_FRCP;
+                break;
+        case nir_op_frsq:
+                alu.op.special = BI_SPECIAL_FRSQ;
+                break;
+        case nir_op_fsin:
+                alu.op.special = BI_SPECIAL_FSIN;
+                break;
+        case nir_op_fcos:
+                alu.op.special = BI_SPECIAL_FCOS;
+                break;
         default:
                 break;
         }