diff options
author | Mark Janes <markjanes@swizzler.org> | 2020-08-07 13:11:08 -0700 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2020-08-10 13:30:45 -0700 |
commit | cf52b40fb0bf53816ca4bb90e31ecd146fbcb533 (patch) | |
tree | b9eb069edfda5c72a9cd376bf1b717a2442a0a9f | |
parent | ee06e47c5b1d7e5132435ba4ed7be5a2b16bc77e (diff) |
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 <currojerez@riseup.net>
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
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) { |