[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