i965: Add functions for brw_reg_type <-> hw 3src type

Reviewed-by: Scott D Phillips <scott.d.phillips@intel.com>
This commit is contained in:
Matt Turner 2017-06-14 14:08:32 -07:00
parent 4c857d1f3b
commit 3f14150e9a
2 changed files with 58 additions and 0 deletions

View File

@ -79,6 +79,27 @@ static const struct {
[BRW_REGISTER_TYPE_UV] = { INVALID, BRW_HW_IMM_TYPE_UV },
};
/* SNB adds 3-src instructions (MAD and LRP) that only operate on floats, so
* the types were implied. IVB adds BFE and BFI2 that operate on doublewords
* and unsigned doublewords, so a new field is also available in the da3src
* struct (part of struct brw_instruction.bits1 in brw_structs.h) to select
* dst and shared-src types.
*/
enum hw_3src_reg_type {
GEN7_3SRC_TYPE_F = 0,
GEN7_3SRC_TYPE_D = 1,
GEN7_3SRC_TYPE_UD = 2,
GEN7_3SRC_TYPE_DF = 3,
};
static const enum hw_3src_reg_type gen7_3src_type[] = {
[0 ... BRW_REGISTER_TYPE_LAST] = INVALID,
[BRW_REGISTER_TYPE_F] = GEN7_3SRC_TYPE_F,
[BRW_REGISTER_TYPE_D] = GEN7_3SRC_TYPE_D,
[BRW_REGISTER_TYPE_UD] = GEN7_3SRC_TYPE_UD,
[BRW_REGISTER_TYPE_DF] = GEN7_3SRC_TYPE_DF,
};
/**
* Convert a brw_reg_type enumeration value into the hardware representation.
*
@ -125,6 +146,35 @@ brw_hw_type_to_reg_type(const struct gen_device_info *devinfo,
unreachable("not reached");
}
/**
* Convert a brw_reg_type enumeration value into the hardware representation
* for a 3-src instruction
*/
unsigned
brw_reg_type_to_hw_3src_type(const struct gen_device_info *devinfo,
enum brw_reg_type type)
{
assert(type < ARRAY_SIZE(gen7_3src_type));
assert(gen7_3src_type[type] != -1);
return gen7_3src_type[type];
}
/**
* Convert the hardware representation for a 3-src instruction into a
* brw_reg_type enumeration value.
*/
enum brw_reg_type
brw_hw_3src_type_to_reg_type(const struct gen_device_info *devinfo,
unsigned hw_type)
{
for (enum brw_reg_type i = 0; i <= BRW_REGISTER_TYPE_LAST; i++) {
if (gen7_3src_type[i] == hw_type) {
return i;
}
}
unreachable("not reached");
}
/**
* Return the element size given a register type.
*/

View File

@ -88,6 +88,14 @@ enum brw_reg_type ATTRIBUTE_PURE
brw_hw_type_to_reg_type(const struct gen_device_info *devinfo,
enum brw_reg_file file, unsigned hw_type);
unsigned
brw_reg_type_to_hw_3src_type(const struct gen_device_info *devinfo,
enum brw_reg_type type);
enum brw_reg_type
brw_hw_3src_type_to_reg_type(const struct gen_device_info *devinfo,
unsigned hw_type);
unsigned
brw_reg_type_to_size(enum brw_reg_type type);