glsl: add lowering for double divide to rcp/mul

It looks like no hw does div anyways, so we should just
lower at the GLSL level.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2015-02-09 16:53:10 +10:00
parent 0e82817247
commit 2e9f4eadfb
1 changed files with 4 additions and 3 deletions

View File

@ -199,7 +199,7 @@ lower_instructions_visitor::sub_to_add_neg(ir_expression *ir)
void void
lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir) lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir)
{ {
assert(ir->operands[1]->type->is_float()); assert(ir->operands[1]->type->is_float() || ir->operands[1]->type->is_double());
/* New expression for the 1.0 / op1 */ /* New expression for the 1.0 / op1 */
ir_rvalue *expr; ir_rvalue *expr;
@ -327,7 +327,7 @@ lower_instructions_visitor::mod_to_floor(ir_expression *ir)
/* Don't generate new IR that would need to be lowered in an additional /* Don't generate new IR that would need to be lowered in an additional
* pass. * pass.
*/ */
if (lowering(DIV_TO_MUL_RCP) && ir->type->is_float()) if (lowering(DIV_TO_MUL_RCP) && (ir->type->is_float() || ir->type->is_double()))
div_to_mul_rcp(div_expr); div_to_mul_rcp(div_expr);
ir_expression *const floor_expr = ir_expression *const floor_expr =
@ -1014,7 +1014,8 @@ lower_instructions_visitor::visit_leave(ir_expression *ir)
case ir_binop_div: case ir_binop_div:
if (ir->operands[1]->type->is_integer() && lowering(INT_DIV_TO_MUL_RCP)) if (ir->operands[1]->type->is_integer() && lowering(INT_DIV_TO_MUL_RCP))
int_div_to_mul_rcp(ir); int_div_to_mul_rcp(ir);
else if (ir->operands[1]->type->is_float() && lowering(DIV_TO_MUL_RCP)) else if ((ir->operands[1]->type->is_float() ||
ir->operands[1]->type->is_double()) && lowering(DIV_TO_MUL_RCP))
div_to_mul_rcp(ir); div_to_mul_rcp(ir);
break; break;