i965/fs: Avoid generating extra AND instructions on bool logic ops.
authorEric Anholt <eric@anholt.net>
Tue, 13 Mar 2012 21:19:31 +0000 (14:19 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 12 Apr 2012 01:08:21 +0000 (18:08 -0700)
commit80ecb8f15b9ad7d6edcc85bd19f1867c368b09b6
tree23d88fcf762a8f8b9300281667c26962b1657050
parent32ae8d3b321185a85b73ff703d8fc26bd5f48fa7
i965/fs: Avoid generating extra AND instructions on bool logic ops.

By making a bool fs_reg only have a defined low bit (matching CMP
output), instead of being a full 0 or 1 value, we reduce the ANDs
generated in logic chains like:

   if (v_texcoord.x < 0.0 || v_texcoord.x > texwidth ||
       v_texcoord.y < 0.0 || v_texcoord.y > 1.0)
      discard;

My concern originally when writing this code was that we would end up
generating unnecessary ANDs on bool uniforms, so I put the ANDs right
at the point of doing the CMPs that otherwise set only the low bit.
However, in order to use a bool, we're generating some instruction
anyway (e.g. moving it so as to produce a condition code update), and
those instructions can often be turned into an AND at that point.  It
turns out in the shaders I have on hand, none of them regress in
instruction count:

Total instructions: 262649 -> 262545
39/2148 programs affected (1.8%)
14253 -> 14149 instructions in affected programs (0.7% reduction)
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp