[Mesa-dev] [PATCH] intel/compiler: Reset default flag register in brw_find_live_channel()
Francisco Jerez
currojerez at riseup.net
Tue Jan 22 22:47:14 UTC 2019
Matt Turner <mattst88 at gmail.com> writes:
> emit_uniformize() emits SHADER_OPCODE_FIND_LIVE_CHANNEL with its
> flag_subreg set, so that the IR knows which flag is accessed. However
> the flag is only used on Gen7 in Align1 mode.
>
> To avoid setting unnecessary bits in the instruction words, get the
> information we need and reset the default flag register. This allows
> round-tripping through the assembler/disassembler.
> ---
> src/intel/compiler/brw_eu_emit.c | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c
> index 45e2552783b..d05ea506353 100644
> --- a/src/intel/compiler/brw_eu_emit.c
> +++ b/src/intel/compiler/brw_eu_emit.c
> @@ -3312,6 +3312,14 @@ brw_find_live_channel(struct brw_codegen *p, struct brw_reg dst,
>
> brw_push_insn_state(p);
>
> + /* The flag register is only used on Gen7 in align1 mode, so avoid setting
> + * unnecessary bits in the instruction words, get the information we need
> + * and reset the default flag register.
> + */
> + int flag_reg = p->current->flag_subreg / 2;
> + int flag_subreg = p->current->flag_subreg % 2;
You can replace the two lines above with:
+ const unsigned flag_subreg = p->current->flag_subreg;
> + brw_set_default_flag_reg(p, 0, 0);
> +
> if (brw_get_default_access_mode(p) == BRW_ALIGN_1) {
> brw_set_default_mask_control(p, BRW_MASK_DISABLE);
>
> @@ -3345,12 +3353,14 @@ brw_find_live_channel(struct brw_codegen *p, struct brw_reg dst,
> */
> inst = brw_FBL(p, vec1(dst), exec_mask);
> } else {
> - const struct brw_reg flag = brw_flag_reg(p->current->flag_subreg / 2,
> - p->current->flag_subreg % 2);
> + const struct brw_reg flag = brw_flag_reg(flag_reg, flag_subreg);
so this will just be "brw_flag_subreg(flag_subreg)".
>
> brw_set_default_exec_size(p, BRW_EXECUTE_1);
> brw_MOV(p, retype(flag, BRW_REGISTER_TYPE_UD), brw_imm_ud(0));
>
> + brw_push_insn_state(p);
> + brw_set_default_flag_reg(p, flag_reg, flag_subreg);
> +
No need to push and pop another entry into the default instruction state
stack, you can just "brw_inst_set_flag_*reg_nr()" on the MOV instruction.
> /* Run enough instructions returning zero with execution masking and
> * a conditional modifier enabled in order to get the full execution
> * mask in f1.0. We could use a single 32-wide move here if it
> @@ -3368,6 +3378,8 @@ brw_find_live_channel(struct brw_codegen *p, struct brw_reg dst,
> brw_inst_set_exec_size(devinfo, inst, cvt(lower_size) - 1);
> }
>
> + brw_pop_insn_state(p);
> +
> /* Find the first bit set in the exec_size-wide portion of the flag
> * register that was updated by the last sequence of MOV
> * instructions.
> --
> 2.19.2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 227 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190122/0779284d/attachment.sig>
More information about the mesa-dev
mailing list