summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2010-11-17 15:31:35 -0800
committerKenneth Graunke <[email protected]>2010-11-17 15:44:41 -0800
commit007f4881503b69055d65cfb20bd237673779786b (patch)
tree0bad86d646d9a0b473574039312cfa0181cfeab6
parent7ffd4e976fd11b8c083c2927effd25a2f79ac841 (diff)
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().
-rw-r--r--src/glsl/ir.cpp75
-rw-r--r--src/glsl/ir.h17
2 files changed, 21 insertions, 71 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index a7ebc0c2b66..4468d9f8324 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 38ed2b23efb..3fc834906a3 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 {