freedreno/ir3: handle IMMED for mad 2nd src special case
authorRob Clark <robdclark@gmail.com>
Tue, 30 Jan 2018 17:18:13 +0000 (12:18 -0500)
committerRob Clark <robdclark@gmail.com>
Sat, 10 Feb 2018 19:54:58 +0000 (14:54 -0500)
Consider also immediates for swapping the first two srcs, because they
can be lowered to constant.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_cp.c

index ca4ced734837bd53d0de3ccc68a78b0328f219b9..11d39a4093e33a11f701c7e685e90df791195ec7 100644 (file)
@@ -367,12 +367,13 @@ reg_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr,
                         */
                        if ((n == 1) && is_mad(instr->opc) &&
                                        !(instr->regs[0 + 1]->flags & (IR3_REG_CONST | IR3_REG_RELATIV)) &&
-                                       valid_flags(instr, 0, new_flags)) {
+                                       valid_flags(instr, 0, new_flags & ~IR3_REG_IMMED)) {
                                /* swap src[0] and src[1]: */
                                struct ir3_register *tmp;
                                tmp = instr->regs[0 + 1];
                                instr->regs[0 + 1] = instr->regs[1 + 1];
                                instr->regs[1 + 1] = tmp;
+
                                n = 0;
                        } else {
                                return;
@@ -437,7 +438,8 @@ reg_cp(struct ir3_cp_ctx *ctx, struct ir3_instruction *instr,
 
                        debug_assert((opc_cat(instr->opc) == 1) ||
                                        (opc_cat(instr->opc) == 6) ||
-                                       ir3_cat2_int(instr->opc));
+                                       ir3_cat2_int(instr->opc) ||
+                                       (is_mad(instr->opc) && (n == 0)));
 
                        if (new_flags & IR3_REG_SABS)
                                iim_val = abs(iim_val);