From 9967561158acd94edff0fa93ceaf4bc527e271ed Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 13 Apr 2016 15:56:07 -0700 Subject: i965: Rework opt_vector_float() control flow. 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 Reviewed-by: Iago Toral Quiroga Reviewed-by: Matt Turner --- src/mesa/drivers/dri/i965/brw_vec4.cpp | 61 +++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 27 deletions(-) (limited to 'src/mesa') diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index 6433fc55067..033eccee3ba 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) -- cgit v1.2.3