[Mesa-dev] [PATCH 2/2] i965/fs: Constant-fold immediates in src0 of SEL instructions.

Ian Romanick idr at freedesktop.org
Mon Apr 11 09:16:32 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 04/09/2011 10:08 PM, Eric Anholt wrote:
> This is like what we do for add/mul, but we have to invert the
> predicate to choose the other source instead.
> 
> This removes 5 extra moves of constants in nexuiz shaders.
> ---
>  src/mesa/drivers/dri/i965/brw_eu.c   |    5 +++++
>  src/mesa/drivers/dri/i965/brw_eu.h   |    1 +
>  src/mesa/drivers/dri/i965/brw_fs.cpp |    9 +++++++++
>  src/mesa/drivers/dri/i965/brw_fs.h   |    1 +
>  4 files changed, 16 insertions(+), 0 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c
> index b59d6b2..7e63482 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu.c
> +++ b/src/mesa/drivers/dri/i965/brw_eu.c
> @@ -82,6 +82,11 @@ void brw_set_predicate_control( struct brw_compile *p, GLuint pc )
>     p->current->header.predicate_control = pc;
>  }
>  
> +void brw_set_predicate_inverse(struct brw_compile *p, bool predicate_inverse)
> +{
> +   p->current->header.predicate_inverse = predicate_inverse;
> +}
> +
>  void brw_set_conditionalmod( struct brw_compile *p, GLuint conditional )
>  {
>     p->current->header.destreg__conditionalmod = conditional;
> diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
> index c2e59c1..718b380 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu.h
> +++ b/src/mesa/drivers/dri/i965/brw_eu.h
> @@ -772,6 +772,7 @@ void brw_set_access_mode( struct brw_compile *p, GLuint access_mode );
>  void brw_set_compression_control( struct brw_compile *p, GLboolean control );
>  void brw_set_predicate_control_flag_value( struct brw_compile *p, GLuint value );
>  void brw_set_predicate_control( struct brw_compile *p, GLuint pc );
> +void brw_set_predicate_inverse(struct brw_compile *p, bool predicate_inverse);
>  void brw_set_conditionalmod( struct brw_compile *p, GLuint conditional );
>  void brw_set_acc_write_control(struct brw_compile *p, GLuint value);
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 128bbe9..12f9e6a 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -2963,6 +2963,14 @@ fs_visitor::propagate_constants()
>  	       if (i == 1) {
>  		  scan_inst->src[i] = inst->src[0];
>  		  progress = true;
> +	       } else if (i == 0 && scan_inst->src[1].file != IMM) {
> +		  /* Fit this constant in by swapping the operands and
> +		   * flipping the predicate
> +		   */
> +		  scan_inst->src[0] = scan_inst->src[1];
> +		  scan_inst->src[1] = inst->src[0];
> +		  scan_inst->predicate_inverse = ~scan_inst->predicate_inverse;

Since predicate_inverse is a bool, shouldn't that be
!scan_inst->predicate_inverse instead of ~scan_inst->predicate_inverse?

> +		  progress = true;
>  	       }
>  	       break;
>  	    }
> @@ -3450,6 +3458,7 @@ fs_visitor::generate_code()
>  
>        brw_set_conditionalmod(p, inst->conditional_mod);
>        brw_set_predicate_control(p, inst->predicated);
> +      brw_set_predicate_inverse(p, inst->predicate_inverse);
>        brw_set_saturate(p, inst->saturate);
>  
>        switch (inst->opcode) {
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index e48bf40..f792906 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -331,6 +331,7 @@ public:
>     fs_reg src[3];
>     bool saturate;
>     bool predicated;
> +   bool predicate_inverse;
>     int conditional_mod; /**< BRW_CONDITIONAL_* */
>  
>     int mlen; /**< SEND message length */

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk2jKWAACgkQX1gOwKyEAw86yACgkfybN+EkvcyGtqtYUYKNuTI/
W4MAn2SCBrBqMOXKPLIFPeB2qfvG6wSV
=35CR
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list