freedreno: a2xx: Implement DP2 instruction
authorWladimir J. van der Laan <laanwj@gmail.com>
Tue, 8 Aug 2017 15:06:21 +0000 (15:06 +0000)
committerWladimir J. van der Laan <laanwj@gmail.com>
Sat, 31 Mar 2018 06:17:59 +0000 (06:17 +0000)
Use DOT2ADDv instruction with 0.0f constant add.

Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a2xx/fd2_compiler.c

index 84855a48d2a4c8ce2ce1f14ee3d282dab118f839..3ad47f98508ddbb880e9c81562464cd5495df33b 100644 (file)
@@ -987,6 +987,24 @@ translate_trig(struct fd2_compile_context *ctx,
        add_src_reg(ctx, instr, &tmp_src);
 }
 
+static void
+translate_dp2(struct fd2_compile_context *ctx,
+               struct tgsi_full_instruction *inst,
+               unsigned opc)
+{
+       struct tgsi_src_register tmp_const;
+       struct ir2_instruction *instr;
+       /* DP2ADD c,a,b -> dot2(a,b) + c */
+       /* for c we use the constant 0.0 */
+       instr = ir2_instr_create_alu(next_exec_cf(ctx), DOT2ADDv, ~0);
+       get_immediate(ctx, &tmp_const, fui(0.0f));
+       add_dst_reg(ctx, instr, &inst->Dst[0].Register);
+       add_src_reg(ctx, instr, &tmp_const);
+       add_src_reg(ctx, instr, &inst->Src[0].Register);
+       add_src_reg(ctx, instr, &inst->Src[1].Register);
+       add_vector_clamp(inst, instr);
+}
+
 /*
  * Main part of compiler/translator:
  */
@@ -1054,6 +1072,9 @@ translate_instruction(struct fd2_compile_context *ctx,
                instr = ir2_instr_create_alu(cf, ADDv, ~0);
                add_regs_vector_2(ctx, inst, instr);
                break;
+       case TGSI_OPCODE_DP2:
+               translate_dp2(ctx, inst, opc);
+               break;
        case TGSI_OPCODE_DP3:
                instr = ir2_instr_create_alu(cf, DOT3v, ~0);
                add_regs_vector_2(ctx, inst, instr);