Mesa (master): intel/compiler: Don' t propagate cmod into integer multiplies

Jason Ekstrand jekstrand at kemper.freedesktop.org
Thu Oct 5 18:55:05 UTC 2017


Module: Mesa
Branch: master
Commit: 7463d5058009d1e9d9d01292f894271a26a062b8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7463d5058009d1e9d9d01292f894271a26a062b8

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Wed Oct  4 13:20:52 2017 -0700

intel/compiler: Don't propagate cmod into integer multiplies

No shader-db change on Sky Lake.

Reviewed-by: Matt Turner <mattst88 at gmail.com>
Cc: mesa-stable at lists.freedesktop.org

---

 src/intel/compiler/brw_fs_cmod_propagation.cpp   | 17 +++++++++++++++++
 src/intel/compiler/brw_vec4_cmod_propagation.cpp | 17 +++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/src/intel/compiler/brw_fs_cmod_propagation.cpp b/src/intel/compiler/brw_fs_cmod_propagation.cpp
index db63e942b7..4625d69f89 100644
--- a/src/intel/compiler/brw_fs_cmod_propagation.cpp
+++ b/src/intel/compiler/brw_fs_cmod_propagation.cpp
@@ -150,6 +150,23 @@ opt_cmod_propagation_local(const gen_device_info *devinfo, bblock_t *block)
             if (scan_inst->saturate)
                break;
 
+            /* From the Sky Lake PRM, Vol 2a, "Multiply":
+             *
+             *    "When multiplying integer data types, if one of the sources
+             *     is a DW, the resulting full precision data is stored in
+             *     the accumulator. However, if the destination data type is
+             *     either W or DW, the low bits of the result are written to
+             *     the destination register and the remaining high bits are
+             *     discarded. This results in undefined Overflow and Sign
+             *     flags. Therefore, conditional modifiers and saturation
+             *     (.sat) cannot be used in this case."
+             *
+             * We just disallow cmod propagation on all integer multiplies.
+             */
+            if (!brw_reg_type_is_floating_point(scan_inst->dst.type) &&
+                scan_inst->opcode == BRW_OPCODE_MUL)
+               break;
+
             /* Otherwise, try propagating the conditional. */
             enum brw_conditional_mod cond =
                inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
diff --git a/src/intel/compiler/brw_vec4_cmod_propagation.cpp b/src/intel/compiler/brw_vec4_cmod_propagation.cpp
index 05e6516819..0d72d82a57 100644
--- a/src/intel/compiler/brw_vec4_cmod_propagation.cpp
+++ b/src/intel/compiler/brw_vec4_cmod_propagation.cpp
@@ -137,6 +137,23 @@ opt_cmod_propagation_local(bblock_t *block)
             if (scan_inst->saturate)
                break;
 
+            /* From the Sky Lake PRM, Vol 2a, "Multiply":
+             *
+             *    "When multiplying integer data types, if one of the sources
+             *    is a DW, the resulting full precision data is stored in
+             *    the accumulator. However, if the destination data type is
+             *    either W or DW, the low bits of the result are written to
+             *    the destination register and the remaining high bits are
+             *    discarded. This results in undefined Overflow and Sign
+             *    flags. Therefore, conditional modifiers and saturation
+             *    (.sat) cannot be used in this case.
+             *
+             * We just disallow cmod propagation on all integer multiplies.
+             */
+            if (!brw_reg_type_is_floating_point(scan_inst->dst.type) &&
+                scan_inst->opcode == BRW_OPCODE_MUL)
+               break;
+
             /* Otherwise, try propagating the conditional. */
             enum brw_conditional_mod cond =
                inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)




More information about the mesa-commit mailing list