Mesa (master): i965/fs: Add fs_reg::is_zero() and is_one(); use for opt_algebraic().

Eric Anholt anholt at kemper.freedesktop.org
Fri Nov 30 21:21:30 UTC 2012


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Sat Nov 17 15:10:53 2012 -0800

i965/fs: Add fs_reg::is_zero() and is_one(); use for opt_algebraic().

These helper macros save you from writing nasty expressions like:

   if ((inst->src[1].type == BRW_REGISTER_TYPE_F &&
         inst->src[1].imm.f == 1.0) ||
        ((inst->src[1].type == BRW_REGISTER_TYPE_D ||
          inst->src[1].type == BRW_REGISTER_TYPE_UD) &&
         inst->src[1].imm.u == 1)) {

Instead, you simply get to write inst->src[1].is_one().  Simple.
Also, this makes the FS backend match the VS backend (which has these).

This patch also converts opt_algebraic to use the new helper functions.
As a consequence, it will now also optimize integer-typed expressions.

Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/mesa/drivers/dri/i965/brw_fs.cpp |   29 ++++++++++++++++++++++-------
 src/mesa/drivers/dri/i965/brw_fs.h   |    2 ++
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index cc5a790..ee3b7fd 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -353,6 +353,24 @@ fs_reg::equals(const fs_reg &r) const
            imm.u == r.imm.u);
 }
 
+bool
+fs_reg::is_zero() const
+{
+   if (file != IMM)
+      return false;
+
+   return type == BRW_REGISTER_TYPE_F ? imm.f == 0.0 : imm.i == 0;
+}
+
+bool
+fs_reg::is_one() const
+{
+   if (file != IMM)
+      return false;
+
+   return type == BRW_REGISTER_TYPE_F ? imm.f == 1.0 : imm.i == 1;
+}
+
 int
 fs_visitor::type_size(const struct glsl_type *type)
 {
@@ -1430,8 +1448,7 @@ fs_visitor::opt_algebraic()
 	    continue;
 
 	 /* a * 1.0 = a */
-	 if (inst->src[1].type == BRW_REGISTER_TYPE_F &&
-	     inst->src[1].imm.f == 1.0) {
+	 if (inst->src[1].is_one()) {
 	    inst->opcode = BRW_OPCODE_MOV;
 	    inst->src[1] = reg_undef;
 	    progress = true;
@@ -1439,10 +1456,9 @@ fs_visitor::opt_algebraic()
 	 }
 
          /* a * 0.0 = 0.0 */
-         if (inst->src[1].type == BRW_REGISTER_TYPE_F &&
-             inst->src[1].imm.f == 0.0) {
+         if (inst->src[1].is_zero()) {
             inst->opcode = BRW_OPCODE_MOV;
-            inst->src[0] = fs_reg(0.0f);
+            inst->src[0] = inst->src[1];
             inst->src[1] = reg_undef;
             progress = true;
             break;
@@ -1454,8 +1470,7 @@ fs_visitor::opt_algebraic()
             continue;
 
          /* a + 0.0 = a */
-         if (inst->src[1].type == BRW_REGISTER_TYPE_F &&
-             inst->src[1].imm.f == 0.0) {
+         if (inst->src[1].is_zero()) {
             inst->opcode = BRW_OPCODE_MOV;
             inst->src[1] = reg_undef;
             progress = true;
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index a0ed743..86c33bc 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -91,6 +91,8 @@ public:
    fs_reg(class fs_visitor *v, const struct glsl_type *type);
 
    bool equals(const fs_reg &r) const;
+   bool is_zero() const;
+   bool is_one() const;
 
    /** Register file: ARF, GRF, MRF, IMM. */
    enum register_file file;




More information about the mesa-commit mailing list