glsl: Refactor get_num_operands.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 17 Nov 2010 23:31:35 +0000 (15:31 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 17 Nov 2010 23:44:41 +0000 (15:44 -0800)
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
src/glsl/ir.h

index a7ebc0c2b66557a98fe1730a7560a355a936a10a..4468d9f832411adac293c8d39acc29ffb64e2b85 100644 (file)
@@ -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[] = {
index 38ed2b23efbad70abb7e3eba18c3754ab847579c..3fc834906a3e2c7ebf4d1c3fe50933fb49c571d6 100644 (file)
@@ -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 {