[Mesa-dev] [PATCH 1/4] i965/cfg: Add functions to get first and last non-CF instructions.

Jason Ekstrand jason at jlekstrand.net
Thu Nov 6 09:46:31 PST 2014


1 and 4 are Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

On Wed, Nov 5, 2014 at 4:13 PM, Matt Turner <mattst88 at gmail.com> wrote:

> ---
>  src/mesa/drivers/dri/i965/brw_cfg.h | 74
> +++++++++++++++++++++++++++++++++++++
>  1 file changed, 74 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_cfg.h
> b/src/mesa/drivers/dri/i965/brw_cfg.h
> index e6403bd..c2029cc 100644
> --- a/src/mesa/drivers/dri/i965/brw_cfg.h
> +++ b/src/mesa/drivers/dri/i965/brw_cfg.h
> @@ -71,6 +71,12 @@ struct bblock_t {
>     const bblock_t *next() const;
>     bblock_t *prev();
>     const bblock_t *prev() const;
> +
> +   bool starts_with_control_flow() const;
> +   bool ends_with_control_flow() const;
> +
> +   backend_instruction *first_non_control_flow_inst();
> +   backend_instruction *last_non_control_flow_inst();
>  #endif
>
>     struct exec_node link;
> @@ -142,6 +148,50 @@ bblock_prev_const(const struct bblock_t *block)
>     return (const struct bblock_t *)block->link.prev;
>  }
>
> +static inline bool
> +bblock_starts_with_control_flow(const struct bblock_t *block)
> +{
> +   enum opcode op = bblock_start_const(block)->opcode;
> +   return op == BRW_OPCODE_DO || op == BRW_OPCODE_ENDIF;
> +}
> +
> +static inline bool
> +bblock_ends_with_control_flow(const struct bblock_t *block)
> +{
> +   enum opcode op = bblock_end_const(block)->opcode;
> +   return op == BRW_OPCODE_IF ||
> +          op == BRW_OPCODE_ELSE ||
> +          op == BRW_OPCODE_WHILE ||
> +          op == BRW_OPCODE_BREAK ||
> +          op == BRW_OPCODE_CONTINUE;
> +}
> +
> +static inline struct backend_instruction *
> +bblock_first_non_control_flow_inst(struct bblock_t *block)
> +{
> +   struct backend_instruction *inst = bblock_start(block);
> +   if (bblock_starts_with_control_flow(block))
> +#ifdef __cplusplus
> +      inst = (struct backend_instruction *)inst->next;
> +#else
> +      inst = (struct backend_instruction *)inst->link.next;
> +#endif
> +   return inst;
> +}
> +
> +static inline struct backend_instruction *
> +bblock_last_non_control_flow_inst(struct bblock_t *block)
> +{
> +   struct backend_instruction *inst = bblock_end(block);
> +   if (bblock_ends_with_control_flow(block))
> +#ifdef __cplusplus
> +      inst = (struct backend_instruction *)inst->prev;
> +#else
> +      inst = (struct backend_instruction *)inst->link.prev;
> +#endif
> +   return inst;
> +}
> +
>  #ifdef __cplusplus
>  inline backend_instruction *
>  bblock_t::start()
> @@ -190,6 +240,30 @@ bblock_t::prev() const
>  {
>     return bblock_prev_const(this);
>  }
> +
> +inline bool
> +bblock_t::starts_with_control_flow() const
> +{
> +   return bblock_starts_with_control_flow(this);
> +}
> +
> +inline bool
> +bblock_t::ends_with_control_flow() const
> +{
> +   return bblock_ends_with_control_flow(this);
> +}
> +
> +inline backend_instruction *
> +bblock_t::first_non_control_flow_inst()
> +{
> +   return bblock_first_non_control_flow_inst(this);
> +}
> +
> +inline backend_instruction *
> +bblock_t::last_non_control_flow_inst()
> +{
> +   return bblock_last_non_control_flow_inst(this);
> +}
>  #endif
>
>  struct cfg_t {
> --
> 2.0.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141106/d2d65496/attachment.html>


More information about the mesa-dev mailing list