---
 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

Reply via email to