glsl: lower sqrt(abs()) and inversesqrt(abs()) if requested
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
448f4c0c89
commit
737c734cd4
|
@ -53,6 +53,7 @@
|
|||
#define IMUL_HIGH_TO_MUL 0x80000
|
||||
#define DDIV_TO_MUL_RCP 0x100000
|
||||
#define DIV_TO_MUL_RCP (FDIV_TO_MUL_RCP | DDIV_TO_MUL_RCP)
|
||||
#define SQRT_TO_ABS_SQRT 0x200000
|
||||
|
||||
/* Opertaions for lower_64bit_integer_instructions() */
|
||||
#define MUL64 (1U << 0)
|
||||
|
|
|
@ -168,6 +168,7 @@ private:
|
|||
void find_lsb_to_float_cast(ir_expression *ir);
|
||||
void find_msb_to_float_cast(ir_expression *ir);
|
||||
void imul_high_to_mul(ir_expression *ir);
|
||||
void sqrt_to_abs_sqrt(ir_expression *ir);
|
||||
|
||||
ir_expression *_carry(operand a, operand b);
|
||||
};
|
||||
|
@ -1582,6 +1583,13 @@ lower_instructions_visitor::imul_high_to_mul(ir_expression *ir)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
lower_instructions_visitor::sqrt_to_abs_sqrt(ir_expression *ir)
|
||||
{
|
||||
ir->operands[0] = new(ir) ir_expression(ir_unop_abs, ir->operands[0]);
|
||||
this->progress = true;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
lower_instructions_visitor::visit_leave(ir_expression *ir)
|
||||
{
|
||||
|
@ -1719,6 +1727,12 @@ lower_instructions_visitor::visit_leave(ir_expression *ir)
|
|||
imul_high_to_mul(ir);
|
||||
break;
|
||||
|
||||
case ir_unop_rsq:
|
||||
case ir_unop_sqrt:
|
||||
if (lowering(SQRT_TO_ABS_SQRT))
|
||||
sqrt_to_abs_sqrt(ir);
|
||||
break;
|
||||
|
||||
default:
|
||||
return visit_continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue