Mesa (master): glsl: Refactor get_num_operands.

Kenneth Graunke kwg at kemper.freedesktop.org
Wed Nov 17 23:46:41 UTC 2010


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Wed Nov 17 15:31:35 2010 -0800

glsl: Refactor get_num_operands.

This adds sentinel values to the ir_expression_operation enum type:
ir_last_unop, ir_last_binop, and ir_last_opcode.  They are set to the
previous one so they don't trigger "unhandled case in switch statement"
warnings, but should never be handled directly.

This allows us to remove the huge array of 1s and 2s in
ir_expression::get_num_operands().

---

 src/glsl/ir.cpp |   79 +++++--------------------------------------------------
 src/glsl/ir.h   |   17 +++++++++++-
 2 files changed, 23 insertions(+), 73 deletions(-)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index a7ebc0c..4468d9f 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -189,78 +189,13 @@ ir_expression::ir_expression(int op, const struct glsl_type *type,
 unsigned int
 ir_expression::get_num_operands(ir_expression_operation op)
 {
-/* Update ir_print_visitor.cpp when updating this list. */
-   const int num_operands[] = {
-      1, /* ir_unop_bit_not */
-      1, /* ir_unop_logic_not */
-      1, /* ir_unop_neg */
-      1, /* ir_unop_abs */
-      1, /* ir_unop_sign */
-      1, /* ir_unop_rcp */
-      1, /* ir_unop_rsq */
-      1, /* ir_unop_sqrt */
-      1, /* ir_unop_exp */
-      1, /* ir_unop_log */
-      1, /* ir_unop_exp2 */
-      1, /* ir_unop_log2 */
-      1, /* ir_unop_f2i */
-      1, /* ir_unop_i2f */
-      1, /* ir_unop_f2b */
-      1, /* ir_unop_b2f */
-      1, /* ir_unop_i2b */
-      1, /* ir_unop_b2i */
-      1, /* ir_unop_u2f */
-      1, /* ir_unop_any */
-
-      1, /* ir_unop_trunc */
-      1, /* ir_unop_ceil */
-      1, /* ir_unop_floor */
-      1, /* ir_unop_fract */
-      1, /* ir_unop_round_even */
-
-      1, /* ir_unop_sin */
-      1, /* ir_unop_cos */
-
-      1, /* ir_unop_dFdx */
-      1, /* ir_unop_dFdy */
-
-      1, /* ir_unop_noise */
-
-      2, /* ir_binop_add */
-      2, /* ir_binop_sub */
-      2, /* ir_binop_mul */
-      2, /* ir_binop_div */
-      2, /* ir_binop_mod */
-
-      2, /* ir_binop_less */
-      2, /* ir_binop_greater */
-      2, /* ir_binop_lequal */
-      2, /* ir_binop_gequal */
-      2, /* ir_binop_equal */
-      2, /* ir_binop_nequal */
-      2, /* ir_binop_all_equal */
-      2, /* ir_binop_any_nequal */
-
-      2, /* ir_binop_lshift */
-      2, /* ir_binop_rshift */
-      2, /* ir_binop_bit_and */
-      2, /* ir_binop_bit_xor */
-      2, /* ir_binop_bit_or */
-
-      2, /* ir_binop_logic_and */
-      2, /* ir_binop_logic_xor */
-      2, /* ir_binop_logic_or */
-
-      2, /* ir_binop_dot */
-      2, /* ir_binop_min */
-      2, /* ir_binop_max */
-
-      2, /* ir_binop_pow */
-   };
+   assert(op <= ir_last_opcode);
 
-   assert(sizeof(num_operands) / sizeof(num_operands[0]) == ir_binop_pow + 1);
+   if (op <= ir_last_unop)
+      return 1;
 
-   return num_operands[op];
+   if (op <= ir_last_binop)
+      return 2;
 }
 
 static const char *const operator_strs[] = {
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 38ed2b2..3fc8349 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -717,6 +717,11 @@ enum ir_expression_operation {
 
    ir_unop_noise,
 
+   /**
+    * A sentinel marking the last of the unary operations.
+    */
+   ir_last_unop = ir_unop_noise,
+
    ir_binop_add,
    ir_binop_sub,
    ir_binop_mul,
@@ -774,7 +779,17 @@ enum ir_expression_operation {
    ir_binop_min,
    ir_binop_max,
 
-   ir_binop_pow
+   ir_binop_pow,
+
+   /**
+    * A sentinel marking the last of the binary operations.
+    */
+   ir_last_binop = ir_binop_pow,
+
+   /**
+    * A sentinel marking the last of all operations.
+    */
+   ir_last_opcode = ir_last_binop
 };
 
 class ir_expression : public ir_rvalue {




More information about the mesa-commit mailing list