freedreno/ir3: add support for a few gs5 ops
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 22 Nov 2015 22:46:13 +0000 (17:46 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Mon, 23 Nov 2015 16:17:16 +0000 (11:17 -0500)
Tested on a4xx. This is part of the builtins added by ARB_gpu_shader5
and GLSL ES 3.10.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index fc163b4997527a51aae573a414721a9457038541..156bb0be2474066f52c63920d2ff0933a49085ca 100644 (file)
@@ -1177,6 +1177,33 @@ emit_alu(struct ir3_compile *ctx, nir_alu_instr *alu)
                dst[0] = ir3_SEL_B32(b, src[1], 0, ir3_b2n(b, src[0]), 0, src[2], 0);
                break;
 
+       case nir_op_bit_count:
+               dst[0] = ir3_CBITS_B(b, src[0], 0);
+               break;
+       case nir_op_ifind_msb: {
+               struct ir3_instruction *cmp;
+               dst[0] = ir3_CLZ_S(b, src[0], 0);
+               cmp = ir3_CMPS_S(b, dst[0], 0, create_immed(b, 0), 0);
+               cmp->cat2.condition = IR3_COND_GE;
+               dst[0] = ir3_SEL_B32(b,
+                               ir3_SUB_U(b, create_immed(b, 31), 0, dst[0], 0), 0,
+                               cmp, 0, dst[0], 0);
+               break;
+       }
+       case nir_op_ufind_msb:
+               dst[0] = ir3_CLZ_B(b, src[0], 0);
+               dst[0] = ir3_SEL_B32(b,
+                               ir3_SUB_U(b, create_immed(b, 31), 0, dst[0], 0), 0,
+                               src[0], 0, dst[0], 0);
+               break;
+       case nir_op_find_lsb:
+               dst[0] = ir3_BFREV_B(b, src[0], 0);
+               dst[0] = ir3_CLZ_B(b, dst[0], 0);
+               break;
+       case nir_op_bitfield_reverse:
+               dst[0] = ir3_BFREV_B(b, src[0], 0);
+               break;
+
        default:
                compile_error(ctx, "Unhandled ALU op: %s\n",
                                nir_op_infos[alu->op].name);