i965: Abstract BRW_REGISTER_TYPE_* into an enum with unique values.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 10 Dec 2013 08:33:56 +0000 (00:33 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 20 Dec 2013 20:34:39 +0000 (12:34 -0800)
commit54e91e742010728cbf6c5b8c00b6ca5019a63eb9
tree16528bfd253766921386a2a3b2d0f13092def09c
parent13454fc3dea4cd4ed1676a1aaf91d49c9a811a7c
i965: Abstract BRW_REGISTER_TYPE_* into an enum with unique values.

On released hardware, values 4-6 are overloaded.  For normal registers,
they mean UB/B/DF.  But for immediates, they mean UV/VF/V.

Previously, we just created #defines for each name, reusing the same
value.  This meant we could directly splat the brw_reg::type field into
the assembly encoding, which was fairly nice, and worked well.

Unfortunately, Broadwell makes this infeasible: the HF and DF types are
represented as different numeric values depending on whether the
source register is an immediate or not.

To preserve sanity, I decided to simply convert BRW_REGISTER_TYPE_* to
an abstract enum that has a unique value for each register type, and
write translation functions.  One nice benefit is that we can add
assertions about register files and generations.

I've chosen not to convert brw_reg::type to the enum, since converting
it caused a lot of trouble due to C++ enum rules (even though it's
defined in an extern "C" block...).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_disasm.c
src/mesa/drivers/dri/i965/brw_eu_emit.c
src/mesa/drivers/dri/i965/brw_reg.h