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 "
}
#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");
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,