intel/fs: Handle OR source modifiers in algebraic optimization

Found by inspection.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Ian Romanick
2018-12-12 18:14:34 -08:00
parent c9d5bd050c
commit fb3ca9109c
+10 -1
View File
@@ -2596,7 +2596,16 @@ fs_visitor::opt_algebraic()
case BRW_OPCODE_OR:
if (inst->src[0].equals(inst->src[1]) ||
inst->src[1].is_zero()) {
inst->opcode = BRW_OPCODE_MOV;
/* On Gen8+, the OR instruction can have a source modifier that
* performs logical not on the operand. Cases of 'OR r0, ~r1, 0'
* or 'OR r0, ~r1, ~r1' should become a NOT instead of a MOV.
*/
if (inst->src[0].negate) {
inst->opcode = BRW_OPCODE_NOT;
inst->src[0].negate = false;
} else {
inst->opcode = BRW_OPCODE_MOV;
}
inst->src[1] = reg_undef;
progress = true;
break;