From: Mark Janes Date: Fri, 7 Aug 2020 20:11:08 +0000 (-0700) Subject: intel/fs: work around gen12 lower-precision source modifier limitation X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=commitdiff_plain;h=cf52b40fb0bf53816ca4bb90e31ecd146fbcb533 intel/fs: work around gen12 lower-precision source modifier limitation GEN:BUG:1604601757 prevents source modifiers for multiplication of lower precision integers. lower_mul_dword_inst() splits 32x32 multiplication into 32x16, and needs to eliminate source modifiers in this case. Closes: #3329 Reviewed-by: Francisco Jerez --- diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index a89c53ea5a5..dbf7391baef 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -3930,7 +3930,20 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block) high.offset = inst->dst.offset % REG_SIZE; if (devinfo->gen >= 7) { - if (inst->src[1].abs) + /* From GEN:BUG:1604601757: + * + * "When multiplying a DW and any lower precision integer, source modifier + * is not supported." + * + * An unsupported negate modifier on src[1] would ordinarily be + * lowered by the subsequent lower_regioning pass. In this case that + * pass would spawn another dword multiply. Instead, lower the + * modifier first. + */ + const bool source_mods_unsupported = (devinfo->gen >= 12); + + if (inst->src[1].abs || (inst->src[1].negate && + source_mods_unsupported)) lower_src_modifiers(this, block, inst, 1); if (inst->src[1].file == IMM) {