glsl: Transform pow(x, 4) into (x*x)*(x*x).
Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
18f44d3030
commit
9b577d5702
|
@ -98,6 +98,12 @@ is_vec_two(ir_constant *ir)
|
|||
return (ir == NULL) ? false : ir->is_value(2.0, 2);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
is_vec_four(ir_constant *ir)
|
||||
{
|
||||
return (ir == NULL) ? false : ir->is_value(4.0, 4);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
is_vec_negative_one(ir_constant *ir)
|
||||
{
|
||||
|
@ -774,6 +780,20 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
|||
return mul(x, x);
|
||||
}
|
||||
|
||||
if (is_vec_four(op_const[1])) {
|
||||
ir_variable *x = new(ir) ir_variable(ir->operands[1]->type, "x",
|
||||
ir_var_temporary);
|
||||
base_ir->insert_before(x);
|
||||
base_ir->insert_before(assign(x, ir->operands[0]));
|
||||
|
||||
ir_variable *squared = new(ir) ir_variable(ir->operands[1]->type,
|
||||
"squared",
|
||||
ir_var_temporary);
|
||||
base_ir->insert_before(squared);
|
||||
base_ir->insert_before(assign(squared, mul(x, x)));
|
||||
return mul(squared, squared);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ir_binop_min:
|
||||
|
|
Loading…
Reference in New Issue