Mesa (master): glsl: Recognize open-coded pow(x, y).

Matt Turner mattst88 at kemper.freedesktop.org
Sat Sep 27 19:18:05 UTC 2014


Module: Mesa
Branch: master
Commit: 5ccdc23a86978628449ace0058cd3697020b0c94
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5ccdc23a86978628449ace0058cd3697020b0c94

Author: Matt Turner <mattst88 at gmail.com>
Date:   Sun Sep  7 00:41:41 2014 -0700

glsl: Recognize open-coded pow(x, y).

pow(x, y) is equivalent to exp(log(x) * y).

instructions in affected programs:     578 -> 458 (-20.76%)

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/glsl/opt_algebraic.cpp |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index 447618f..0cdb8ec 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -357,6 +357,20 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
       if (op_expr[0]->operation == ir_unop_log2) {
          return op_expr[0]->operands[0];
       }
+
+      if (!options->EmitNoPow && op_expr[0]->operation == ir_binop_mul) {
+         for (int log2_pos = 0; log2_pos < 2; log2_pos++) {
+            ir_expression *log2_expr =
+               op_expr[0]->operands[log2_pos]->as_expression();
+
+            if (log2_expr && log2_expr->operation == ir_unop_log2) {
+               return new(mem_ctx) ir_expression(ir_binop_pow,
+                                                 ir->type,
+                                                 log2_expr->operands[0],
+                                                 op_expr[0]->operands[1 - log2_pos]);
+            }
+         }
+      }
       break;
 
    case ir_unop_log2:




More information about the mesa-commit mailing list