i965/vec4: Emit MADs from (x + abs(y * z)).
Same as commit 3654b6d4
to the fs backend.
total instructions in shared programs: 5945788 -> 5945787 (-0.00%)
instructions in affected programs: 36 -> 35 (-2.78%)
helped: 1
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
3d581f9996
commit
fff0b2eab5
|
@ -1161,8 +1161,11 @@ vec4_visitor::try_emit_mad(ir_expression *ir)
|
|||
ir_rvalue *nonmul = ir->operands[1];
|
||||
ir_expression *mul = ir->operands[0]->as_expression();
|
||||
|
||||
bool mul_negate = false;
|
||||
if (mul && mul->operation == ir_unop_neg) {
|
||||
bool mul_negate = false, mul_abs = false;
|
||||
if (mul && mul->operation == ir_unop_abs) {
|
||||
mul = mul->operands[0]->as_expression();
|
||||
mul_abs = true;
|
||||
} else if (mul && mul->operation == ir_unop_neg) {
|
||||
mul = mul->operands[0]->as_expression();
|
||||
mul_negate = true;
|
||||
}
|
||||
|
@ -1171,7 +1174,10 @@ vec4_visitor::try_emit_mad(ir_expression *ir)
|
|||
nonmul = ir->operands[0];
|
||||
mul = ir->operands[1]->as_expression();
|
||||
|
||||
if (mul && mul->operation == ir_unop_neg) {
|
||||
if (mul && mul->operation == ir_unop_abs) {
|
||||
mul = mul->operands[0]->as_expression();
|
||||
mul_abs = true;
|
||||
} else if (mul && mul->operation == ir_unop_neg) {
|
||||
mul = mul->operands[0]->as_expression();
|
||||
mul_negate = true;
|
||||
}
|
||||
|
@ -1186,9 +1192,15 @@ vec4_visitor::try_emit_mad(ir_expression *ir)
|
|||
mul->operands[0]->accept(this);
|
||||
src_reg src1 = fix_3src_operand(this->result);
|
||||
src1.negate ^= mul_negate;
|
||||
src1.abs = mul_abs;
|
||||
if (mul_abs)
|
||||
src1.negate = false;
|
||||
|
||||
mul->operands[1]->accept(this);
|
||||
src_reg src2 = fix_3src_operand(this->result);
|
||||
src2.abs = mul_abs;
|
||||
if (mul_abs)
|
||||
src2.negate = false;
|
||||
|
||||
this->result = src_reg(this, ir->type);
|
||||
emit(BRW_OPCODE_MAD, dst_reg(this->result), src0, src1, src2);
|
||||
|
|
Loading…
Reference in New Issue