i965: Handle IVB DF differences in the validator.
authorMatt Turner <mattst88@gmail.com>
Fri, 20 Jan 2017 21:35:31 +0000 (13:35 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 14 Apr 2017 21:56:07 +0000 (14:56 -0700)
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>
src/intel/compiler/brw_eu_validate.c

index 64615af44ac95d468769e77dfc952f8d015b95d5..f231ea038b4aa5861286b0c2ee680237a3fed950 100644 (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);
    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,