i965: Handle IVB DF differences in the validator.

On IVB/BYT, region parameters and execution size for DF are in terms of
32-bit elements, so they are doubled. For evaluating the validity of an
instruction, we halve them.

v2 (Sam):
- Add comments.

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
This commit is contained in:
Matt Turner
2017-01-20 13:35:31 -08:00
committed by Francisco Jerez
parent fbac8b1f94
commit fd349d29e4

View File

@@ -467,6 +467,14 @@ general_restrictions_based_on_operand_types(const struct gen_device_info *devinf
brw_hw_reg_type_to_size(devinfo, exec_type, BRW_GENERAL_REGISTER_FILE); brw_hw_reg_type_to_size(devinfo, exec_type, BRW_GENERAL_REGISTER_FILE);
unsigned dst_type_size = brw_element_size(devinfo, inst, dst); unsigned dst_type_size = brw_element_size(devinfo, inst, dst);
/* On IVB/BYT, region parameters and execution size for DF are in terms of
* 32-bit elements, so they are doubled. For evaluating the validity of an
* instruction, we halve them.
*/
if (devinfo->gen == 7 && !devinfo->is_haswell &&
exec_type_size == 8 && dst_type_size == 4)
dst_type_size = 8;
if (exec_type_size > dst_type_size) { if (exec_type_size > dst_type_size) {
ERROR_IF(dst_stride * dst_type_size != exec_type_size, ERROR_IF(dst_stride * dst_type_size != exec_type_size,
"Destination stride must be equal to the ratio of the sizes of " "Destination stride must be equal to the ratio of the sizes of "
@@ -576,6 +584,14 @@ general_restrictions_on_region_parameters(const struct gen_device_info *devinfo,
} }
#undef DO_SRC #undef DO_SRC
/* On IVB/BYT, region parameters and execution size for DF are in terms of
* 32-bit elements, so they are doubled. For evaluating the validity of an
* instruction, we halve them.
*/
if (devinfo->gen == 7 && !devinfo->is_haswell &&
element_size == 8)
element_size = 4;
/* ExecSize must be greater than or equal to Width. */ /* ExecSize must be greater than or equal to Width. */
ERROR_IF(exec_size < width, "ExecSize must be greater than or equal " ERROR_IF(exec_size < width, "ExecSize must be greater than or equal "
"to Width"); "to Width");
@@ -792,6 +808,14 @@ region_alignment_rules(const struct gen_device_info *devinfo,
if (error_msg.str) if (error_msg.str)
return error_msg; return error_msg;
/* On IVB/BYT, region parameters and execution size for DF are in terms of
* 32-bit elements, so they are doubled. For evaluating the validity of an
* instruction, we halve them.
*/
if (devinfo->gen == 7 && !devinfo->is_haswell &&
element_size == 8)
element_size = 4;
align1_access_mask(dst_access_mask, exec_size, element_size, subreg, align1_access_mask(dst_access_mask, exec_size, element_size, subreg,
exec_size == 1 ? 0 : exec_size * stride, exec_size == 1 ? 0 : exec_size * stride,
exec_size == 1 ? 1 : exec_size, exec_size == 1 ? 1 : exec_size,