From fd349d29e43fa9c2227cbf649282810782ecf555 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Fri, 20 Jan 2017 13:35:31 -0800 Subject: [PATCH] i965: Handle IVB DF differences in the validator. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/intel/compiler/brw_eu_validate.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/intel/compiler/brw_eu_validate.c b/src/intel/compiler/brw_eu_validate.c index 64615af44ac..f231ea038b4 100644 --- a/src/intel/compiler/brw_eu_validate.c +++ b/src/intel/compiler/brw_eu_validate.c @@ -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); 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) { ERROR_IF(dst_stride * dst_type_size != exec_type_size, "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 + /* 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. */ ERROR_IF(exec_size < width, "ExecSize must be greater than or equal " "to Width"); @@ -792,6 +808,14 @@ region_alignment_rules(const struct gen_device_info *devinfo, if (error_msg.str) 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, exec_size == 1 ? 0 : exec_size * stride, exec_size == 1 ? 1 : exec_size, -- 2.30.2