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)
|
||||
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)
|
||||
|
Reference in New Issue
Block a user