[Mesa-dev] [PATCH v2 1/4] i965: Rework opt_vector_float() control flow.

Iago Toral itoral at igalia.com
Tue Apr 19 08:18:13 UTC 2016


Looks good to me, assuming this does not bring new unexpected
regressions, the series is:

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

On Mon, 2016-04-18 at 23:52 -0700, Kenneth Graunke wrote:
> This reworks opt_vector_float() so that there's only one place that
> flushes out any accumulated state and emits a VF.
> 
> v2: Don't break the sequence for non-representable numbers - just skip
>     recording their values.  Only break it for non-MOVs or register
>     changes.
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Reviewed-by: Iago Toral Quiroga <itoral at igalia.com> [v1]
> ---
>  src/mesa/drivers/dri/i965/brw_vec4.cpp | 61 +++++++++++++++++++---------------
>  1 file changed, 34 insertions(+), 27 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> index 6433fc5..033ecce 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -385,48 +385,55 @@ vec4_visitor::opt_vector_float()
>     unsigned writemask = 0;
>  
>     foreach_block_and_inst_safe(block, vec4_instruction, inst, cfg) {
> +      int vf = -1;
> +
> +      /* Look for unconditional MOVs from an immediate with a partial
> +       * writemask.  See if the immediate can be represented as a VF.
> +       */
> +      if (inst->opcode == BRW_OPCODE_MOV &&
> +          inst->src[0].file == IMM &&
> +          inst->predicate == BRW_PREDICATE_NONE &&
> +          inst->dst.writemask != WRITEMASK_XYZW) {
> +         vf = brw_float_to_vf(inst->src[0].f);
> +      } else {
> +         last_reg = -1;
> +      }
> +
> +      /* If this wasn't a MOV, or the destination register doesn't match,
> +       * then this breaks our sequence.  Combine anything we've accumulated.
> +       */
>        if (last_reg != inst->dst.nr ||
>            last_reg_offset != inst->dst.reg_offset ||
>            last_reg_file != inst->dst.file) {
>           progress |= vectorize_mov(block, inst, imm, imm_inst, inst_count,
>                                     writemask);
>           inst_count = 0;
> +         last_reg = -1;
>           writemask = 0;
> -         last_reg = inst->dst.nr;
> -         last_reg_offset = inst->dst.reg_offset;
> -         last_reg_file = inst->dst.file;
>  
>           for (int i = 0; i < 4; i++) {
>              imm[i] = 0;
>           }
>        }
>  
> -      if (inst->opcode != BRW_OPCODE_MOV ||
> -          inst->dst.writemask == WRITEMASK_XYZW ||
> -          inst->src[0].file != IMM ||
> -          inst->predicate != BRW_PREDICATE_NONE) {
> -         progress |= vectorize_mov(block, inst, imm, imm_inst, inst_count,
> -                                   writemask);
> -         inst_count = 0;
> -         last_reg = -1;
> -         continue;
> -      }
> +      /* Record this instruction's value (if it was representable). */
> +      if (vf != -1) {
> +         if ((inst->dst.writemask & WRITEMASK_X) != 0)
> +            imm[0] = vf;
> +         if ((inst->dst.writemask & WRITEMASK_Y) != 0)
> +            imm[1] = vf;
> +         if ((inst->dst.writemask & WRITEMASK_Z) != 0)
> +            imm[2] = vf;
> +         if ((inst->dst.writemask & WRITEMASK_W) != 0)
> +            imm[3] = vf;
>  
> -      int vf = brw_float_to_vf(inst->src[0].f);
> -      if (vf == -1)
> -         continue;
> +         writemask |= inst->dst.writemask;
> +         imm_inst[inst_count++] = inst;
>  
> -      if ((inst->dst.writemask & WRITEMASK_X) != 0)
> -         imm[0] = vf;
> -      if ((inst->dst.writemask & WRITEMASK_Y) != 0)
> -         imm[1] = vf;
> -      if ((inst->dst.writemask & WRITEMASK_Z) != 0)
> -         imm[2] = vf;
> -      if ((inst->dst.writemask & WRITEMASK_W) != 0)
> -         imm[3] = vf;
> -
> -      writemask |= inst->dst.writemask;
> -      imm_inst[inst_count++] = inst;
> +         last_reg = inst->dst.nr;
> +         last_reg_offset = inst->dst.reg_offset;
> +         last_reg_file = inst->dst.file;
> +      }
>     }
>  
>     if (progress)




More information about the mesa-dev mailing list