intel/compiler: Don't propagate cmod into integer multiplies
No shader-db change on Sky Lake. Reviewed-by: Matt Turner <mattst88@gmail.com> Cc: mesa-stable@lists.freedesktop.org
This commit is contained in:
@@ -150,6 +150,23 @@ opt_cmod_propagation_local(const gen_device_info *devinfo, bblock_t *block)
|
|||||||
if (scan_inst->saturate)
|
if (scan_inst->saturate)
|
||||||
break;
|
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. */
|
/* Otherwise, try propagating the conditional. */
|
||||||
enum brw_conditional_mod cond =
|
enum brw_conditional_mod cond =
|
||||||
inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
|
inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
|
||||||
|
@@ -137,6 +137,23 @@ opt_cmod_propagation_local(bblock_t *block)
|
|||||||
if (scan_inst->saturate)
|
if (scan_inst->saturate)
|
||||||
break;
|
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. */
|
/* Otherwise, try propagating the conditional. */
|
||||||
enum brw_conditional_mod cond =
|
enum brw_conditional_mod cond =
|
||||||
inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
|
inst->src[0].negate ? brw_swap_cmod(inst->conditional_mod)
|
||||||
|
Reference in New Issue
Block a user