--- src/glsl/opt_minmax.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/src/glsl/opt_minmax.cpp b/src/glsl/opt_minmax.cpp index 466db8c..96b1e07 100644 --- a/src/glsl/opt_minmax.cpp +++ b/src/glsl/opt_minmax.cpp @@ -301,6 +301,30 @@ get_range(ir_rvalue *rval) high = neg(r0.low)->constant_expression_value(); return minmax_range(low, high); + case ir_unop_rcp: + r0 = get_range(expr->operands[0]); + if (is_greater_than_zero(r0.low)) { + ir_expression *h = new(mem_ctx) ir_expression(ir_unop_rcp, r0.low); + high = h->constant_expression_value(); + if (r0.high) { + ir_expression *l = new(mem_ctx) ir_expression(ir_unop_rcp, r0.high); + low = l->constant_expression_value(); + } + } + if (is_less_than_zero(r0.low) && is_less_than_zero(r0.high)) { + ir_expression *h = new(mem_ctx) ir_expression(ir_unop_rcp, r0.low); + high = h->constant_expression_value(); + ir_expression *l = new(mem_ctx) ir_expression(ir_unop_rcp, r0.high); + low = l->constant_expression_value(); + } + if (is_less_than_zero(r0.low) && is_greater_than_zero(r0.high)) { + ir_expression *h = new(mem_ctx) ir_expression(ir_unop_rcp, r0.high); + high = h->constant_expression_value(); + ir_expression *l = new(mem_ctx) ir_expression(ir_unop_rcp, r0.low); + low = l->constant_expression_value(); + } + return minmax_range(low, high); + case ir_unop_sqrt: case ir_unop_rsq: case ir_unop_exp: -- 2.0.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev